// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// 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  E0x12  : C0 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E0x123fooEv
  ~E0x12(); // tgen
  E0x12(); // tgen
};
//SIG(-1 E0x12) C1{ BC2{ BC3{ Fi} BC4{ Fi} Fi} BC5{ Fi} v1 Fi}


void  E0x12 ::foo(){vfunc_called(this, "_ZN5E0x123fooEv");}
E0x12 ::~E0x12(){ note_dtor("E0x12", this);} // tgen
E0x12 ::E0x12(){ note_ctor("E0x12", this);} // tgen

static void Test_E0x12()
{
  extern Class_Descriptor cd_E0x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E0x12, buf);
    E0x12 *dp, &lv = *(dp=new (buf) E0x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E0x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E0x12)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(8,4), "E0x12");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(12,8), "E0x12");
    check_base_class_offset(lv, (C0*), ABISELECT(8,4), "E0x12");
    check_base_class_offset(lv, (D0*), ABISELECT(20,16), "E0x12");
    check_field_offset(lv, fd, ABISELECT(24,20), "E0x12.fd");
    test_class_info(&lv, &cd_E0x12);
    dp->~E0x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE0x12(Test_E0x12, "E0x12", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E0x12C1Ev();
extern void _ZN5E0x12D1Ev();
Name_Map name_map_E0x12[] = {
  NSPAIR(_ZN5E0x12C1Ev),
  NSPAIR(_ZN5E0x12D1Ev),
  {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_E0x12[] = {
  // 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(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 _ZTI5E0x12[];
extern void _ZN5E0x123fooEv();
static  VTBL_ENTRY vtc_E0x12[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5E0x12[0]),
  (VTBL_ENTRY)&_ZN5E0x123fooEv,
};
extern VTBL_ENTRY _ZTI5E0x12[];
extern  VTBL_ENTRY _ZTV5E0x12[];
Class_Descriptor cd_E0x12 = {  "E0x12", // class name
  bases_E0x12, 4,
  &(vtc_E0x12[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E0x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E0x12),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  G0x12y0  : E0x12 , F1 {
  int ff;
  ~G0x12y0(); // tgen
  G0x12y0(); // tgen
};
//SIG(1 G0x12y0) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G0x12y0 ::~G0x12y0(){ note_dtor("G0x12y0", this);} // tgen
G0x12y0 ::G0x12y0(){ note_ctor("G0x12y0", this);} // tgen

static void Test_G0x12y0()
{
  extern Class_Descriptor cd_G0x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x12y0, buf);
    G0x12y0 *dp, &lv = *(dp=new (buf) G0x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x12y0)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x12*), ABISELECT(8,4), "G0x12y0");
    check_base_class_offset(lv, (B0*)(C0*)(E0x12*), ABISELECT(12,8), "G0x12y0");
    check_base_class_offset(lv, (C0*)(E0x12*), ABISELECT(8,4), "G0x12y0");
    check_base_class_offset(lv, (D0*)(E0x12*), ABISELECT(20,16), "G0x12y0");
    check_base_class_offset(lv, (E0x12*), 0, "G0x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(32,24), "G0x12y0");
    check_field_offset(lv, ff, ABISELECT(44,32), "G0x12y0.ff");
    test_class_info(&lv, &cd_G0x12y0);
    dp->~G0x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x12y0(Test_G0x12y0, "G0x12y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x12y0C1Ev();
extern void _ZN7G0x12y0D1Ev();
Name_Map name_map_G0x12y0[] = {
  NSPAIR(_ZN7G0x12y0C1Ev),
  NSPAIR(_ZN7G0x12y0D1Ev),
  {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_E0x12;
extern VTBL_ENTRY _ZTI5E0x12[];
extern  VTBL_ENTRY _ZTV5E0x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x12y0[] = {
  // 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_E0x12,    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_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
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G0x12y0[];
extern void _ZN5E0x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x12y0[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7G0x12y0[0]),
  (VTBL_ENTRY)&_ZN5E0x123fooEv,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G0x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTI7G0x12y0[];
extern  VTBL_ENTRY _ZTV7G0x12y0[];
Class_Descriptor cd_G0x12y0 = {  "G0x12y0", // class name
  bases_G0x12y0, 6,
  &(vtc_G0x12y0[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x12y0),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  G0x12y1  : virtual E0x12 , F1 {
  int ff;
  ~G0x12y1(); // tgen
  G0x12y1(); // tgen
};
//SIG(1 G0x12y1) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G0x12y1 ::~G0x12y1(){ note_dtor("G0x12y1", this);} // tgen
G0x12y1 ::G0x12y1(){ note_ctor("G0x12y1", this);} // tgen

static void Test_G0x12y1()
{
  extern Class_Descriptor cd_G0x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x12y1, buf);
    G0x12y1 *dp, &lv = *(dp=new (buf) G0x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x12y1)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x12*), ABISELECT(24,16), "G0x12y1");
    check_base_class_offset(lv, (B0*)(C0*)(E0x12*), ABISELECT(28,20), "G0x12y1");
    check_base_class_offset(lv, (C0*)(E0x12*), ABISELECT(24,16), "G0x12y1");
    check_base_class_offset(lv, (D0*)(E0x12*), ABISELECT(36,28), "G0x12y1");
    check_base_class_offset(lv, (E0x12*), ABISELECT(16,12), "G0x12y1");
    check_base_class_offset(lv, (F1*), 0, "G0x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x12y1.ff");
    test_class_info(&lv, &cd_G0x12y1);
    dp->~G0x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x12y1(Test_G0x12y1, "G0x12y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x12y1C1Ev();
extern void _ZN7G0x12y1D1Ev();
Name_Map name_map_G0x12y1[] = {
  NSPAIR(_ZN7G0x12y1C1Ev),
  NSPAIR(_ZN7G0x12y1D1Ev),
  {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_E0x12;
extern VTBL_ENTRY _ZTI5E0x12[];
extern  VTBL_ENTRY _ZTV5E0x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x12y1[] = {
  // 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(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_E0x12,    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_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 _ZTI7G0x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E0x123fooEv();
static  VTBL_ENTRY vtc_G0x12y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G0x12y1[0]),
  (VTBL_ENTRY)&_ZN5E0x123fooEv,
};
extern VTBL_ENTRY _ZTV7G0x12y1[];
static  VTT_ENTRY vtt_G0x12y1[] = {
  {&(_ZTV7G0x12y1[3]),  3,8},
  {&(_ZTV7G0x12y1[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G0x12y1[];
extern  VTBL_ENTRY _ZTV7G0x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x12y1[];
Class_Descriptor cd_G0x12y1 = {  "G0x12y1", // class name
  bases_G0x12y1, 6,
  &(vtc_G0x12y1[0]), // expected_vtbl_contents
  &(vtt_G0x12y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x12y1),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x12y1),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  G0x12y2  : E0x12 , virtual F1 {
  int ff;
  ~G0x12y2(); // tgen
  G0x12y2(); // tgen
};
//SIG(1 G0x12y2) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G0x12y2 ::~G0x12y2(){ note_dtor("G0x12y2", this);} // tgen
G0x12y2 ::G0x12y2(){ note_ctor("G0x12y2", this);} // tgen

static void Test_G0x12y2()
{
  extern Class_Descriptor cd_G0x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x12y2, buf);
    G0x12y2 *dp, &lv = *(dp=new (buf) G0x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x12y2)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x12*), ABISELECT(8,4), "G0x12y2");
    check_base_class_offset(lv, (B0*)(C0*)(E0x12*), ABISELECT(12,8), "G0x12y2");
    check_base_class_offset(lv, (C0*)(E0x12*), ABISELECT(8,4), "G0x12y2");
    check_base_class_offset(lv, (D0*)(E0x12*), ABISELECT(20,16), "G0x12y2");
    check_base_class_offset(lv, (E0x12*), 0, "G0x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G0x12y2");
    check_field_offset(lv, ff, ABISELECT(28,24), "G0x12y2.ff");
    test_class_info(&lv, &cd_G0x12y2);
    dp->~G0x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x12y2(Test_G0x12y2, "G0x12y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x12y2C1Ev();
extern void _ZN7G0x12y2D1Ev();
Name_Map name_map_G0x12y2[] = {
  NSPAIR(_ZN7G0x12y2C1Ev),
  NSPAIR(_ZN7G0x12y2D1Ev),
  {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_E0x12;
extern VTBL_ENTRY _ZTI5E0x12[];
extern  VTBL_ENTRY _ZTV5E0x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x12y2[] = {
  // 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_E0x12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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,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 _ZTI7G0x12y2[];
extern void _ZN5E0x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x12y2[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x12y2[0]),
  (VTBL_ENTRY)&_ZN5E0x123fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G0x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G0x12y2[];
static  VTT_ENTRY vtt_G0x12y2[] = {
  {&(_ZTV7G0x12y2[3]),  3,8},
  {&(_ZTV7G0x12y2[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G0x12y2[];
extern  VTBL_ENTRY _ZTV7G0x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x12y2[];
Class_Descriptor cd_G0x12y2 = {  "G0x12y2", // class name
  bases_G0x12y2, 6,
  &(vtc_G0x12y2[0]), // expected_vtbl_contents
  &(vtt_G0x12y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x12y2),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x12y2),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  G0x12y3  : virtual E0x12 , virtual F1 {
  int ff;
  ~G0x12y3(); // tgen
  G0x12y3(); // tgen
};
//SIG(1 G0x12y3) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G0x12y3 ::~G0x12y3(){ note_dtor("G0x12y3", this);} // tgen
G0x12y3 ::G0x12y3(){ note_ctor("G0x12y3", this);} // tgen

static void Test_G0x12y3()
{
  extern Class_Descriptor cd_G0x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G0x12y3, buf);
    G0x12y3 *dp, &lv = *(dp=new (buf) G0x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G0x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x12y3)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x12*), ABISELECT(24,12), "G0x12y3");
    check_base_class_offset(lv, (B0*)(C0*)(E0x12*), ABISELECT(28,16), "G0x12y3");
    check_base_class_offset(lv, (C0*)(E0x12*), ABISELECT(24,12), "G0x12y3");
    check_base_class_offset(lv, (D0*)(E0x12*), ABISELECT(36,24), "G0x12y3");
    check_base_class_offset(lv, (E0x12*), ABISELECT(16,8), "G0x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G0x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G0x12y3.ff");
    test_class_info(&lv, &cd_G0x12y3);
    dp->~G0x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x12y3(Test_G0x12y3, "G0x12y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G0x12y3C1Ev();
extern void _ZN7G0x12y3D1Ev();
Name_Map name_map_G0x12y3[] = {
  NSPAIR(_ZN7G0x12y3C1Ev),
  NSPAIR(_ZN7G0x12y3D1Ev),
  {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_E0x12;
extern VTBL_ENTRY _ZTI5E0x12[];
extern  VTBL_ENTRY _ZTV5E0x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x12y3[] = {
  // 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(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_E0x12,    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_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 _ZTI7G0x12y3[];
extern void _ZN5E0x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x12y3[] = {
  ABISELECT(48,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x12y3[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G0x12y3[0]),
  (VTBL_ENTRY)&_ZN5E0x123fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G0x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G0x12y3[];
static  VTT_ENTRY vtt_G0x12y3[] = {
  {&(_ZTV7G0x12y3[4]),  4,12},
  {&(_ZTV7G0x12y3[7]),  7,12},
  {&(_ZTV7G0x12y3[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G0x12y3[];
extern  VTBL_ENTRY _ZTV7G0x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x12y3[];
Class_Descriptor cd_G0x12y3 = {  "G0x12y3", // class name
  bases_G0x12y3, 6,
  &(vtc_G0x12y3[0]), // expected_vtbl_contents
  &(vtt_G0x12y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G0x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x12y3),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x12y3),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  G0x12y4  : E0x12 , F0 {
  int ff;
  ~G0x12y4(); // tgen
  G0x12y4(); // tgen
};
//SIG(1 G0x12y4) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G0x12y4 ::~G0x12y4(){ note_dtor("G0x12y4", this);} // tgen
G0x12y4 ::G0x12y4(){ note_ctor("G0x12y4", this);} // tgen

static void Test_G0x12y4()
{
  extern Class_Descriptor cd_G0x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G0x12y4, buf);
    G0x12y4 *dp, &lv = *(dp=new (buf) G0x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G0x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x12y4)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x12*), ABISELECT(8,4), "G0x12y4");
    check_base_class_offset(lv, (B0*)(C0*)(E0x12*), ABISELECT(12,8), "G0x12y4");
    check_base_class_offset(lv, (C0*)(E0x12*), ABISELECT(8,4), "G0x12y4");
    check_base_class_offset(lv, (D0*)(E0x12*), ABISELECT(20,16), "G0x12y4");
    check_base_class_offset(lv, (E0x12*), 0, "G0x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(28,24), "G0x12y4");
    check_field_offset(lv, ff, ABISELECT(32,28), "G0x12y4.ff");
    test_class_info(&lv, &cd_G0x12y4);
    dp->~G0x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x12y4(Test_G0x12y4, "G0x12y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G0x12y4C1Ev();
extern void _ZN7G0x12y4D1Ev();
Name_Map name_map_G0x12y4[] = {
  NSPAIR(_ZN7G0x12y4C1Ev),
  NSPAIR(_ZN7G0x12y4D1Ev),
  {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_E0x12;
extern VTBL_ENTRY _ZTI5E0x12[];
extern  VTBL_ENTRY _ZTV5E0x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x12y4[] = {
  // 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_E0x12,    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_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 _ZTI7G0x12y4[];
extern void _ZN5E0x123fooEv();
static  VTBL_ENTRY vtc_G0x12y4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7G0x12y4[0]),
  (VTBL_ENTRY)&_ZN5E0x123fooEv,
};
extern VTBL_ENTRY _ZTI7G0x12y4[];
extern  VTBL_ENTRY _ZTV7G0x12y4[];
Class_Descriptor cd_G0x12y4 = {  "G0x12y4", // class name
  bases_G0x12y4, 6,
  &(vtc_G0x12y4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G0x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x12y4),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  G0x12y5  : virtual E0x12 , F0 {
  int ff;
  ~G0x12y5(); // tgen
  G0x12y5(); // tgen
};
//SIG(1 G0x12y5) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G0x12y5 ::~G0x12y5(){ note_dtor("G0x12y5", this);} // tgen
G0x12y5 ::G0x12y5(){ note_ctor("G0x12y5", this);} // tgen

static void Test_G0x12y5()
{
  extern Class_Descriptor cd_G0x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x12y5, buf);
    G0x12y5 *dp, &lv = *(dp=new (buf) G0x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x12y5)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x12*), ABISELECT(24,16), "G0x12y5");
    check_base_class_offset(lv, (B0*)(C0*)(E0x12*), ABISELECT(28,20), "G0x12y5");
    check_base_class_offset(lv, (C0*)(E0x12*), ABISELECT(24,16), "G0x12y5");
    check_base_class_offset(lv, (D0*)(E0x12*), ABISELECT(36,28), "G0x12y5");
    check_base_class_offset(lv, (E0x12*), ABISELECT(16,12), "G0x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G0x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x12y5.ff");
    test_class_info(&lv, &cd_G0x12y5);
    dp->~G0x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x12y5(Test_G0x12y5, "G0x12y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x12y5C1Ev();
extern void _ZN7G0x12y5D1Ev();
Name_Map name_map_G0x12y5[] = {
  NSPAIR(_ZN7G0x12y5C1Ev),
  NSPAIR(_ZN7G0x12y5D1Ev),
  {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_E0x12;
extern VTBL_ENTRY _ZTI5E0x12[];
extern  VTBL_ENTRY _ZTV5E0x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x12y5[] = {
  // 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(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_E0x12,    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_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 _ZTI7G0x12y5[];
extern void _ZN5E0x123fooEv();
static  VTBL_ENTRY vtc_G0x12y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x12y5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G0x12y5[0]),
  (VTBL_ENTRY)&_ZN5E0x123fooEv,
};
extern VTBL_ENTRY _ZTV7G0x12y5[];
static  VTT_ENTRY vtt_G0x12y5[] = {
  {&(_ZTV7G0x12y5[3]),  3,7},
  {&(_ZTV7G0x12y5[6]),  6,7},
};
extern VTBL_ENTRY _ZTI7G0x12y5[];
extern  VTBL_ENTRY _ZTV7G0x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x12y5[];
Class_Descriptor cd_G0x12y5 = {  "G0x12y5", // class name
  bases_G0x12y5, 6,
  &(vtc_G0x12y5[0]), // expected_vtbl_contents
  &(vtt_G0x12y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x12y5),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x12y5),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  G0x12y6  : E0x12 , virtual F0 {
  int ff;
  ~G0x12y6(); // tgen
  G0x12y6(); // tgen
};
//SIG(1 G0x12y6) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G0x12y6 ::~G0x12y6(){ note_dtor("G0x12y6", this);} // tgen
G0x12y6 ::G0x12y6(){ note_ctor("G0x12y6", this);} // tgen

static void Test_G0x12y6()
{
  extern Class_Descriptor cd_G0x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G0x12y6, buf);
    G0x12y6 *dp, &lv = *(dp=new (buf) G0x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G0x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x12y6)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x12*), ABISELECT(8,4), "G0x12y6");
    check_base_class_offset(lv, (B0*)(C0*)(E0x12*), ABISELECT(12,8), "G0x12y6");
    check_base_class_offset(lv, (C0*)(E0x12*), ABISELECT(8,4), "G0x12y6");
    check_base_class_offset(lv, (D0*)(E0x12*), ABISELECT(20,16), "G0x12y6");
    check_base_class_offset(lv, (E0x12*), 0, "G0x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G0x12y6");
    check_field_offset(lv, ff, ABISELECT(28,24), "G0x12y6.ff");
    test_class_info(&lv, &cd_G0x12y6);
    dp->~G0x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x12y6(Test_G0x12y6, "G0x12y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G0x12y6C1Ev();
extern void _ZN7G0x12y6D1Ev();
Name_Map name_map_G0x12y6[] = {
  NSPAIR(_ZN7G0x12y6C1Ev),
  NSPAIR(_ZN7G0x12y6D1Ev),
  {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_E0x12;
extern VTBL_ENTRY _ZTI5E0x12[];
extern  VTBL_ENTRY _ZTV5E0x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x12y6[] = {
  // 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_E0x12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7G0x12y6[];
extern void _ZN5E0x123fooEv();
static  VTBL_ENTRY vtc_G0x12y6[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x12y6[0]),
  (VTBL_ENTRY)&_ZN5E0x123fooEv,
};
extern VTBL_ENTRY _ZTV7G0x12y6[];
static  VTT_ENTRY vtt_G0x12y6[] = {
  {&(_ZTV7G0x12y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G0x12y6[];
extern  VTBL_ENTRY _ZTV7G0x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x12y6[];
Class_Descriptor cd_G0x12y6 = {  "G0x12y6", // class name
  bases_G0x12y6, 6,
  &(vtc_G0x12y6[0]), // expected_vtbl_contents
  &(vtt_G0x12y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G0x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x12y6),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x12y6),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  G0x12y7  : virtual E0x12 , virtual F0 {
  int ff;
  ~G0x12y7(); // tgen
  G0x12y7(); // tgen
};
//SIG(1 G0x12y7) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G0x12y7 ::~G0x12y7(){ note_dtor("G0x12y7", this);} // tgen
G0x12y7 ::G0x12y7(){ note_ctor("G0x12y7", this);} // tgen

static void Test_G0x12y7()
{
  extern Class_Descriptor cd_G0x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x12y7, buf);
    G0x12y7 *dp, &lv = *(dp=new (buf) G0x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x12y7)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x12*), ABISELECT(24,12), "G0x12y7");
    check_base_class_offset(lv, (B0*)(C0*)(E0x12*), ABISELECT(28,16), "G0x12y7");
    check_base_class_offset(lv, (C0*)(E0x12*), ABISELECT(24,12), "G0x12y7");
    check_base_class_offset(lv, (D0*)(E0x12*), ABISELECT(36,24), "G0x12y7");
    check_base_class_offset(lv, (E0x12*), ABISELECT(16,8), "G0x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G0x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G0x12y7.ff");
    test_class_info(&lv, &cd_G0x12y7);
    dp->~G0x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x12y7(Test_G0x12y7, "G0x12y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x12y7C1Ev();
extern void _ZN7G0x12y7D1Ev();
Name_Map name_map_G0x12y7[] = {
  NSPAIR(_ZN7G0x12y7C1Ev),
  NSPAIR(_ZN7G0x12y7D1Ev),
  {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_E0x12;
extern VTBL_ENTRY _ZTI5E0x12[];
extern  VTBL_ENTRY _ZTV5E0x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x12y7[] = {
  // 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(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_E0x12,    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_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 _ZTI7G0x12y7[];
extern void _ZN5E0x123fooEv();
static  VTBL_ENTRY vtc_G0x12y7[] = {
  ABISELECT(44,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x12y7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G0x12y7[0]),
  (VTBL_ENTRY)&_ZN5E0x123fooEv,
};
extern VTBL_ENTRY _ZTV7G0x12y7[];
static  VTT_ENTRY vtt_G0x12y7[] = {
  {&(_ZTV7G0x12y7[4]),  4,8},
  {&(_ZTV7G0x12y7[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G0x12y7[];
extern  VTBL_ENTRY _ZTV7G0x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x12y7[];
Class_Descriptor cd_G0x12y7 = {  "G0x12y7", // class name
  bases_G0x12y7, 6,
  &(vtc_G0x12y7[0]), // expected_vtbl_contents
  &(vtt_G0x12y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x12y7),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x12y7),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  E1x12  : C1 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E1x123fooEv
  ~E1x12(); // tgen
  E1x12(); // tgen
};
//SIG(-1 E1x12) C1{ BC2{ BC3{ v1 Fi} BC4{ Fi} Fi} BC5{ Fi} v1 Fi}


void  E1x12 ::foo(){vfunc_called(this, "_ZN5E1x123fooEv");}
E1x12 ::~E1x12(){ note_dtor("E1x12", this);} // tgen
E1x12 ::E1x12(){ note_ctor("E1x12", this);} // tgen

static void Test_E1x12()
{
  extern Class_Descriptor cd_E1x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E1x12, buf);
    E1x12 *dp, &lv = *(dp=new (buf) E1x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E1x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E1x12)");
    check_base_class_offset(lv, (A1*)(C1*), 0, "E1x12");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(12,8), "E1x12");
    check_base_class_offset(lv, (C1*), 0, "E1x12");
    check_base_class_offset(lv, (D0*), ABISELECT(20,16), "E1x12");
    check_field_offset(lv, fd, ABISELECT(24,20), "E1x12.fd");
    test_class_info(&lv, &cd_E1x12);
    dp->~E1x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE1x12(Test_E1x12, "E1x12", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E1x12C1Ev();
extern void _ZN5E1x12D1Ev();
Name_Map name_map_E1x12[] = {
  NSPAIR(_ZN5E1x12C1Ev),
  NSPAIR(_ZN5E1x12D1Ev),
  {0,0}
};
extern Class_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_E1x12[] = {
  // 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(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 _ZTI5E1x12[];
extern void _ZN5E1x123fooEv();
static  VTBL_ENTRY vtc_E1x12[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5E1x12[0]),
  (VTBL_ENTRY)&_ZN5E1x123fooEv,
};
extern VTBL_ENTRY _ZTI5E1x12[];
extern  VTBL_ENTRY _ZTV5E1x12[];
Class_Descriptor cd_E1x12 = {  "E1x12", // class name
  bases_E1x12, 4,
  &(vtc_E1x12[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E1x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E1x12),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  G1x12y0  : E1x12 , F1 {
  int ff;
  ~G1x12y0(); // tgen
  G1x12y0(); // tgen
};
//SIG(1 G1x12y0) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G1x12y0 ::~G1x12y0(){ note_dtor("G1x12y0", this);} // tgen
G1x12y0 ::G1x12y0(){ note_ctor("G1x12y0", this);} // tgen

static void Test_G1x12y0()
{
  extern Class_Descriptor cd_G1x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x12y0, buf);
    G1x12y0 *dp, &lv = *(dp=new (buf) G1x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x12y0)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x12*), 0, "G1x12y0");
    check_base_class_offset(lv, (B0*)(C1*)(E1x12*), ABISELECT(12,8), "G1x12y0");
    check_base_class_offset(lv, (C1*)(E1x12*), 0, "G1x12y0");
    check_base_class_offset(lv, (D0*)(E1x12*), ABISELECT(20,16), "G1x12y0");
    check_base_class_offset(lv, (E1x12*), 0, "G1x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(32,24), "G1x12y0");
    check_field_offset(lv, ff, ABISELECT(44,32), "G1x12y0.ff");
    test_class_info(&lv, &cd_G1x12y0);
    dp->~G1x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x12y0(Test_G1x12y0, "G1x12y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G1x12y0C1Ev();
extern void _ZN7G1x12y0D1Ev();
Name_Map name_map_G1x12y0[] = {
  NSPAIR(_ZN7G1x12y0C1Ev),
  NSPAIR(_ZN7G1x12y0D1Ev),
  {0,0}
};
extern Class_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_E1x12;
extern VTBL_ENTRY _ZTI5E1x12[];
extern  VTBL_ENTRY _ZTV5E1x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x12y0[] = {
  // 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_E1x12,    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_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 _ZTI7G1x12y0[];
extern void _ZN5E1x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x12y0[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7G1x12y0[0]),
  (VTBL_ENTRY)&_ZN5E1x123fooEv,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G1x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTI7G1x12y0[];
extern  VTBL_ENTRY _ZTV7G1x12y0[];
Class_Descriptor cd_G1x12y0 = {  "G1x12y0", // class name
  bases_G1x12y0, 6,
  &(vtc_G1x12y0[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G1x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x12y0),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  G1x12y1  : virtual E1x12 , F1 {
  int ff;
  ~G1x12y1(); // tgen
  G1x12y1(); // tgen
};
//SIG(1 G1x12y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G1x12y1 ::~G1x12y1(){ note_dtor("G1x12y1", this);} // tgen
G1x12y1 ::G1x12y1(){ note_ctor("G1x12y1", this);} // tgen

static void Test_G1x12y1()
{
  extern Class_Descriptor cd_G1x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x12y1, buf);
    G1x12y1 *dp, &lv = *(dp=new (buf) G1x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x12y1)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x12*), ABISELECT(16,12), "G1x12y1");
    check_base_class_offset(lv, (B0*)(C1*)(E1x12*), ABISELECT(28,20), "G1x12y1");
    check_base_class_offset(lv, (C1*)(E1x12*), ABISELECT(16,12), "G1x12y1");
    check_base_class_offset(lv, (D0*)(E1x12*), ABISELECT(36,28), "G1x12y1");
    check_base_class_offset(lv, (E1x12*), ABISELECT(16,12), "G1x12y1");
    check_base_class_offset(lv, (F1*), 0, "G1x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x12y1.ff");
    test_class_info(&lv, &cd_G1x12y1);
    dp->~G1x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x12y1(Test_G1x12y1, "G1x12y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G1x12y1C1Ev();
extern void _ZN7G1x12y1D1Ev();
Name_Map name_map_G1x12y1[] = {
  NSPAIR(_ZN7G1x12y1C1Ev),
  NSPAIR(_ZN7G1x12y1D1Ev),
  {0,0}
};
extern Class_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_E1x12;
extern VTBL_ENTRY _ZTI5E1x12[];
extern  VTBL_ENTRY _ZTV5E1x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x12y1[] = {
  // 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(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_E1x12,    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
    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 _ZTI7G1x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E1x123fooEv();
static  VTBL_ENTRY vtc_G1x12y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G1x12y1[0]),
  (VTBL_ENTRY)&_ZN5E1x123fooEv,
};
extern VTBL_ENTRY _ZTV7G1x12y1[];
static  VTT_ENTRY vtt_G1x12y1[] = {
  {&(_ZTV7G1x12y1[3]),  3,8},
  {&(_ZTV7G1x12y1[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G1x12y1[];
extern  VTBL_ENTRY _ZTV7G1x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x12y1[];
Class_Descriptor cd_G1x12y1 = {  "G1x12y1", // class name
  bases_G1x12y1, 6,
  &(vtc_G1x12y1[0]), // expected_vtbl_contents
  &(vtt_G1x12y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G1x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x12y1),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x12y1),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  G1x12y2  : E1x12 , virtual F1 {
  int ff;
  ~G1x12y2(); // tgen
  G1x12y2(); // tgen
};
//SIG(1 G1x12y2) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G1x12y2 ::~G1x12y2(){ note_dtor("G1x12y2", this);} // tgen
G1x12y2 ::G1x12y2(){ note_ctor("G1x12y2", this);} // tgen

static void Test_G1x12y2()
{
  extern Class_Descriptor cd_G1x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x12y2, buf);
    G1x12y2 *dp, &lv = *(dp=new (buf) G1x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x12y2)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x12*), 0, "G1x12y2");
    check_base_class_offset(lv, (B0*)(C1*)(E1x12*), ABISELECT(12,8), "G1x12y2");
    check_base_class_offset(lv, (C1*)(E1x12*), 0, "G1x12y2");
    check_base_class_offset(lv, (D0*)(E1x12*), ABISELECT(20,16), "G1x12y2");
    check_base_class_offset(lv, (E1x12*), 0, "G1x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G1x12y2");
    check_field_offset(lv, ff, ABISELECT(28,24), "G1x12y2.ff");
    test_class_info(&lv, &cd_G1x12y2);
    dp->~G1x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x12y2(Test_G1x12y2, "G1x12y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G1x12y2C1Ev();
extern void _ZN7G1x12y2D1Ev();
Name_Map name_map_G1x12y2[] = {
  NSPAIR(_ZN7G1x12y2C1Ev),
  NSPAIR(_ZN7G1x12y2D1Ev),
  {0,0}
};
extern Class_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_E1x12;
extern VTBL_ENTRY _ZTI5E1x12[];
extern  VTBL_ENTRY _ZTV5E1x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x12y2[] = {
  // 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_E1x12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7G1x12y2[];
extern void _ZN5E1x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x12y2[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x12y2[0]),
  (VTBL_ENTRY)&_ZN5E1x123fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G1x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G1x12y2[];
static  VTT_ENTRY vtt_G1x12y2[] = {
  {&(_ZTV7G1x12y2[3]),  3,8},
  {&(_ZTV7G1x12y2[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G1x12y2[];
extern  VTBL_ENTRY _ZTV7G1x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x12y2[];
Class_Descriptor cd_G1x12y2 = {  "G1x12y2", // class name
  bases_G1x12y2, 6,
  &(vtc_G1x12y2[0]), // expected_vtbl_contents
  &(vtt_G1x12y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G1x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x12y2),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x12y2),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  G1x12y3  : virtual E1x12 , virtual F1 {
  int ff;
  ~G1x12y3(); // tgen
  G1x12y3(); // tgen
};
//SIG(1 G1x12y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G1x12y3 ::~G1x12y3(){ note_dtor("G1x12y3", this);} // tgen
G1x12y3 ::G1x12y3(){ note_ctor("G1x12y3", this);} // tgen

static void Test_G1x12y3()
{
  extern Class_Descriptor cd_G1x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G1x12y3, buf);
    G1x12y3 *dp, &lv = *(dp=new (buf) G1x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G1x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x12y3)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x12*), ABISELECT(16,8), "G1x12y3");
    check_base_class_offset(lv, (B0*)(C1*)(E1x12*), ABISELECT(28,16), "G1x12y3");
    check_base_class_offset(lv, (C1*)(E1x12*), ABISELECT(16,8), "G1x12y3");
    check_base_class_offset(lv, (D0*)(E1x12*), ABISELECT(36,24), "G1x12y3");
    check_base_class_offset(lv, (E1x12*), ABISELECT(16,8), "G1x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G1x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G1x12y3.ff");
    test_class_info(&lv, &cd_G1x12y3);
    dp->~G1x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x12y3(Test_G1x12y3, "G1x12y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G1x12y3C1Ev();
extern void _ZN7G1x12y3D1Ev();
Name_Map name_map_G1x12y3[] = {
  NSPAIR(_ZN7G1x12y3C1Ev),
  NSPAIR(_ZN7G1x12y3D1Ev),
  {0,0}
};
extern Class_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_E1x12;
extern VTBL_ENTRY _ZTI5E1x12[];
extern  VTBL_ENTRY _ZTV5E1x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x12y3[] = {
  // 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(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_E1x12,    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_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 _ZTI7G1x12y3[];
extern void _ZN5E1x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x12y3[] = {
  ABISELECT(48,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x12y3[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G1x12y3[0]),
  (VTBL_ENTRY)&_ZN5E1x123fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G1x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G1x12y3[];
static  VTT_ENTRY vtt_G1x12y3[] = {
  {&(_ZTV7G1x12y3[4]),  4,12},
  {&(_ZTV7G1x12y3[7]),  7,12},
  {&(_ZTV7G1x12y3[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G1x12y3[];
extern  VTBL_ENTRY _ZTV7G1x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x12y3[];
Class_Descriptor cd_G1x12y3 = {  "G1x12y3", // class name
  bases_G1x12y3, 6,
  &(vtc_G1x12y3[0]), // expected_vtbl_contents
  &(vtt_G1x12y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G1x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x12y3),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x12y3),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  G1x12y4  : E1x12 , F0 {
  int ff;
  ~G1x12y4(); // tgen
  G1x12y4(); // tgen
};
//SIG(1 G1x12y4) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G1x12y4 ::~G1x12y4(){ note_dtor("G1x12y4", this);} // tgen
G1x12y4 ::G1x12y4(){ note_ctor("G1x12y4", this);} // tgen

static void Test_G1x12y4()
{
  extern Class_Descriptor cd_G1x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G1x12y4, buf);
    G1x12y4 *dp, &lv = *(dp=new (buf) G1x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G1x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x12y4)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x12*), 0, "G1x12y4");
    check_base_class_offset(lv, (B0*)(C1*)(E1x12*), ABISELECT(12,8), "G1x12y4");
    check_base_class_offset(lv, (C1*)(E1x12*), 0, "G1x12y4");
    check_base_class_offset(lv, (D0*)(E1x12*), ABISELECT(20,16), "G1x12y4");
    check_base_class_offset(lv, (E1x12*), 0, "G1x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(28,24), "G1x12y4");
    check_field_offset(lv, ff, ABISELECT(32,28), "G1x12y4.ff");
    test_class_info(&lv, &cd_G1x12y4);
    dp->~G1x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x12y4(Test_G1x12y4, "G1x12y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G1x12y4C1Ev();
extern void _ZN7G1x12y4D1Ev();
Name_Map name_map_G1x12y4[] = {
  NSPAIR(_ZN7G1x12y4C1Ev),
  NSPAIR(_ZN7G1x12y4D1Ev),
  {0,0}
};
extern Class_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_E1x12;
extern VTBL_ENTRY _ZTI5E1x12[];
extern  VTBL_ENTRY _ZTV5E1x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x12y4[] = {
  // 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_E1x12,    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_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 _ZTI7G1x12y4[];
extern void _ZN5E1x123fooEv();
static  VTBL_ENTRY vtc_G1x12y4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7G1x12y4[0]),
  (VTBL_ENTRY)&_ZN5E1x123fooEv,
};
extern VTBL_ENTRY _ZTI7G1x12y4[];
extern  VTBL_ENTRY _ZTV7G1x12y4[];
Class_Descriptor cd_G1x12y4 = {  "G1x12y4", // class name
  bases_G1x12y4, 6,
  &(vtc_G1x12y4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G1x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x12y4),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  G1x12y5  : virtual E1x12 , F0 {
  int ff;
  ~G1x12y5(); // tgen
  G1x12y5(); // tgen
};
//SIG(1 G1x12y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G1x12y5 ::~G1x12y5(){ note_dtor("G1x12y5", this);} // tgen
G1x12y5 ::G1x12y5(){ note_ctor("G1x12y5", this);} // tgen

static void Test_G1x12y5()
{
  extern Class_Descriptor cd_G1x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x12y5, buf);
    G1x12y5 *dp, &lv = *(dp=new (buf) G1x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x12y5)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x12*), ABISELECT(16,12), "G1x12y5");
    check_base_class_offset(lv, (B0*)(C1*)(E1x12*), ABISELECT(28,20), "G1x12y5");
    check_base_class_offset(lv, (C1*)(E1x12*), ABISELECT(16,12), "G1x12y5");
    check_base_class_offset(lv, (D0*)(E1x12*), ABISELECT(36,28), "G1x12y5");
    check_base_class_offset(lv, (E1x12*), ABISELECT(16,12), "G1x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G1x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x12y5.ff");
    test_class_info(&lv, &cd_G1x12y5);
    dp->~G1x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x12y5(Test_G1x12y5, "G1x12y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G1x12y5C1Ev();
extern void _ZN7G1x12y5D1Ev();
Name_Map name_map_G1x12y5[] = {
  NSPAIR(_ZN7G1x12y5C1Ev),
  NSPAIR(_ZN7G1x12y5D1Ev),
  {0,0}
};
extern Class_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_E1x12;
extern VTBL_ENTRY _ZTI5E1x12[];
extern  VTBL_ENTRY _ZTV5E1x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x12y5[] = {
  // 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(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_E1x12,    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_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 _ZTI7G1x12y5[];
extern void _ZN5E1x123fooEv();
static  VTBL_ENTRY vtc_G1x12y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x12y5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G1x12y5[0]),
  (VTBL_ENTRY)&_ZN5E1x123fooEv,
};
extern VTBL_ENTRY _ZTV7G1x12y5[];
static  VTT_ENTRY vtt_G1x12y5[] = {
  {&(_ZTV7G1x12y5[3]),  3,7},
  {&(_ZTV7G1x12y5[6]),  6,7},
};
extern VTBL_ENTRY _ZTI7G1x12y5[];
extern  VTBL_ENTRY _ZTV7G1x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x12y5[];
Class_Descriptor cd_G1x12y5 = {  "G1x12y5", // class name
  bases_G1x12y5, 6,
  &(vtc_G1x12y5[0]), // expected_vtbl_contents
  &(vtt_G1x12y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G1x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x12y5),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x12y5),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  G1x12y6  : E1x12 , virtual F0 {
  int ff;
  ~G1x12y6(); // tgen
  G1x12y6(); // tgen
};
//SIG(1 G1x12y6) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G1x12y6 ::~G1x12y6(){ note_dtor("G1x12y6", this);} // tgen
G1x12y6 ::G1x12y6(){ note_ctor("G1x12y6", this);} // tgen

static void Test_G1x12y6()
{
  extern Class_Descriptor cd_G1x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G1x12y6, buf);
    G1x12y6 *dp, &lv = *(dp=new (buf) G1x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G1x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x12y6)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x12*), 0, "G1x12y6");
    check_base_class_offset(lv, (B0*)(C1*)(E1x12*), ABISELECT(12,8), "G1x12y6");
    check_base_class_offset(lv, (C1*)(E1x12*), 0, "G1x12y6");
    check_base_class_offset(lv, (D0*)(E1x12*), ABISELECT(20,16), "G1x12y6");
    check_base_class_offset(lv, (E1x12*), 0, "G1x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G1x12y6");
    check_field_offset(lv, ff, ABISELECT(28,24), "G1x12y6.ff");
    test_class_info(&lv, &cd_G1x12y6);
    dp->~G1x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x12y6(Test_G1x12y6, "G1x12y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G1x12y6C1Ev();
extern void _ZN7G1x12y6D1Ev();
Name_Map name_map_G1x12y6[] = {
  NSPAIR(_ZN7G1x12y6C1Ev),
  NSPAIR(_ZN7G1x12y6D1Ev),
  {0,0}
};
extern Class_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_E1x12;
extern VTBL_ENTRY _ZTI5E1x12[];
extern  VTBL_ENTRY _ZTV5E1x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x12y6[] = {
  // 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_E1x12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7G1x12y6[];
extern void _ZN5E1x123fooEv();
static  VTBL_ENTRY vtc_G1x12y6[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x12y6[0]),
  (VTBL_ENTRY)&_ZN5E1x123fooEv,
};
extern VTBL_ENTRY _ZTV7G1x12y6[];
static  VTT_ENTRY vtt_G1x12y6[] = {
  {&(_ZTV7G1x12y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G1x12y6[];
extern  VTBL_ENTRY _ZTV7G1x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x12y6[];
Class_Descriptor cd_G1x12y6 = {  "G1x12y6", // class name
  bases_G1x12y6, 6,
  &(vtc_G1x12y6[0]), // expected_vtbl_contents
  &(vtt_G1x12y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G1x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x12y6),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x12y6),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  G1x12y7  : virtual E1x12 , virtual F0 {
  int ff;
  ~G1x12y7(); // tgen
  G1x12y7(); // tgen
};
//SIG(1 G1x12y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G1x12y7 ::~G1x12y7(){ note_dtor("G1x12y7", this);} // tgen
G1x12y7 ::G1x12y7(){ note_ctor("G1x12y7", this);} // tgen

static void Test_G1x12y7()
{
  extern Class_Descriptor cd_G1x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x12y7, buf);
    G1x12y7 *dp, &lv = *(dp=new (buf) G1x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x12y7)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x12*), ABISELECT(16,8), "G1x12y7");
    check_base_class_offset(lv, (B0*)(C1*)(E1x12*), ABISELECT(28,16), "G1x12y7");
    check_base_class_offset(lv, (C1*)(E1x12*), ABISELECT(16,8), "G1x12y7");
    check_base_class_offset(lv, (D0*)(E1x12*), ABISELECT(36,24), "G1x12y7");
    check_base_class_offset(lv, (E1x12*), ABISELECT(16,8), "G1x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G1x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G1x12y7.ff");
    test_class_info(&lv, &cd_G1x12y7);
    dp->~G1x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x12y7(Test_G1x12y7, "G1x12y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G1x12y7C1Ev();
extern void _ZN7G1x12y7D1Ev();
Name_Map name_map_G1x12y7[] = {
  NSPAIR(_ZN7G1x12y7C1Ev),
  NSPAIR(_ZN7G1x12y7D1Ev),
  {0,0}
};
extern Class_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_E1x12;
extern VTBL_ENTRY _ZTI5E1x12[];
extern  VTBL_ENTRY _ZTV5E1x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x12y7[] = {
  // 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(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_E1x12,    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_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 _ZTI7G1x12y7[];
extern void _ZN5E1x123fooEv();
static  VTBL_ENTRY vtc_G1x12y7[] = {
  ABISELECT(44,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x12y7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G1x12y7[0]),
  (VTBL_ENTRY)&_ZN5E1x123fooEv,
};
extern VTBL_ENTRY _ZTV7G1x12y7[];
static  VTT_ENTRY vtt_G1x12y7[] = {
  {&(_ZTV7G1x12y7[4]),  4,8},
  {&(_ZTV7G1x12y7[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G1x12y7[];
extern  VTBL_ENTRY _ZTV7G1x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x12y7[];
Class_Descriptor cd_G1x12y7 = {  "G1x12y7", // class name
  bases_G1x12y7, 6,
  &(vtc_G1x12y7[0]), // expected_vtbl_contents
  &(vtt_G1x12y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G1x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x12y7),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x12y7),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  E2x12  : C2 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E2x123fooEv
  ~E2x12(); // tgen
  E2x12(); // tgen
};
//SIG(-1 E2x12) C1{ BC2{ VBC3{ Fi} BC4{ Fi} Fi} BC5{ Fi} v1 Fi}


void  E2x12 ::foo(){vfunc_called(this, "_ZN5E2x123fooEv");}
E2x12 ::~E2x12(){ note_dtor("E2x12", this);} // tgen
E2x12 ::E2x12(){ note_ctor("E2x12", this);} // tgen

static void Test_E2x12()
{
  extern Class_Descriptor cd_E2x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E2x12, buf);
    E2x12 *dp, &lv = *(dp=new (buf) E2x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E2x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E2x12)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(24,20), "E2x12");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(8,4), "E2x12");
    check_base_class_offset(lv, (C2*), 0, "E2x12");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E2x12");
    check_field_offset(lv, fd, ABISELECT(20,16), "E2x12.fd");
    test_class_info(&lv, &cd_E2x12);
    dp->~E2x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE2x12(Test_E2x12, "E2x12", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E2x12C1Ev();
extern void _ZN5E2x12D1Ev();
Name_Map name_map_E2x12[] = {
  NSPAIR(_ZN5E2x12C1Ev),
  NSPAIR(_ZN5E2x12D1Ev),
  {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_E2x12[] = {
  // 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 _ZTI5E2x12[];
extern void _ZN5E2x123fooEv();
static  VTBL_ENTRY vtc_E2x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x12[0]),
  (VTBL_ENTRY)&_ZN5E2x123fooEv,
};
extern VTBL_ENTRY _ZTV5E2x12[];
static  VTBL_ENTRY _tg__ZTV2C2__5E2x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_E2x12[] = {
  {&(_ZTV5E2x12[3]),  3,4},
  {&(_tg__ZTV2C2__5E2x12[3]),  3,3},
};
extern VTBL_ENTRY _ZTI5E2x12[];
extern  VTBL_ENTRY _ZTV5E2x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x12[];
Class_Descriptor cd_E2x12 = {  "E2x12", // class name
  bases_E2x12, 4,
  &(vtc_E2x12[0]), // expected_vtbl_contents
  &(vtt_E2x12[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E2x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E2x12),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E2x12),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  G2x12y0  : E2x12 , F1 {
  int ff;
  ~G2x12y0(); // tgen
  G2x12y0(); // tgen
};
//SIG(1 G2x12y0) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G2x12y0 ::~G2x12y0(){ note_dtor("G2x12y0", this);} // tgen
G2x12y0 ::G2x12y0(){ note_ctor("G2x12y0", this);} // tgen

static void Test_G2x12y0()
{
  extern Class_Descriptor cd_G2x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x12y0, buf);
    G2x12y0 *dp, &lv = *(dp=new (buf) G2x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x12y0)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x12*), ABISELECT(40,32), "G2x12y0");
    check_base_class_offset(lv, (B0*)(C2*)(E2x12*), ABISELECT(8,4), "G2x12y0");
    check_base_class_offset(lv, (C2*)(E2x12*), 0, "G2x12y0");
    check_base_class_offset(lv, (D0*)(E2x12*), ABISELECT(16,12), "G2x12y0");
    check_base_class_offset(lv, (E2x12*), 0, "G2x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G2x12y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G2x12y0.ff");
    test_class_info(&lv, &cd_G2x12y0);
    dp->~G2x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x12y0(Test_G2x12y0, "G2x12y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G2x12y0C1Ev();
extern void _ZN7G2x12y0D1Ev();
Name_Map name_map_G2x12y0[] = {
  NSPAIR(_ZN7G2x12y0C1Ev),
  NSPAIR(_ZN7G2x12y0D1Ev),
  {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_E2x12;
extern VTBL_ENTRY _ZTI5E2x12[];
extern  VTBL_ENTRY _ZTV5E2x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x12y0[] = {
  // 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_E2x12,    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 _ZTI7G2x12y0[];
extern void _ZN5E2x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x12y0[0]),
  (VTBL_ENTRY)&_ZN5E2x123fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G2x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G2x12y0[];
extern void _ZN5E2x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x12__7G2x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x12[0]),
  (VTBL_ENTRY)&_ZN5E2x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C25E2x12__7G2x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x12y0[] = {
  {&(_ZTV7G2x12y0[3]),  3,7},
  {&(_tg__ZTV5E2x12__7G2x12y0[3]),  3,4},
  {&(_tg__ZTV2C25E2x12__7G2x12y0[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x12y0[];
extern  VTBL_ENTRY _ZTV7G2x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x12y0[];
Class_Descriptor cd_G2x12y0 = {  "G2x12y0", // class name
  bases_G2x12y0, 6,
  &(vtc_G2x12y0[0]), // expected_vtbl_contents
  &(vtt_G2x12y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G2x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x12y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x12y0),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  G2x12y1  : virtual E2x12 , F1 {
  int ff;
  ~G2x12y1(); // tgen
  G2x12y1(); // tgen
};
//SIG(1 G2x12y1) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G2x12y1 ::~G2x12y1(){ note_dtor("G2x12y1", this);} // tgen
G2x12y1 ::G2x12y1(){ note_ctor("G2x12y1", this);} // tgen

static void Test_G2x12y1()
{
  extern Class_Descriptor cd_G2x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x12y1, buf);
    G2x12y1 *dp, &lv = *(dp=new (buf) G2x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x12y1)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x12*), ABISELECT(40,32), "G2x12y1");
    check_base_class_offset(lv, (B0*)(C2*)(E2x12*), ABISELECT(24,16), "G2x12y1");
    check_base_class_offset(lv, (C2*)(E2x12*), ABISELECT(16,12), "G2x12y1");
    check_base_class_offset(lv, (D0*)(E2x12*), ABISELECT(32,24), "G2x12y1");
    check_base_class_offset(lv, (E2x12*), ABISELECT(16,12), "G2x12y1");
    check_base_class_offset(lv, (F1*), 0, "G2x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x12y1.ff");
    test_class_info(&lv, &cd_G2x12y1);
    dp->~G2x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x12y1(Test_G2x12y1, "G2x12y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G2x12y1C1Ev();
extern void _ZN7G2x12y1D1Ev();
Name_Map name_map_G2x12y1[] = {
  NSPAIR(_ZN7G2x12y1C1Ev),
  NSPAIR(_ZN7G2x12y1D1Ev),
  {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_E2x12;
extern VTBL_ENTRY _ZTI5E2x12[];
extern  VTBL_ENTRY _ZTV5E2x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x12y1[] = {
  // 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_E2x12,    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 _ZTI7G2x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E2x123fooEv();
static  VTBL_ENTRY vtc_G2x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G2x12y1[0]),
  (VTBL_ENTRY)&_ZN5E2x123fooEv,
};
extern VTBL_ENTRY _ZTV7G2x12y1[];
extern void _ZN5E2x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x12__7G2x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x12[0]),
  (VTBL_ENTRY)&_ZN5E2x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C25E2x12__7G2x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x12y1[] = {
  {&(_ZTV7G2x12y1[4]),  4,10},
  {&(_ZTV7G2x12y1[9]),  9,10},
  {&(_tg__ZTV5E2x12__7G2x12y1[3]),  3,4},
  {&(_tg__ZTV2C25E2x12__7G2x12y1[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x12y1[];
extern  VTBL_ENTRY _ZTV7G2x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x12y1[];
Class_Descriptor cd_G2x12y1 = {  "G2x12y1", // class name
  bases_G2x12y1, 6,
  &(vtc_G2x12y1[0]), // expected_vtbl_contents
  &(vtt_G2x12y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G2x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x12y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x12y1),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  G2x12y2  : E2x12 , virtual F1 {
  int ff;
  ~G2x12y2(); // tgen
  G2x12y2(); // tgen
};
//SIG(1 G2x12y2) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G2x12y2 ::~G2x12y2(){ note_dtor("G2x12y2", this);} // tgen
G2x12y2 ::G2x12y2(){ note_ctor("G2x12y2", this);} // tgen

static void Test_G2x12y2()
{
  extern Class_Descriptor cd_G2x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x12y2, buf);
    G2x12y2 *dp, &lv = *(dp=new (buf) G2x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x12y2)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x12*), ABISELECT(28,24), "G2x12y2");
    check_base_class_offset(lv, (B0*)(C2*)(E2x12*), ABISELECT(8,4), "G2x12y2");
    check_base_class_offset(lv, (C2*)(E2x12*), 0, "G2x12y2");
    check_base_class_offset(lv, (D0*)(E2x12*), ABISELECT(16,12), "G2x12y2");
    check_base_class_offset(lv, (E2x12*), 0, "G2x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G2x12y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G2x12y2.ff");
    test_class_info(&lv, &cd_G2x12y2);
    dp->~G2x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x12y2(Test_G2x12y2, "G2x12y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G2x12y2C1Ev();
extern void _ZN7G2x12y2D1Ev();
Name_Map name_map_G2x12y2[] = {
  NSPAIR(_ZN7G2x12y2C1Ev),
  NSPAIR(_ZN7G2x12y2D1Ev),
  {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_E2x12;
extern VTBL_ENTRY _ZTI5E2x12[];
extern  VTBL_ENTRY _ZTV5E2x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x12y2[] = {
  // 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_E2x12,    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 _ZTI7G2x12y2[];
extern void _ZN5E2x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x12y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x12y2[0]),
  (VTBL_ENTRY)&_ZN5E2x123fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G2x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G2x12y2[];
extern void _ZN5E2x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x12__7G2x12y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x12[0]),
  (VTBL_ENTRY)&_ZN5E2x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C25E2x12__7G2x12y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x12y2[] = {
  {&(_ZTV7G2x12y2[4]),  4,9},
  {&(_tg__ZTV5E2x12__7G2x12y2[3]),  3,4},
  {&(_tg__ZTV2C25E2x12__7G2x12y2[3]),  3,3},
  {&(_ZTV7G2x12y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G2x12y2[];
extern  VTBL_ENTRY _ZTV7G2x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x12y2[];
Class_Descriptor cd_G2x12y2 = {  "G2x12y2", // class name
  bases_G2x12y2, 6,
  &(vtc_G2x12y2[0]), // expected_vtbl_contents
  &(vtt_G2x12y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G2x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x12y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x12y2),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  G2x12y3  : virtual E2x12 , virtual F1 {
  int ff;
  ~G2x12y3(); // tgen
  G2x12y3(); // tgen
};
//SIG(1 G2x12y3) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G2x12y3 ::~G2x12y3(){ note_dtor("G2x12y3", this);} // tgen
G2x12y3 ::G2x12y3(){ note_ctor("G2x12y3", this);} // tgen

static void Test_G2x12y3()
{
  extern Class_Descriptor cd_G2x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G2x12y3, buf);
    G2x12y3 *dp, &lv = *(dp=new (buf) G2x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G2x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x12y3)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x12*), ABISELECT(40,28), "G2x12y3");
    check_base_class_offset(lv, (B0*)(C2*)(E2x12*), ABISELECT(24,12), "G2x12y3");
    check_base_class_offset(lv, (C2*)(E2x12*), ABISELECT(16,8), "G2x12y3");
    check_base_class_offset(lv, (D0*)(E2x12*), ABISELECT(32,20), "G2x12y3");
    check_base_class_offset(lv, (E2x12*), ABISELECT(16,8), "G2x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G2x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G2x12y3.ff");
    test_class_info(&lv, &cd_G2x12y3);
    dp->~G2x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x12y3(Test_G2x12y3, "G2x12y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G2x12y3C1Ev();
extern void _ZN7G2x12y3D1Ev();
Name_Map name_map_G2x12y3[] = {
  NSPAIR(_ZN7G2x12y3C1Ev),
  NSPAIR(_ZN7G2x12y3D1Ev),
  {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_E2x12;
extern VTBL_ENTRY _ZTI5E2x12[];
extern  VTBL_ENTRY _ZTV5E2x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x12y3[] = {
  // 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_E2x12,    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 _ZTI7G2x12y3[];
extern void _ZN5E2x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x12y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G2x12y3[0]),
  (VTBL_ENTRY)&_ZN5E2x123fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G2x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G2x12y3[];
extern void _ZN5E2x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x12__7G2x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x12[0]),
  (VTBL_ENTRY)&_ZN5E2x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C25E2x12__7G2x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x12y3[] = {
  {&(_ZTV7G2x12y3[5]),  5,14},
  {&(_ZTV7G2x12y3[9]),  9,14},
  {&(_ZTV7G2x12y3[13]),  13,14},
  {&(_tg__ZTV5E2x12__7G2x12y3[3]),  3,4},
  {&(_tg__ZTV2C25E2x12__7G2x12y3[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x12y3[];
extern  VTBL_ENTRY _ZTV7G2x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x12y3[];
Class_Descriptor cd_G2x12y3 = {  "G2x12y3", // class name
  bases_G2x12y3, 6,
  &(vtc_G2x12y3[0]), // expected_vtbl_contents
  &(vtt_G2x12y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G2x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x12y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x12y3),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  G2x12y4  : E2x12 , F0 {
  int ff;
  ~G2x12y4(); // tgen
  G2x12y4(); // tgen
};
//SIG(1 G2x12y4) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G2x12y4 ::~G2x12y4(){ note_dtor("G2x12y4", this);} // tgen
G2x12y4 ::G2x12y4(){ note_ctor("G2x12y4", this);} // tgen

static void Test_G2x12y4()
{
  extern Class_Descriptor cd_G2x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G2x12y4, buf);
    G2x12y4 *dp, &lv = *(dp=new (buf) G2x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G2x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x12y4)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x12*), ABISELECT(32,28), "G2x12y4");
    check_base_class_offset(lv, (B0*)(C2*)(E2x12*), ABISELECT(8,4), "G2x12y4");
    check_base_class_offset(lv, (C2*)(E2x12*), 0, "G2x12y4");
    check_base_class_offset(lv, (D0*)(E2x12*), ABISELECT(16,12), "G2x12y4");
    check_base_class_offset(lv, (E2x12*), 0, "G2x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G2x12y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G2x12y4.ff");
    test_class_info(&lv, &cd_G2x12y4);
    dp->~G2x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x12y4(Test_G2x12y4, "G2x12y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G2x12y4C1Ev();
extern void _ZN7G2x12y4D1Ev();
Name_Map name_map_G2x12y4[] = {
  NSPAIR(_ZN7G2x12y4C1Ev),
  NSPAIR(_ZN7G2x12y4D1Ev),
  {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_E2x12;
extern VTBL_ENTRY _ZTI5E2x12[];
extern  VTBL_ENTRY _ZTV5E2x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x12y4[] = {
  // 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_E2x12,    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 _ZTI7G2x12y4[];
extern void _ZN5E2x123fooEv();
static  VTBL_ENTRY vtc_G2x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x12y4[0]),
  (VTBL_ENTRY)&_ZN5E2x123fooEv,
};
extern VTBL_ENTRY _ZTV7G2x12y4[];
extern void _ZN5E2x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x12__7G2x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x12[0]),
  (VTBL_ENTRY)&_ZN5E2x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C25E2x12__7G2x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x12y4[] = {
  {&(_ZTV7G2x12y4[3]),  3,4},
  {&(_tg__ZTV5E2x12__7G2x12y4[3]),  3,4},
  {&(_tg__ZTV2C25E2x12__7G2x12y4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x12y4[];
extern  VTBL_ENTRY _ZTV7G2x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x12y4[];
Class_Descriptor cd_G2x12y4 = {  "G2x12y4", // class name
  bases_G2x12y4, 6,
  &(vtc_G2x12y4[0]), // expected_vtbl_contents
  &(vtt_G2x12y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G2x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x12y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x12y4),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  G2x12y5  : virtual E2x12 , F0 {
  int ff;
  ~G2x12y5(); // tgen
  G2x12y5(); // tgen
};
//SIG(1 G2x12y5) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G2x12y5 ::~G2x12y5(){ note_dtor("G2x12y5", this);} // tgen
G2x12y5 ::G2x12y5(){ note_ctor("G2x12y5", this);} // tgen

static void Test_G2x12y5()
{
  extern Class_Descriptor cd_G2x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x12y5, buf);
    G2x12y5 *dp, &lv = *(dp=new (buf) G2x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x12y5)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x12*), ABISELECT(40,32), "G2x12y5");
    check_base_class_offset(lv, (B0*)(C2*)(E2x12*), ABISELECT(24,16), "G2x12y5");
    check_base_class_offset(lv, (C2*)(E2x12*), ABISELECT(16,12), "G2x12y5");
    check_base_class_offset(lv, (D0*)(E2x12*), ABISELECT(32,24), "G2x12y5");
    check_base_class_offset(lv, (E2x12*), ABISELECT(16,12), "G2x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G2x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x12y5.ff");
    test_class_info(&lv, &cd_G2x12y5);
    dp->~G2x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x12y5(Test_G2x12y5, "G2x12y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G2x12y5C1Ev();
extern void _ZN7G2x12y5D1Ev();
Name_Map name_map_G2x12y5[] = {
  NSPAIR(_ZN7G2x12y5C1Ev),
  NSPAIR(_ZN7G2x12y5D1Ev),
  {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_E2x12;
extern VTBL_ENTRY _ZTI5E2x12[];
extern  VTBL_ENTRY _ZTV5E2x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x12y5[] = {
  // 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_E2x12,    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 _ZTI7G2x12y5[];
extern void _ZN5E2x123fooEv();
static  VTBL_ENTRY vtc_G2x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G2x12y5[0]),
  (VTBL_ENTRY)&_ZN5E2x123fooEv,
};
extern VTBL_ENTRY _ZTV7G2x12y5[];
extern void _ZN5E2x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x12__7G2x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x12[0]),
  (VTBL_ENTRY)&_ZN5E2x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C25E2x12__7G2x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x12y5[] = {
  {&(_ZTV7G2x12y5[4]),  4,9},
  {&(_ZTV7G2x12y5[8]),  8,9},
  {&(_tg__ZTV5E2x12__7G2x12y5[3]),  3,4},
  {&(_tg__ZTV2C25E2x12__7G2x12y5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x12y5[];
extern  VTBL_ENTRY _ZTV7G2x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x12y5[];
Class_Descriptor cd_G2x12y5 = {  "G2x12y5", // class name
  bases_G2x12y5, 6,
  &(vtc_G2x12y5[0]), // expected_vtbl_contents
  &(vtt_G2x12y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G2x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x12y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x12y5),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  G2x12y6  : E2x12 , virtual F0 {
  int ff;
  ~G2x12y6(); // tgen
  G2x12y6(); // tgen
};
//SIG(1 G2x12y6) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G2x12y6 ::~G2x12y6(){ note_dtor("G2x12y6", this);} // tgen
G2x12y6 ::G2x12y6(){ note_ctor("G2x12y6", this);} // tgen

static void Test_G2x12y6()
{
  extern Class_Descriptor cd_G2x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G2x12y6, buf);
    G2x12y6 *dp, &lv = *(dp=new (buf) G2x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G2x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x12y6)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x12*), ABISELECT(28,24), "G2x12y6");
    check_base_class_offset(lv, (B0*)(C2*)(E2x12*), ABISELECT(8,4), "G2x12y6");
    check_base_class_offset(lv, (C2*)(E2x12*), 0, "G2x12y6");
    check_base_class_offset(lv, (D0*)(E2x12*), ABISELECT(16,12), "G2x12y6");
    check_base_class_offset(lv, (E2x12*), 0, "G2x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G2x12y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G2x12y6.ff");
    test_class_info(&lv, &cd_G2x12y6);
    dp->~G2x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x12y6(Test_G2x12y6, "G2x12y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G2x12y6C1Ev();
extern void _ZN7G2x12y6D1Ev();
Name_Map name_map_G2x12y6[] = {
  NSPAIR(_ZN7G2x12y6C1Ev),
  NSPAIR(_ZN7G2x12y6D1Ev),
  {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_E2x12;
extern VTBL_ENTRY _ZTI5E2x12[];
extern  VTBL_ENTRY _ZTV5E2x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x12y6[] = {
  // 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_E2x12,    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 _ZTI7G2x12y6[];
extern void _ZN5E2x123fooEv();
static  VTBL_ENTRY vtc_G2x12y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x12y6[0]),
  (VTBL_ENTRY)&_ZN5E2x123fooEv,
};
extern VTBL_ENTRY _ZTV7G2x12y6[];
extern void _ZN5E2x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x12__7G2x12y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x12[0]),
  (VTBL_ENTRY)&_ZN5E2x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C25E2x12__7G2x12y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x12y6[] = {
  {&(_ZTV7G2x12y6[4]),  4,5},
  {&(_tg__ZTV5E2x12__7G2x12y6[3]),  3,4},
  {&(_tg__ZTV2C25E2x12__7G2x12y6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x12y6[];
extern  VTBL_ENTRY _ZTV7G2x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x12y6[];
Class_Descriptor cd_G2x12y6 = {  "G2x12y6", // class name
  bases_G2x12y6, 6,
  &(vtc_G2x12y6[0]), // expected_vtbl_contents
  &(vtt_G2x12y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G2x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x12y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x12y6),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  G2x12y7  : virtual E2x12 , virtual F0 {
  int ff;
  ~G2x12y7(); // tgen
  G2x12y7(); // tgen
};
//SIG(1 G2x12y7) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G2x12y7 ::~G2x12y7(){ note_dtor("G2x12y7", this);} // tgen
G2x12y7 ::G2x12y7(){ note_ctor("G2x12y7", this);} // tgen

static void Test_G2x12y7()
{
  extern Class_Descriptor cd_G2x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x12y7, buf);
    G2x12y7 *dp, &lv = *(dp=new (buf) G2x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x12y7)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x12*), ABISELECT(40,28), "G2x12y7");
    check_base_class_offset(lv, (B0*)(C2*)(E2x12*), ABISELECT(24,12), "G2x12y7");
    check_base_class_offset(lv, (C2*)(E2x12*), ABISELECT(16,8), "G2x12y7");
    check_base_class_offset(lv, (D0*)(E2x12*), ABISELECT(32,20), "G2x12y7");
    check_base_class_offset(lv, (E2x12*), ABISELECT(16,8), "G2x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G2x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G2x12y7.ff");
    test_class_info(&lv, &cd_G2x12y7);
    dp->~G2x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x12y7(Test_G2x12y7, "G2x12y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G2x12y7C1Ev();
extern void _ZN7G2x12y7D1Ev();
Name_Map name_map_G2x12y7[] = {
  NSPAIR(_ZN7G2x12y7C1Ev),
  NSPAIR(_ZN7G2x12y7D1Ev),
  {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_E2x12;
extern VTBL_ENTRY _ZTI5E2x12[];
extern  VTBL_ENTRY _ZTV5E2x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x12y7[] = {
  // 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_E2x12,    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 _ZTI7G2x12y7[];
extern void _ZN5E2x123fooEv();
static  VTBL_ENTRY vtc_G2x12y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G2x12y7[0]),
  (VTBL_ENTRY)&_ZN5E2x123fooEv,
};
extern VTBL_ENTRY _ZTV7G2x12y7[];
extern void _ZN5E2x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x12__7G2x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x12[0]),
  (VTBL_ENTRY)&_ZN5E2x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C25E2x12__7G2x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x12y7[] = {
  {&(_ZTV7G2x12y7[5]),  5,10},
  {&(_ZTV7G2x12y7[9]),  9,10},
  {&(_tg__ZTV5E2x12__7G2x12y7[3]),  3,4},
  {&(_tg__ZTV2C25E2x12__7G2x12y7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x12y7[];
extern  VTBL_ENTRY _ZTV7G2x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x12y7[];
Class_Descriptor cd_G2x12y7 = {  "G2x12y7", // class name
  bases_G2x12y7, 6,
  &(vtc_G2x12y7[0]), // expected_vtbl_contents
  &(vtt_G2x12y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G2x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x12y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x12y7),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  E3x12  : C3 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E3x123fooEv
  ~E3x12(); // tgen
  E3x12(); // tgen
};
//SIG(-1 E3x12) C1{ BC2{ VBC3{ v1 Fi} BC4{ Fi} Fi} BC5{ Fi} v1 Fi}


void  E3x12 ::foo(){vfunc_called(this, "_ZN5E3x123fooEv");}
E3x12 ::~E3x12(){ note_dtor("E3x12", this);} // tgen
E3x12 ::E3x12(){ note_ctor("E3x12", this);} // tgen

static void Test_E3x12()
{
  extern Class_Descriptor cd_E3x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E3x12, buf);
    E3x12 *dp, &lv = *(dp=new (buf) E3x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E3x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E3x12)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(24,20), "E3x12");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(8,4), "E3x12");
    check_base_class_offset(lv, (C3*), 0, "E3x12");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E3x12");
    check_field_offset(lv, fd, ABISELECT(20,16), "E3x12.fd");
    test_class_info(&lv, &cd_E3x12);
    dp->~E3x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE3x12(Test_E3x12, "E3x12", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E3x12C1Ev();
extern void _ZN5E3x12D1Ev();
Name_Map name_map_E3x12[] = {
  NSPAIR(_ZN5E3x12C1Ev),
  NSPAIR(_ZN5E3x12D1Ev),
  {0,0}
};
extern Class_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_E3x12[] = {
  // 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_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 _ZTI5E3x12[];
extern void _ZN5E3x123fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv)();
extern void ABISELECT(_ZThn24_N5E3x123fooEv,_ZThn20_N5E3x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E3x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x12[0]),
  (VTBL_ENTRY)&_ZN5E3x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E3x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv),
};
extern VTBL_ENTRY _ZTV5E3x12[];
static  VTBL_ENTRY _tg__ZTV2C3__5E3x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__5E3x12[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E3x12[] = {
  {&(_ZTV5E3x12[3]),  3,8},
  {&(_tg__ZTV2C3__5E3x12[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__5E3x12[3]),  3,4},
  {&(_ZTV5E3x12[7]),  7,8},
};
extern VTBL_ENTRY _ZTI5E3x12[];
extern  VTBL_ENTRY _ZTV5E3x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x12[];
static VTBL_ENTRY alt_thunk_names8[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x123fooEv,_ZThn20_N5E3x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E3x12 = {  "E3x12", // class name
  bases_E3x12, 4,
  &(vtc_E3x12[0]), // expected_vtbl_contents
  &(vtt_E3x12[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E3x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E3x12),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E3x12),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  G3x12y0  : E3x12 , F1 {
  int ff;
  ~G3x12y0(); // tgen
  G3x12y0(); // tgen
};
//SIG(1 G3x12y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G3x12y0 ::~G3x12y0(){ note_dtor("G3x12y0", this);} // tgen
G3x12y0 ::G3x12y0(){ note_ctor("G3x12y0", this);} // tgen

static void Test_G3x12y0()
{
  extern Class_Descriptor cd_G3x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x12y0, buf);
    G3x12y0 *dp, &lv = *(dp=new (buf) G3x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x12y0)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x12*), ABISELECT(40,32), "G3x12y0");
    check_base_class_offset(lv, (B0*)(C3*)(E3x12*), ABISELECT(8,4), "G3x12y0");
    check_base_class_offset(lv, (C3*)(E3x12*), 0, "G3x12y0");
    check_base_class_offset(lv, (D0*)(E3x12*), ABISELECT(16,12), "G3x12y0");
    check_base_class_offset(lv, (E3x12*), 0, "G3x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G3x12y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G3x12y0.ff");
    test_class_info(&lv, &cd_G3x12y0);
    dp->~G3x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x12y0(Test_G3x12y0, "G3x12y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G3x12y0C1Ev();
extern void _ZN7G3x12y0D1Ev();
Name_Map name_map_G3x12y0[] = {
  NSPAIR(_ZN7G3x12y0C1Ev),
  NSPAIR(_ZN7G3x12y0D1Ev),
  {0,0}
};
extern Class_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_E3x12;
extern VTBL_ENTRY _ZTI5E3x12[];
extern  VTBL_ENTRY _ZTV5E3x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x12y0[] = {
  // 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_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_E3x12,    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 _ZTI7G3x12y0[];
extern void _ZN5E3x123fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv)();
extern void ABISELECT(_ZThn40_N5E3x123fooEv,_ZThn32_N5E3x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x12y0[0]),
  (VTBL_ENTRY)&_ZN5E3x123fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G3x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G3x12y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv),
};
extern VTBL_ENTRY _ZTV7G3x12y0[];
extern void _ZN5E3x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x12__7G3x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x12[0]),
  (VTBL_ENTRY)&_ZN5E3x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C35E3x12__7G3x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C35E3x12__7G3x12y0[] = {
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv)();
extern void ABISELECT(_ZThn40_N5E3x123fooEv,_ZThn32_N5E3x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x12__7G3x12y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI5E3x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv),
};
static  VTT_ENTRY vtt_G3x12y0[] = {
  {&(_ZTV7G3x12y0[3]),  3,11},
  {&(_tg__ZTV5E3x12__7G3x12y0[3]),  3,4},
  {&(_tg__ZTV2C35E3x12__7G3x12y0[3]),  3,3},
  {&(_tg__ZTV2A1__2C35E3x12__7G3x12y0[3]),  3,4},
  {&(_tg__ZTV2A1__5E3x12__7G3x12y0[3]),  3,4},
  {&(_ZTV7G3x12y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G3x12y0[];
extern  VTBL_ENTRY _ZTV7G3x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x12y0[];
static VTBL_ENTRY alt_thunk_names9[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E3x123fooEv,_ZThn32_N5E3x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E3x123fooEv,_ZThn32_N5E3x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x12y0 = {  "G3x12y0", // class name
  bases_G3x12y0, 6,
  &(vtc_G3x12y0[0]), // expected_vtbl_contents
  &(vtt_G3x12y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G3x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x12y0),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x12y0),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  G3x12y1  : virtual E3x12 , F1 {
  int ff;
  ~G3x12y1(); // tgen
  G3x12y1(); // tgen
};
//SIG(1 G3x12y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G3x12y1 ::~G3x12y1(){ note_dtor("G3x12y1", this);} // tgen
G3x12y1 ::G3x12y1(){ note_ctor("G3x12y1", this);} // tgen

static void Test_G3x12y1()
{
  extern Class_Descriptor cd_G3x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x12y1, buf);
    G3x12y1 *dp, &lv = *(dp=new (buf) G3x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x12y1)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x12*), ABISELECT(40,32), "G3x12y1");
    check_base_class_offset(lv, (B0*)(C3*)(E3x12*), ABISELECT(24,16), "G3x12y1");
    check_base_class_offset(lv, (C3*)(E3x12*), ABISELECT(16,12), "G3x12y1");
    check_base_class_offset(lv, (D0*)(E3x12*), ABISELECT(32,24), "G3x12y1");
    check_base_class_offset(lv, (E3x12*), ABISELECT(16,12), "G3x12y1");
    check_base_class_offset(lv, (F1*), 0, "G3x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x12y1.ff");
    test_class_info(&lv, &cd_G3x12y1);
    dp->~G3x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x12y1(Test_G3x12y1, "G3x12y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G3x12y1C1Ev();
extern void _ZN7G3x12y1D1Ev();
Name_Map name_map_G3x12y1[] = {
  NSPAIR(_ZN7G3x12y1C1Ev),
  NSPAIR(_ZN7G3x12y1D1Ev),
  {0,0}
};
extern Class_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_E3x12;
extern VTBL_ENTRY _ZTI5E3x12[];
extern  VTBL_ENTRY _ZTV5E3x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x12y1[] = {
  // 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_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_E3x12,    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 _ZTI7G3x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E3x123fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv)();
extern void ABISELECT(_ZThn24_N5E3x123fooEv,_ZThn20_N5E3x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G3x12y1[0]),
  (VTBL_ENTRY)&_ZN5E3x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G3x12y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv),
};
extern VTBL_ENTRY _ZTV7G3x12y1[];
extern void _ZN5E3x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x12__7G3x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x12[0]),
  (VTBL_ENTRY)&_ZN5E3x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C35E3x12__7G3x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C35E3x12__7G3x12y1[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv)();
extern void ABISELECT(_ZThn24_N5E3x123fooEv,_ZThn20_N5E3x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x12__7G3x12y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E3x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv),
};
static  VTT_ENTRY vtt_G3x12y1[] = {
  {&(_ZTV7G3x12y1[4]),  4,14},
  {&(_ZTV7G3x12y1[9]),  9,14},
  {&(_ZTV7G3x12y1[13]),  13,14},
  {&(_tg__ZTV5E3x12__7G3x12y1[3]),  3,4},
  {&(_tg__ZTV2C35E3x12__7G3x12y1[3]),  3,3},
  {&(_tg__ZTV2A1__2C35E3x12__7G3x12y1[3]),  3,4},
  {&(_tg__ZTV2A1__5E3x12__7G3x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x12y1[];
extern  VTBL_ENTRY _ZTV7G3x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x12y1[];
static VTBL_ENTRY alt_thunk_names10[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x123fooEv,_ZThn20_N5E3x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x123fooEv,_ZThn20_N5E3x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x12y1 = {  "G3x12y1", // class name
  bases_G3x12y1, 6,
  &(vtc_G3x12y1[0]), // expected_vtbl_contents
  &(vtt_G3x12y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G3x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x12y1),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x12y1),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  G3x12y2  : E3x12 , virtual F1 {
  int ff;
  ~G3x12y2(); // tgen
  G3x12y2(); // tgen
};
//SIG(1 G3x12y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G3x12y2 ::~G3x12y2(){ note_dtor("G3x12y2", this);} // tgen
G3x12y2 ::G3x12y2(){ note_ctor("G3x12y2", this);} // tgen

static void Test_G3x12y2()
{
  extern Class_Descriptor cd_G3x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G3x12y2, buf);
    G3x12y2 *dp, &lv = *(dp=new (buf) G3x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G3x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x12y2)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x12*), ABISELECT(32,24), "G3x12y2");
    check_base_class_offset(lv, (B0*)(C3*)(E3x12*), ABISELECT(8,4), "G3x12y2");
    check_base_class_offset(lv, (C3*)(E3x12*), 0, "G3x12y2");
    check_base_class_offset(lv, (D0*)(E3x12*), ABISELECT(16,12), "G3x12y2");
    check_base_class_offset(lv, (E3x12*), 0, "G3x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G3x12y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G3x12y2.ff");
    test_class_info(&lv, &cd_G3x12y2);
    dp->~G3x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x12y2(Test_G3x12y2, "G3x12y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G3x12y2C1Ev();
extern void _ZN7G3x12y2D1Ev();
Name_Map name_map_G3x12y2[] = {
  NSPAIR(_ZN7G3x12y2C1Ev),
  NSPAIR(_ZN7G3x12y2D1Ev),
  {0,0}
};
extern Class_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_E3x12;
extern VTBL_ENTRY _ZTI5E3x12[];
extern  VTBL_ENTRY _ZTV5E3x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x12y2[] = {
  // 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_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_E3x12,    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 _ZTI7G3x12y2[];
extern void _ZN5E3x123fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv)();
extern void ABISELECT(_ZThn32_N5E3x123fooEv,_ZThn24_N5E3x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G3x12y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x12y2[0]),
  (VTBL_ENTRY)&_ZN5E3x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G3x12y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G3x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G3x12y2[];
extern void _ZN5E3x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x12__7G3x12y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x12[0]),
  (VTBL_ENTRY)&_ZN5E3x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C35E3x12__7G3x12y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C35E3x12__7G3x12y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv)();
extern void ABISELECT(_ZThn32_N5E3x123fooEv,_ZThn24_N5E3x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x12__7G3x12y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E3x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv),
};
static  VTT_ENTRY vtt_G3x12y2[] = {
  {&(_ZTV7G3x12y2[4]),  4,13},
  {&(_tg__ZTV5E3x12__7G3x12y2[3]),  3,4},
  {&(_tg__ZTV2C35E3x12__7G3x12y2[3]),  3,3},
  {&(_tg__ZTV2A1__2C35E3x12__7G3x12y2[3]),  3,4},
  {&(_tg__ZTV2A1__5E3x12__7G3x12y2[3]),  3,4},
  {&(_ZTV7G3x12y2[8]),  8,13},
  {&(_ZTV7G3x12y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G3x12y2[];
extern  VTBL_ENTRY _ZTV7G3x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x12y2[];
static VTBL_ENTRY alt_thunk_names11[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x123fooEv,_ZThn24_N5E3x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x123fooEv,_ZThn24_N5E3x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x12y2 = {  "G3x12y2", // class name
  bases_G3x12y2, 6,
  &(vtc_G3x12y2[0]), // expected_vtbl_contents
  &(vtt_G3x12y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G3x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x12y2),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x12y2),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  G3x12y3  : virtual E3x12 , virtual F1 {
  int ff;
  ~G3x12y3(); // tgen
  G3x12y3(); // tgen
};
//SIG(1 G3x12y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G3x12y3 ::~G3x12y3(){ note_dtor("G3x12y3", this);} // tgen
G3x12y3 ::G3x12y3(){ note_ctor("G3x12y3", this);} // tgen

static void Test_G3x12y3()
{
  extern Class_Descriptor cd_G3x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G3x12y3, buf);
    G3x12y3 *dp, &lv = *(dp=new (buf) G3x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G3x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x12y3)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x12*), ABISELECT(40,28), "G3x12y3");
    check_base_class_offset(lv, (B0*)(C3*)(E3x12*), ABISELECT(24,12), "G3x12y3");
    check_base_class_offset(lv, (C3*)(E3x12*), ABISELECT(16,8), "G3x12y3");
    check_base_class_offset(lv, (D0*)(E3x12*), ABISELECT(32,20), "G3x12y3");
    check_base_class_offset(lv, (E3x12*), ABISELECT(16,8), "G3x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G3x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G3x12y3.ff");
    test_class_info(&lv, &cd_G3x12y3);
    dp->~G3x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x12y3(Test_G3x12y3, "G3x12y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G3x12y3C1Ev();
extern void _ZN7G3x12y3D1Ev();
Name_Map name_map_G3x12y3[] = {
  NSPAIR(_ZN7G3x12y3C1Ev),
  NSPAIR(_ZN7G3x12y3D1Ev),
  {0,0}
};
extern Class_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_E3x12;
extern VTBL_ENTRY _ZTI5E3x12[];
extern  VTBL_ENTRY _ZTV5E3x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x12y3[] = {
  // 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_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_E3x12,    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 _ZTI7G3x12y3[];
extern void _ZN5E3x123fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv)();
extern void ABISELECT(_ZThn24_N5E3x123fooEv,_ZThn20_N5E3x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G3x12y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G3x12y3[0]),
  (VTBL_ENTRY)&_ZN5E3x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G3x12y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G3x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G3x12y3[];
extern void _ZN5E3x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x12__7G3x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x12[0]),
  (VTBL_ENTRY)&_ZN5E3x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C35E3x12__7G3x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C35E3x12__7G3x12y3[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv)();
extern void ABISELECT(_ZThn24_N5E3x123fooEv,_ZThn20_N5E3x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x12__7G3x12y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E3x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv),
};
static  VTT_ENTRY vtt_G3x12y3[] = {
  {&(_ZTV7G3x12y3[5]),  5,18},
  {&(_ZTV7G3x12y3[9]),  9,18},
  {&(_ZTV7G3x12y3[13]),  13,18},
  {&(_ZTV7G3x12y3[17]),  17,18},
  {&(_tg__ZTV5E3x12__7G3x12y3[3]),  3,4},
  {&(_tg__ZTV2C35E3x12__7G3x12y3[3]),  3,3},
  {&(_tg__ZTV2A1__2C35E3x12__7G3x12y3[3]),  3,4},
  {&(_tg__ZTV2A1__5E3x12__7G3x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x12y3[];
extern  VTBL_ENTRY _ZTV7G3x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x12y3[];
static VTBL_ENTRY alt_thunk_names12[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x123fooEv,_ZThn20_N5E3x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x123fooEv,_ZThn20_N5E3x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x12y3 = {  "G3x12y3", // class name
  bases_G3x12y3, 6,
  &(vtc_G3x12y3[0]), // expected_vtbl_contents
  &(vtt_G3x12y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G3x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x12y3),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x12y3),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  G3x12y4  : E3x12 , F0 {
  int ff;
  ~G3x12y4(); // tgen
  G3x12y4(); // tgen
};
//SIG(1 G3x12y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G3x12y4 ::~G3x12y4(){ note_dtor("G3x12y4", this);} // tgen
G3x12y4 ::G3x12y4(){ note_ctor("G3x12y4", this);} // tgen

static void Test_G3x12y4()
{
  extern Class_Descriptor cd_G3x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G3x12y4, buf);
    G3x12y4 *dp, &lv = *(dp=new (buf) G3x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G3x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x12y4)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x12*), ABISELECT(32,28), "G3x12y4");
    check_base_class_offset(lv, (B0*)(C3*)(E3x12*), ABISELECT(8,4), "G3x12y4");
    check_base_class_offset(lv, (C3*)(E3x12*), 0, "G3x12y4");
    check_base_class_offset(lv, (D0*)(E3x12*), ABISELECT(16,12), "G3x12y4");
    check_base_class_offset(lv, (E3x12*), 0, "G3x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G3x12y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G3x12y4.ff");
    test_class_info(&lv, &cd_G3x12y4);
    dp->~G3x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x12y4(Test_G3x12y4, "G3x12y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G3x12y4C1Ev();
extern void _ZN7G3x12y4D1Ev();
Name_Map name_map_G3x12y4[] = {
  NSPAIR(_ZN7G3x12y4C1Ev),
  NSPAIR(_ZN7G3x12y4D1Ev),
  {0,0}
};
extern Class_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_E3x12;
extern VTBL_ENTRY _ZTI5E3x12[];
extern  VTBL_ENTRY _ZTV5E3x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x12y4[] = {
  // 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_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_E3x12,    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 _ZTI7G3x12y4[];
extern void _ZN5E3x123fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv)();
extern void ABISELECT(_ZThn32_N5E3x123fooEv,_ZThn28_N5E3x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x12y4[0]),
  (VTBL_ENTRY)&_ZN5E3x123fooEv,
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G3x12y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv),
};
extern VTBL_ENTRY _ZTV7G3x12y4[];
extern void _ZN5E3x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x12__7G3x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x12[0]),
  (VTBL_ENTRY)&_ZN5E3x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C35E3x12__7G3x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C35E3x12__7G3x12y4[] = {
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv)();
extern void ABISELECT(_ZThn32_N5E3x123fooEv,_ZThn28_N5E3x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x12__7G3x12y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI5E3x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv),
};
static  VTT_ENTRY vtt_G3x12y4[] = {
  {&(_ZTV7G3x12y4[3]),  3,8},
  {&(_tg__ZTV5E3x12__7G3x12y4[3]),  3,4},
  {&(_tg__ZTV2C35E3x12__7G3x12y4[3]),  3,3},
  {&(_tg__ZTV2A1__2C35E3x12__7G3x12y4[3]),  3,4},
  {&(_tg__ZTV2A1__5E3x12__7G3x12y4[3]),  3,4},
  {&(_ZTV7G3x12y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G3x12y4[];
extern  VTBL_ENTRY _ZTV7G3x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x12y4[];
static VTBL_ENTRY alt_thunk_names13[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x123fooEv,_ZThn28_N5E3x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x123fooEv,_ZThn28_N5E3x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x12y4 = {  "G3x12y4", // class name
  bases_G3x12y4, 6,
  &(vtc_G3x12y4[0]), // expected_vtbl_contents
  &(vtt_G3x12y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G3x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x12y4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x12y4),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  G3x12y5  : virtual E3x12 , F0 {
  int ff;
  ~G3x12y5(); // tgen
  G3x12y5(); // tgen
};
//SIG(1 G3x12y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G3x12y5 ::~G3x12y5(){ note_dtor("G3x12y5", this);} // tgen
G3x12y5 ::G3x12y5(){ note_ctor("G3x12y5", this);} // tgen

static void Test_G3x12y5()
{
  extern Class_Descriptor cd_G3x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x12y5, buf);
    G3x12y5 *dp, &lv = *(dp=new (buf) G3x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x12y5)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x12*), ABISELECT(40,32), "G3x12y5");
    check_base_class_offset(lv, (B0*)(C3*)(E3x12*), ABISELECT(24,16), "G3x12y5");
    check_base_class_offset(lv, (C3*)(E3x12*), ABISELECT(16,12), "G3x12y5");
    check_base_class_offset(lv, (D0*)(E3x12*), ABISELECT(32,24), "G3x12y5");
    check_base_class_offset(lv, (E3x12*), ABISELECT(16,12), "G3x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G3x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x12y5.ff");
    test_class_info(&lv, &cd_G3x12y5);
    dp->~G3x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x12y5(Test_G3x12y5, "G3x12y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G3x12y5C1Ev();
extern void _ZN7G3x12y5D1Ev();
Name_Map name_map_G3x12y5[] = {
  NSPAIR(_ZN7G3x12y5C1Ev),
  NSPAIR(_ZN7G3x12y5D1Ev),
  {0,0}
};
extern Class_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_E3x12;
extern VTBL_ENTRY _ZTI5E3x12[];
extern  VTBL_ENTRY _ZTV5E3x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x12y5[] = {
  // 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_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_E3x12,    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 _ZTI7G3x12y5[];
extern void _ZN5E3x123fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv)();
extern void ABISELECT(_ZThn24_N5E3x123fooEv,_ZThn20_N5E3x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G3x12y5[0]),
  (VTBL_ENTRY)&_ZN5E3x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G3x12y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv),
};
extern VTBL_ENTRY _ZTV7G3x12y5[];
extern void _ZN5E3x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x12__7G3x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x12[0]),
  (VTBL_ENTRY)&_ZN5E3x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C35E3x12__7G3x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C35E3x12__7G3x12y5[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv)();
extern void ABISELECT(_ZThn24_N5E3x123fooEv,_ZThn20_N5E3x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x12__7G3x12y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E3x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv),
};
static  VTT_ENTRY vtt_G3x12y5[] = {
  {&(_ZTV7G3x12y5[4]),  4,13},
  {&(_ZTV7G3x12y5[8]),  8,13},
  {&(_ZTV7G3x12y5[12]),  12,13},
  {&(_tg__ZTV5E3x12__7G3x12y5[3]),  3,4},
  {&(_tg__ZTV2C35E3x12__7G3x12y5[3]),  3,3},
  {&(_tg__ZTV2A1__2C35E3x12__7G3x12y5[3]),  3,4},
  {&(_tg__ZTV2A1__5E3x12__7G3x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x12y5[];
extern  VTBL_ENTRY _ZTV7G3x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x12y5[];
static VTBL_ENTRY alt_thunk_names14[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x123fooEv,_ZThn20_N5E3x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x123fooEv,_ZThn20_N5E3x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x12y5 = {  "G3x12y5", // class name
  bases_G3x12y5, 6,
  &(vtc_G3x12y5[0]), // expected_vtbl_contents
  &(vtt_G3x12y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G3x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x12y5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x12y5),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  G3x12y6  : E3x12 , virtual F0 {
  int ff;
  ~G3x12y6(); // tgen
  G3x12y6(); // tgen
};
//SIG(1 G3x12y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G3x12y6 ::~G3x12y6(){ note_dtor("G3x12y6", this);} // tgen
G3x12y6 ::G3x12y6(){ note_ctor("G3x12y6", this);} // tgen

static void Test_G3x12y6()
{
  extern Class_Descriptor cd_G3x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G3x12y6, buf);
    G3x12y6 *dp, &lv = *(dp=new (buf) G3x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G3x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x12y6)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x12*), ABISELECT(32,24), "G3x12y6");
    check_base_class_offset(lv, (B0*)(C3*)(E3x12*), ABISELECT(8,4), "G3x12y6");
    check_base_class_offset(lv, (C3*)(E3x12*), 0, "G3x12y6");
    check_base_class_offset(lv, (D0*)(E3x12*), ABISELECT(16,12), "G3x12y6");
    check_base_class_offset(lv, (E3x12*), 0, "G3x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G3x12y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G3x12y6.ff");
    test_class_info(&lv, &cd_G3x12y6);
    dp->~G3x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x12y6(Test_G3x12y6, "G3x12y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G3x12y6C1Ev();
extern void _ZN7G3x12y6D1Ev();
Name_Map name_map_G3x12y6[] = {
  NSPAIR(_ZN7G3x12y6C1Ev),
  NSPAIR(_ZN7G3x12y6D1Ev),
  {0,0}
};
extern Class_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_E3x12;
extern VTBL_ENTRY _ZTI5E3x12[];
extern  VTBL_ENTRY _ZTV5E3x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x12y6[] = {
  // 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_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_E3x12,    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 _ZTI7G3x12y6[];
extern void _ZN5E3x123fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv)();
extern void ABISELECT(_ZThn32_N5E3x123fooEv,_ZThn24_N5E3x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x12y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x12y6[0]),
  (VTBL_ENTRY)&_ZN5E3x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G3x12y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv),
};
extern VTBL_ENTRY _ZTV7G3x12y6[];
extern void _ZN5E3x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x12__7G3x12y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x12[0]),
  (VTBL_ENTRY)&_ZN5E3x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C35E3x12__7G3x12y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C35E3x12__7G3x12y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv)();
extern void ABISELECT(_ZThn32_N5E3x123fooEv,_ZThn24_N5E3x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x12__7G3x12y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E3x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv),
};
static  VTT_ENTRY vtt_G3x12y6[] = {
  {&(_ZTV7G3x12y6[4]),  4,9},
  {&(_tg__ZTV5E3x12__7G3x12y6[3]),  3,4},
  {&(_tg__ZTV2C35E3x12__7G3x12y6[3]),  3,3},
  {&(_tg__ZTV2A1__2C35E3x12__7G3x12y6[3]),  3,4},
  {&(_tg__ZTV2A1__5E3x12__7G3x12y6[3]),  3,4},
  {&(_ZTV7G3x12y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G3x12y6[];
extern  VTBL_ENTRY _ZTV7G3x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x12y6[];
static VTBL_ENTRY alt_thunk_names15[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x123fooEv,_ZThn24_N5E3x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x123fooEv,_ZThn24_N5E3x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x12y6 = {  "G3x12y6", // class name
  bases_G3x12y6, 6,
  &(vtc_G3x12y6[0]), // expected_vtbl_contents
  &(vtt_G3x12y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G3x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x12y6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x12y6),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  G3x12y7  : virtual E3x12 , virtual F0 {
  int ff;
  ~G3x12y7(); // tgen
  G3x12y7(); // tgen
};
//SIG(1 G3x12y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G3x12y7 ::~G3x12y7(){ note_dtor("G3x12y7", this);} // tgen
G3x12y7 ::G3x12y7(){ note_ctor("G3x12y7", this);} // tgen

static void Test_G3x12y7()
{
  extern Class_Descriptor cd_G3x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x12y7, buf);
    G3x12y7 *dp, &lv = *(dp=new (buf) G3x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x12y7)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x12*), ABISELECT(40,28), "G3x12y7");
    check_base_class_offset(lv, (B0*)(C3*)(E3x12*), ABISELECT(24,12), "G3x12y7");
    check_base_class_offset(lv, (C3*)(E3x12*), ABISELECT(16,8), "G3x12y7");
    check_base_class_offset(lv, (D0*)(E3x12*), ABISELECT(32,20), "G3x12y7");
    check_base_class_offset(lv, (E3x12*), ABISELECT(16,8), "G3x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G3x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G3x12y7.ff");
    test_class_info(&lv, &cd_G3x12y7);
    dp->~G3x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x12y7(Test_G3x12y7, "G3x12y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G3x12y7C1Ev();
extern void _ZN7G3x12y7D1Ev();
Name_Map name_map_G3x12y7[] = {
  NSPAIR(_ZN7G3x12y7C1Ev),
  NSPAIR(_ZN7G3x12y7D1Ev),
  {0,0}
};
extern Class_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_E3x12;
extern VTBL_ENTRY _ZTI5E3x12[];
extern  VTBL_ENTRY _ZTV5E3x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x12y7[] = {
  // 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_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_E3x12,    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 _ZTI7G3x12y7[];
extern void _ZN5E3x123fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv)();
extern void ABISELECT(_ZThn24_N5E3x123fooEv,_ZThn20_N5E3x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x12y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G3x12y7[0]),
  (VTBL_ENTRY)&_ZN5E3x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G3x12y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv),
};
extern VTBL_ENTRY _ZTV7G3x12y7[];
extern void _ZN5E3x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x12__7G3x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x12[0]),
  (VTBL_ENTRY)&_ZN5E3x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C35E3x12__7G3x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C35E3x12__7G3x12y7[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv)();
extern void ABISELECT(_ZThn24_N5E3x123fooEv,_ZThn20_N5E3x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x12__7G3x12y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E3x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv),
};
static  VTT_ENTRY vtt_G3x12y7[] = {
  {&(_ZTV7G3x12y7[5]),  5,14},
  {&(_ZTV7G3x12y7[9]),  9,14},
  {&(_ZTV7G3x12y7[13]),  13,14},
  {&(_tg__ZTV5E3x12__7G3x12y7[3]),  3,4},
  {&(_tg__ZTV2C35E3x12__7G3x12y7[3]),  3,3},
  {&(_tg__ZTV2A1__2C35E3x12__7G3x12y7[3]),  3,4},
  {&(_tg__ZTV2A1__5E3x12__7G3x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x12y7[];
extern  VTBL_ENTRY _ZTV7G3x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x12y7[];
static VTBL_ENTRY alt_thunk_names16[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x123fooEv,_ZTv0_n12_N5E3x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x123fooEv,_ZThn20_N5E3x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x123fooEv,_ZThn20_N5E3x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x12y7 = {  "G3x12y7", // class name
  bases_G3x12y7, 6,
  &(vtc_G3x12y7[0]), // expected_vtbl_contents
  &(vtt_G3x12y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G3x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x12y7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x12y7),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  E4x12  : C4 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E4x123fooEv
  ~E4x12(); // tgen
  E4x12(); // tgen
};
//SIG(-1 E4x12) C1{ BC2{ BC3{ Fi} BC4{ v1 Fi} Fi} BC5{ Fi} v1 Fi}


void  E4x12 ::foo(){vfunc_called(this, "_ZN5E4x123fooEv");}
E4x12 ::~E4x12(){ note_dtor("E4x12", this);} // tgen
E4x12 ::E4x12(){ note_ctor("E4x12", this);} // tgen

static void Test_E4x12()
{
  extern Class_Descriptor cd_E4x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E4x12, buf);
    E4x12 *dp, &lv = *(dp=new (buf) E4x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E4x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E4x12)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(12,8), "E4x12");
    check_base_class_offset(lv, (B1*)(C4*), 0, "E4x12");
    check_base_class_offset(lv, (C4*), 0, "E4x12");
    check_base_class_offset(lv, (D0*), ABISELECT(20,16), "E4x12");
    check_field_offset(lv, fd, ABISELECT(24,20), "E4x12.fd");
    test_class_info(&lv, &cd_E4x12);
    dp->~E4x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE4x12(Test_E4x12, "E4x12", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E4x12C1Ev();
extern void _ZN5E4x12D1Ev();
Name_Map name_map_E4x12[] = {
  NSPAIR(_ZN5E4x12C1Ev),
  NSPAIR(_ZN5E4x12D1Ev),
  {0,0}
};
extern Class_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_E4x12[] = {
  // 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(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 _ZTI5E4x12[];
extern void _ZN5E4x123fooEv();
static  VTBL_ENTRY vtc_E4x12[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5E4x12[0]),
  (VTBL_ENTRY)&_ZN5E4x123fooEv,
};
extern VTBL_ENTRY _ZTI5E4x12[];
extern  VTBL_ENTRY _ZTV5E4x12[];
Class_Descriptor cd_E4x12 = {  "E4x12", // class name
  bases_E4x12, 4,
  &(vtc_E4x12[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E4x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E4x12),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  G4x12y0  : E4x12 , F1 {
  int ff;
  ~G4x12y0(); // tgen
  G4x12y0(); // tgen
};
//SIG(1 G4x12y0) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G4x12y0 ::~G4x12y0(){ note_dtor("G4x12y0", this);} // tgen
G4x12y0 ::G4x12y0(){ note_ctor("G4x12y0", this);} // tgen

static void Test_G4x12y0()
{
  extern Class_Descriptor cd_G4x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x12y0, buf);
    G4x12y0 *dp, &lv = *(dp=new (buf) G4x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x12y0)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x12*), ABISELECT(12,8), "G4x12y0");
    check_base_class_offset(lv, (B1*)(C4*)(E4x12*), 0, "G4x12y0");
    check_base_class_offset(lv, (C4*)(E4x12*), 0, "G4x12y0");
    check_base_class_offset(lv, (D0*)(E4x12*), ABISELECT(20,16), "G4x12y0");
    check_base_class_offset(lv, (E4x12*), 0, "G4x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(32,24), "G4x12y0");
    check_field_offset(lv, ff, ABISELECT(44,32), "G4x12y0.ff");
    test_class_info(&lv, &cd_G4x12y0);
    dp->~G4x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x12y0(Test_G4x12y0, "G4x12y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G4x12y0C1Ev();
extern void _ZN7G4x12y0D1Ev();
Name_Map name_map_G4x12y0[] = {
  NSPAIR(_ZN7G4x12y0C1Ev),
  NSPAIR(_ZN7G4x12y0D1Ev),
  {0,0}
};
extern Class_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_E4x12;
extern VTBL_ENTRY _ZTI5E4x12[];
extern  VTBL_ENTRY _ZTV5E4x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x12y0[] = {
  // 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_E4x12,    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_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 _ZTI7G4x12y0[];
extern void _ZN5E4x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x12y0[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7G4x12y0[0]),
  (VTBL_ENTRY)&_ZN5E4x123fooEv,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G4x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTI7G4x12y0[];
extern  VTBL_ENTRY _ZTV7G4x12y0[];
Class_Descriptor cd_G4x12y0 = {  "G4x12y0", // class name
  bases_G4x12y0, 6,
  &(vtc_G4x12y0[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G4x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x12y0),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  G4x12y1  : virtual E4x12 , F1 {
  int ff;
  ~G4x12y1(); // tgen
  G4x12y1(); // tgen
};
//SIG(1 G4x12y1) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G4x12y1 ::~G4x12y1(){ note_dtor("G4x12y1", this);} // tgen
G4x12y1 ::G4x12y1(){ note_ctor("G4x12y1", this);} // tgen

static void Test_G4x12y1()
{
  extern Class_Descriptor cd_G4x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x12y1, buf);
    G4x12y1 *dp, &lv = *(dp=new (buf) G4x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x12y1)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x12*), ABISELECT(28,20), "G4x12y1");
    check_base_class_offset(lv, (B1*)(C4*)(E4x12*), ABISELECT(16,12), "G4x12y1");
    check_base_class_offset(lv, (C4*)(E4x12*), ABISELECT(16,12), "G4x12y1");
    check_base_class_offset(lv, (D0*)(E4x12*), ABISELECT(36,28), "G4x12y1");
    check_base_class_offset(lv, (E4x12*), ABISELECT(16,12), "G4x12y1");
    check_base_class_offset(lv, (F1*), 0, "G4x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x12y1.ff");
    test_class_info(&lv, &cd_G4x12y1);
    dp->~G4x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x12y1(Test_G4x12y1, "G4x12y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G4x12y1C1Ev();
extern void _ZN7G4x12y1D1Ev();
Name_Map name_map_G4x12y1[] = {
  NSPAIR(_ZN7G4x12y1C1Ev),
  NSPAIR(_ZN7G4x12y1D1Ev),
  {0,0}
};
extern Class_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_E4x12;
extern VTBL_ENTRY _ZTI5E4x12[];
extern  VTBL_ENTRY _ZTV5E4x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x12y1[] = {
  // 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(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_E4x12,    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
    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 _ZTI7G4x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E4x123fooEv();
static  VTBL_ENTRY vtc_G4x12y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G4x12y1[0]),
  (VTBL_ENTRY)&_ZN5E4x123fooEv,
};
extern VTBL_ENTRY _ZTV7G4x12y1[];
static  VTT_ENTRY vtt_G4x12y1[] = {
  {&(_ZTV7G4x12y1[3]),  3,8},
  {&(_ZTV7G4x12y1[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G4x12y1[];
extern  VTBL_ENTRY _ZTV7G4x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x12y1[];
Class_Descriptor cd_G4x12y1 = {  "G4x12y1", // class name
  bases_G4x12y1, 6,
  &(vtc_G4x12y1[0]), // expected_vtbl_contents
  &(vtt_G4x12y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G4x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x12y1),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x12y1),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  G4x12y2  : E4x12 , virtual F1 {
  int ff;
  ~G4x12y2(); // tgen
  G4x12y2(); // tgen
};
//SIG(1 G4x12y2) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G4x12y2 ::~G4x12y2(){ note_dtor("G4x12y2", this);} // tgen
G4x12y2 ::G4x12y2(){ note_ctor("G4x12y2", this);} // tgen

static void Test_G4x12y2()
{
  extern Class_Descriptor cd_G4x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x12y2, buf);
    G4x12y2 *dp, &lv = *(dp=new (buf) G4x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x12y2)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x12*), ABISELECT(12,8), "G4x12y2");
    check_base_class_offset(lv, (B1*)(C4*)(E4x12*), 0, "G4x12y2");
    check_base_class_offset(lv, (C4*)(E4x12*), 0, "G4x12y2");
    check_base_class_offset(lv, (D0*)(E4x12*), ABISELECT(20,16), "G4x12y2");
    check_base_class_offset(lv, (E4x12*), 0, "G4x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G4x12y2");
    check_field_offset(lv, ff, ABISELECT(28,24), "G4x12y2.ff");
    test_class_info(&lv, &cd_G4x12y2);
    dp->~G4x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x12y2(Test_G4x12y2, "G4x12y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G4x12y2C1Ev();
extern void _ZN7G4x12y2D1Ev();
Name_Map name_map_G4x12y2[] = {
  NSPAIR(_ZN7G4x12y2C1Ev),
  NSPAIR(_ZN7G4x12y2D1Ev),
  {0,0}
};
extern Class_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_E4x12;
extern VTBL_ENTRY _ZTI5E4x12[];
extern  VTBL_ENTRY _ZTV5E4x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x12y2[] = {
  // 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_E4x12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7G4x12y2[];
extern void _ZN5E4x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x12y2[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x12y2[0]),
  (VTBL_ENTRY)&_ZN5E4x123fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G4x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G4x12y2[];
static  VTT_ENTRY vtt_G4x12y2[] = {
  {&(_ZTV7G4x12y2[3]),  3,8},
  {&(_ZTV7G4x12y2[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G4x12y2[];
extern  VTBL_ENTRY _ZTV7G4x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x12y2[];
Class_Descriptor cd_G4x12y2 = {  "G4x12y2", // class name
  bases_G4x12y2, 6,
  &(vtc_G4x12y2[0]), // expected_vtbl_contents
  &(vtt_G4x12y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G4x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x12y2),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x12y2),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  G4x12y3  : virtual E4x12 , virtual F1 {
  int ff;
  ~G4x12y3(); // tgen
  G4x12y3(); // tgen
};
//SIG(1 G4x12y3) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G4x12y3 ::~G4x12y3(){ note_dtor("G4x12y3", this);} // tgen
G4x12y3 ::G4x12y3(){ note_ctor("G4x12y3", this);} // tgen

static void Test_G4x12y3()
{
  extern Class_Descriptor cd_G4x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G4x12y3, buf);
    G4x12y3 *dp, &lv = *(dp=new (buf) G4x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G4x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x12y3)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x12*), ABISELECT(28,16), "G4x12y3");
    check_base_class_offset(lv, (B1*)(C4*)(E4x12*), ABISELECT(16,8), "G4x12y3");
    check_base_class_offset(lv, (C4*)(E4x12*), ABISELECT(16,8), "G4x12y3");
    check_base_class_offset(lv, (D0*)(E4x12*), ABISELECT(36,24), "G4x12y3");
    check_base_class_offset(lv, (E4x12*), ABISELECT(16,8), "G4x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G4x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G4x12y3.ff");
    test_class_info(&lv, &cd_G4x12y3);
    dp->~G4x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x12y3(Test_G4x12y3, "G4x12y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G4x12y3C1Ev();
extern void _ZN7G4x12y3D1Ev();
Name_Map name_map_G4x12y3[] = {
  NSPAIR(_ZN7G4x12y3C1Ev),
  NSPAIR(_ZN7G4x12y3D1Ev),
  {0,0}
};
extern Class_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_E4x12;
extern VTBL_ENTRY _ZTI5E4x12[];
extern  VTBL_ENTRY _ZTV5E4x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x12y3[] = {
  // 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(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_E4x12,    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_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 _ZTI7G4x12y3[];
extern void _ZN5E4x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x12y3[] = {
  ABISELECT(48,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x12y3[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G4x12y3[0]),
  (VTBL_ENTRY)&_ZN5E4x123fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G4x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G4x12y3[];
static  VTT_ENTRY vtt_G4x12y3[] = {
  {&(_ZTV7G4x12y3[4]),  4,12},
  {&(_ZTV7G4x12y3[7]),  7,12},
  {&(_ZTV7G4x12y3[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G4x12y3[];
extern  VTBL_ENTRY _ZTV7G4x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x12y3[];
Class_Descriptor cd_G4x12y3 = {  "G4x12y3", // class name
  bases_G4x12y3, 6,
  &(vtc_G4x12y3[0]), // expected_vtbl_contents
  &(vtt_G4x12y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G4x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x12y3),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x12y3),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  G4x12y4  : E4x12 , F0 {
  int ff;
  ~G4x12y4(); // tgen
  G4x12y4(); // tgen
};
//SIG(1 G4x12y4) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G4x12y4 ::~G4x12y4(){ note_dtor("G4x12y4", this);} // tgen
G4x12y4 ::G4x12y4(){ note_ctor("G4x12y4", this);} // tgen

static void Test_G4x12y4()
{
  extern Class_Descriptor cd_G4x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G4x12y4, buf);
    G4x12y4 *dp, &lv = *(dp=new (buf) G4x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G4x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x12y4)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x12*), ABISELECT(12,8), "G4x12y4");
    check_base_class_offset(lv, (B1*)(C4*)(E4x12*), 0, "G4x12y4");
    check_base_class_offset(lv, (C4*)(E4x12*), 0, "G4x12y4");
    check_base_class_offset(lv, (D0*)(E4x12*), ABISELECT(20,16), "G4x12y4");
    check_base_class_offset(lv, (E4x12*), 0, "G4x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(28,24), "G4x12y4");
    check_field_offset(lv, ff, ABISELECT(32,28), "G4x12y4.ff");
    test_class_info(&lv, &cd_G4x12y4);
    dp->~G4x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x12y4(Test_G4x12y4, "G4x12y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G4x12y4C1Ev();
extern void _ZN7G4x12y4D1Ev();
Name_Map name_map_G4x12y4[] = {
  NSPAIR(_ZN7G4x12y4C1Ev),
  NSPAIR(_ZN7G4x12y4D1Ev),
  {0,0}
};
extern Class_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_E4x12;
extern VTBL_ENTRY _ZTI5E4x12[];
extern  VTBL_ENTRY _ZTV5E4x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x12y4[] = {
  // 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_E4x12,    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_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 _ZTI7G4x12y4[];
extern void _ZN5E4x123fooEv();
static  VTBL_ENTRY vtc_G4x12y4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7G4x12y4[0]),
  (VTBL_ENTRY)&_ZN5E4x123fooEv,
};
extern VTBL_ENTRY _ZTI7G4x12y4[];
extern  VTBL_ENTRY _ZTV7G4x12y4[];
Class_Descriptor cd_G4x12y4 = {  "G4x12y4", // class name
  bases_G4x12y4, 6,
  &(vtc_G4x12y4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G4x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x12y4),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  G4x12y5  : virtual E4x12 , F0 {
  int ff;
  ~G4x12y5(); // tgen
  G4x12y5(); // tgen
};
//SIG(1 G4x12y5) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G4x12y5 ::~G4x12y5(){ note_dtor("G4x12y5", this);} // tgen
G4x12y5 ::G4x12y5(){ note_ctor("G4x12y5", this);} // tgen

static void Test_G4x12y5()
{
  extern Class_Descriptor cd_G4x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x12y5, buf);
    G4x12y5 *dp, &lv = *(dp=new (buf) G4x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x12y5)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x12*), ABISELECT(28,20), "G4x12y5");
    check_base_class_offset(lv, (B1*)(C4*)(E4x12*), ABISELECT(16,12), "G4x12y5");
    check_base_class_offset(lv, (C4*)(E4x12*), ABISELECT(16,12), "G4x12y5");
    check_base_class_offset(lv, (D0*)(E4x12*), ABISELECT(36,28), "G4x12y5");
    check_base_class_offset(lv, (E4x12*), ABISELECT(16,12), "G4x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G4x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x12y5.ff");
    test_class_info(&lv, &cd_G4x12y5);
    dp->~G4x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x12y5(Test_G4x12y5, "G4x12y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G4x12y5C1Ev();
extern void _ZN7G4x12y5D1Ev();
Name_Map name_map_G4x12y5[] = {
  NSPAIR(_ZN7G4x12y5C1Ev),
  NSPAIR(_ZN7G4x12y5D1Ev),
  {0,0}
};
extern Class_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_E4x12;
extern VTBL_ENTRY _ZTI5E4x12[];
extern  VTBL_ENTRY _ZTV5E4x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x12y5[] = {
  // 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(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_E4x12,    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_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 _ZTI7G4x12y5[];
extern void _ZN5E4x123fooEv();
static  VTBL_ENTRY vtc_G4x12y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x12y5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G4x12y5[0]),
  (VTBL_ENTRY)&_ZN5E4x123fooEv,
};
extern VTBL_ENTRY _ZTV7G4x12y5[];
static  VTT_ENTRY vtt_G4x12y5[] = {
  {&(_ZTV7G4x12y5[3]),  3,7},
  {&(_ZTV7G4x12y5[6]),  6,7},
};
extern VTBL_ENTRY _ZTI7G4x12y5[];
extern  VTBL_ENTRY _ZTV7G4x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x12y5[];
Class_Descriptor cd_G4x12y5 = {  "G4x12y5", // class name
  bases_G4x12y5, 6,
  &(vtc_G4x12y5[0]), // expected_vtbl_contents
  &(vtt_G4x12y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G4x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x12y5),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x12y5),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  G4x12y6  : E4x12 , virtual F0 {
  int ff;
  ~G4x12y6(); // tgen
  G4x12y6(); // tgen
};
//SIG(1 G4x12y6) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G4x12y6 ::~G4x12y6(){ note_dtor("G4x12y6", this);} // tgen
G4x12y6 ::G4x12y6(){ note_ctor("G4x12y6", this);} // tgen

static void Test_G4x12y6()
{
  extern Class_Descriptor cd_G4x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G4x12y6, buf);
    G4x12y6 *dp, &lv = *(dp=new (buf) G4x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G4x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x12y6)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x12*), ABISELECT(12,8), "G4x12y6");
    check_base_class_offset(lv, (B1*)(C4*)(E4x12*), 0, "G4x12y6");
    check_base_class_offset(lv, (C4*)(E4x12*), 0, "G4x12y6");
    check_base_class_offset(lv, (D0*)(E4x12*), ABISELECT(20,16), "G4x12y6");
    check_base_class_offset(lv, (E4x12*), 0, "G4x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G4x12y6");
    check_field_offset(lv, ff, ABISELECT(28,24), "G4x12y6.ff");
    test_class_info(&lv, &cd_G4x12y6);
    dp->~G4x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x12y6(Test_G4x12y6, "G4x12y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G4x12y6C1Ev();
extern void _ZN7G4x12y6D1Ev();
Name_Map name_map_G4x12y6[] = {
  NSPAIR(_ZN7G4x12y6C1Ev),
  NSPAIR(_ZN7G4x12y6D1Ev),
  {0,0}
};
extern Class_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_E4x12;
extern VTBL_ENTRY _ZTI5E4x12[];
extern  VTBL_ENTRY _ZTV5E4x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x12y6[] = {
  // 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_E4x12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7G4x12y6[];
extern void _ZN5E4x123fooEv();
static  VTBL_ENTRY vtc_G4x12y6[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x12y6[0]),
  (VTBL_ENTRY)&_ZN5E4x123fooEv,
};
extern VTBL_ENTRY _ZTV7G4x12y6[];
static  VTT_ENTRY vtt_G4x12y6[] = {
  {&(_ZTV7G4x12y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G4x12y6[];
extern  VTBL_ENTRY _ZTV7G4x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x12y6[];
Class_Descriptor cd_G4x12y6 = {  "G4x12y6", // class name
  bases_G4x12y6, 6,
  &(vtc_G4x12y6[0]), // expected_vtbl_contents
  &(vtt_G4x12y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G4x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x12y6),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x12y6),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  G4x12y7  : virtual E4x12 , virtual F0 {
  int ff;
  ~G4x12y7(); // tgen
  G4x12y7(); // tgen
};
//SIG(1 G4x12y7) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G4x12y7 ::~G4x12y7(){ note_dtor("G4x12y7", this);} // tgen
G4x12y7 ::G4x12y7(){ note_ctor("G4x12y7", this);} // tgen

static void Test_G4x12y7()
{
  extern Class_Descriptor cd_G4x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x12y7, buf);
    G4x12y7 *dp, &lv = *(dp=new (buf) G4x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x12y7)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x12*), ABISELECT(28,16), "G4x12y7");
    check_base_class_offset(lv, (B1*)(C4*)(E4x12*), ABISELECT(16,8), "G4x12y7");
    check_base_class_offset(lv, (C4*)(E4x12*), ABISELECT(16,8), "G4x12y7");
    check_base_class_offset(lv, (D0*)(E4x12*), ABISELECT(36,24), "G4x12y7");
    check_base_class_offset(lv, (E4x12*), ABISELECT(16,8), "G4x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G4x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G4x12y7.ff");
    test_class_info(&lv, &cd_G4x12y7);
    dp->~G4x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x12y7(Test_G4x12y7, "G4x12y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G4x12y7C1Ev();
extern void _ZN7G4x12y7D1Ev();
Name_Map name_map_G4x12y7[] = {
  NSPAIR(_ZN7G4x12y7C1Ev),
  NSPAIR(_ZN7G4x12y7D1Ev),
  {0,0}
};
extern Class_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_E4x12;
extern VTBL_ENTRY _ZTI5E4x12[];
extern  VTBL_ENTRY _ZTV5E4x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x12y7[] = {
  // 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(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_E4x12,    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_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 _ZTI7G4x12y7[];
extern void _ZN5E4x123fooEv();
static  VTBL_ENTRY vtc_G4x12y7[] = {
  ABISELECT(44,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x12y7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G4x12y7[0]),
  (VTBL_ENTRY)&_ZN5E4x123fooEv,
};
extern VTBL_ENTRY _ZTV7G4x12y7[];
static  VTT_ENTRY vtt_G4x12y7[] = {
  {&(_ZTV7G4x12y7[4]),  4,8},
  {&(_ZTV7G4x12y7[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G4x12y7[];
extern  VTBL_ENTRY _ZTV7G4x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x12y7[];
Class_Descriptor cd_G4x12y7 = {  "G4x12y7", // class name
  bases_G4x12y7, 6,
  &(vtc_G4x12y7[0]), // expected_vtbl_contents
  &(vtt_G4x12y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G4x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x12y7),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x12y7),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  E5x12  : C5 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E5x123fooEv
  ~E5x12(); // tgen
  E5x12(); // tgen
};
//SIG(-1 E5x12) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} Fi} BC5{ Fi} v1 Fi}


void  E5x12 ::foo(){vfunc_called(this, "_ZN5E5x123fooEv");}
E5x12 ::~E5x12(){ note_dtor("E5x12", this);} // tgen
E5x12 ::E5x12(){ note_ctor("E5x12", this);} // tgen

static void Test_E5x12()
{
  extern Class_Descriptor cd_E5x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E5x12, buf);
    E5x12 *dp, &lv = *(dp=new (buf) E5x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E5x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E5x12)");
    check_base_class_offset(lv, (A1*)(C5*), 0, "E5x12");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(16,8), "E5x12");
    check_base_class_offset(lv, (C5*), 0, "E5x12");
    check_base_class_offset(lv, (D0*), ABISELECT(32,20), "E5x12");
    check_field_offset(lv, fd, ABISELECT(36,24), "E5x12.fd");
    test_class_info(&lv, &cd_E5x12);
    dp->~E5x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE5x12(Test_E5x12, "E5x12", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E5x12C1Ev();
extern void _ZN5E5x12D1Ev();
Name_Map name_map_E5x12[] = {
  NSPAIR(_ZN5E5x12C1Ev),
  NSPAIR(_ZN5E5x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x12[] = {
  // 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_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 _ZTI5E5x12[];
extern void _ZN5E5x123fooEv();
extern void ABISELECT(_ZThn16_N5E5x123fooEv,_ZThn8_N5E5x123fooEv)();
static  VTBL_ENTRY vtc_E5x12[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5E5x12[0]),
  (VTBL_ENTRY)&_ZN5E5x123fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E5x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N5E5x123fooEv,_ZThn8_N5E5x123fooEv),
};
extern VTBL_ENTRY _ZTI5E5x12[];
extern  VTBL_ENTRY _ZTV5E5x12[];
Class_Descriptor cd_E5x12 = {  "E5x12", // class name
  bases_E5x12, 4,
  &(vtc_E5x12[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E5x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E5x12),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  G5x12y0  : E5x12 , F1 {
  int ff;
  ~G5x12y0(); // tgen
  G5x12y0(); // tgen
};
//SIG(1 G5x12y0) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G5x12y0 ::~G5x12y0(){ note_dtor("G5x12y0", this);} // tgen
G5x12y0 ::G5x12y0(){ note_ctor("G5x12y0", this);} // tgen

static void Test_G5x12y0()
{
  extern Class_Descriptor cd_G5x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G5x12y0, buf);
    G5x12y0 *dp, &lv = *(dp=new (buf) G5x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G5x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x12y0)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x12*), 0, "G5x12y0");
    check_base_class_offset(lv, (B1*)(C5*)(E5x12*), ABISELECT(16,8), "G5x12y0");
    check_base_class_offset(lv, (C5*)(E5x12*), 0, "G5x12y0");
    check_base_class_offset(lv, (D0*)(E5x12*), ABISELECT(32,20), "G5x12y0");
    check_base_class_offset(lv, (E5x12*), 0, "G5x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(40,28), "G5x12y0");
    check_field_offset(lv, ff, ABISELECT(52,36), "G5x12y0.ff");
    test_class_info(&lv, &cd_G5x12y0);
    dp->~G5x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x12y0(Test_G5x12y0, "G5x12y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G5x12y0C1Ev();
extern void _ZN7G5x12y0D1Ev();
Name_Map name_map_G5x12y0[] = {
  NSPAIR(_ZN7G5x12y0C1Ev),
  NSPAIR(_ZN7G5x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x12;
extern VTBL_ENTRY _ZTI5E5x12[];
extern  VTBL_ENTRY _ZTV5E5x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x12y0[] = {
  // 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_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_E5x12,    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
    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 _ZTI7G5x12y0[];
extern void _ZN5E5x123fooEv();
extern void ABISELECT(_ZThn16_N5E5x123fooEv,_ZThn8_N5E5x123fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x12y0[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7G5x12y0[0]),
  (VTBL_ENTRY)&_ZN5E5x123fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G5x12y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N5E5x123fooEv,_ZThn8_N5E5x123fooEv),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G5x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTI7G5x12y0[];
extern  VTBL_ENTRY _ZTV7G5x12y0[];
Class_Descriptor cd_G5x12y0 = {  "G5x12y0", // class name
  bases_G5x12y0, 6,
  &(vtc_G5x12y0[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G5x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x12y0),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  G5x12y1  : virtual E5x12 , F1 {
  int ff;
  ~G5x12y1(); // tgen
  G5x12y1(); // tgen
};
//SIG(1 G5x12y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G5x12y1 ::~G5x12y1(){ note_dtor("G5x12y1", this);} // tgen
G5x12y1 ::G5x12y1(){ note_ctor("G5x12y1", this);} // tgen

static void Test_G5x12y1()
{
  extern Class_Descriptor cd_G5x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G5x12y1, buf);
    G5x12y1 *dp, &lv = *(dp=new (buf) G5x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G5x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x12y1)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x12*), ABISELECT(16,12), "G5x12y1");
    check_base_class_offset(lv, (B1*)(C5*)(E5x12*), ABISELECT(32,20), "G5x12y1");
    check_base_class_offset(lv, (C5*)(E5x12*), ABISELECT(16,12), "G5x12y1");
    check_base_class_offset(lv, (D0*)(E5x12*), ABISELECT(48,32), "G5x12y1");
    check_base_class_offset(lv, (E5x12*), ABISELECT(16,12), "G5x12y1");
    check_base_class_offset(lv, (F1*), 0, "G5x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x12y1.ff");
    test_class_info(&lv, &cd_G5x12y1);
    dp->~G5x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x12y1(Test_G5x12y1, "G5x12y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G5x12y1C1Ev();
extern void _ZN7G5x12y1D1Ev();
Name_Map name_map_G5x12y1[] = {
  NSPAIR(_ZN7G5x12y1C1Ev),
  NSPAIR(_ZN7G5x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x12;
extern VTBL_ENTRY _ZTI5E5x12[];
extern  VTBL_ENTRY _ZTV5E5x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x12y1[] = {
  // 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_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_E5x12,    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
    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 _ZTI7G5x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E5x123fooEv();
extern void ABISELECT(_ZThn16_N5E5x123fooEv,_ZThn8_N5E5x123fooEv)();
static  VTBL_ENTRY vtc_G5x12y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G5x12y1[0]),
  (VTBL_ENTRY)&_ZN5E5x123fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G5x12y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N5E5x123fooEv,_ZThn8_N5E5x123fooEv),
};
extern VTBL_ENTRY _ZTV7G5x12y1[];
static  VTT_ENTRY vtt_G5x12y1[] = {
  {&(_ZTV7G5x12y1[3]),  3,11},
  {&(_ZTV7G5x12y1[7]),  7,11},
  {&(_ZTV7G5x12y1[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G5x12y1[];
extern  VTBL_ENTRY _ZTV7G5x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x12y1[];
Class_Descriptor cd_G5x12y1 = {  "G5x12y1", // class name
  bases_G5x12y1, 6,
  &(vtc_G5x12y1[0]), // expected_vtbl_contents
  &(vtt_G5x12y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G5x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x12y1),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x12y1),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  G5x12y2  : E5x12 , virtual F1 {
  int ff;
  ~G5x12y2(); // tgen
  G5x12y2(); // tgen
};
//SIG(1 G5x12y2) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G5x12y2 ::~G5x12y2(){ note_dtor("G5x12y2", this);} // tgen
G5x12y2 ::G5x12y2(){ note_ctor("G5x12y2", this);} // tgen

static void Test_G5x12y2()
{
  extern Class_Descriptor cd_G5x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G5x12y2, buf);
    G5x12y2 *dp, &lv = *(dp=new (buf) G5x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G5x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x12y2)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x12*), 0, "G5x12y2");
    check_base_class_offset(lv, (B1*)(C5*)(E5x12*), ABISELECT(16,8), "G5x12y2");
    check_base_class_offset(lv, (C5*)(E5x12*), 0, "G5x12y2");
    check_base_class_offset(lv, (D0*)(E5x12*), ABISELECT(32,20), "G5x12y2");
    check_base_class_offset(lv, (E5x12*), 0, "G5x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G5x12y2");
    check_field_offset(lv, ff, ABISELECT(40,28), "G5x12y2.ff");
    test_class_info(&lv, &cd_G5x12y2);
    dp->~G5x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x12y2(Test_G5x12y2, "G5x12y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G5x12y2C1Ev();
extern void _ZN7G5x12y2D1Ev();
Name_Map name_map_G5x12y2[] = {
  NSPAIR(_ZN7G5x12y2C1Ev),
  NSPAIR(_ZN7G5x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x12;
extern VTBL_ENTRY _ZTI5E5x12[];
extern  VTBL_ENTRY _ZTV5E5x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x12y2[] = {
  // 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_E5x12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7G5x12y2[];
extern void _ZN5E5x123fooEv();
extern void ABISELECT(_ZThn16_N5E5x123fooEv,_ZThn8_N5E5x123fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x12y2[] = {
  ABISELECT(48,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x12y2[0]),
  (VTBL_ENTRY)&_ZN5E5x123fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G5x12y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N5E5x123fooEv,_ZThn8_N5E5x123fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G5x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G5x12y2[];
static  VTT_ENTRY vtt_G5x12y2[] = {
  {&(_ZTV7G5x12y2[3]),  3,11},
  {&(_ZTV7G5x12y2[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G5x12y2[];
extern  VTBL_ENTRY _ZTV7G5x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x12y2[];
Class_Descriptor cd_G5x12y2 = {  "G5x12y2", // class name
  bases_G5x12y2, 6,
  &(vtc_G5x12y2[0]), // expected_vtbl_contents
  &(vtt_G5x12y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G5x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x12y2),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x12y2),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  G5x12y3  : virtual E5x12 , virtual F1 {
  int ff;
  ~G5x12y3(); // tgen
  G5x12y3(); // tgen
};
//SIG(1 G5x12y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G5x12y3 ::~G5x12y3(){ note_dtor("G5x12y3", this);} // tgen
G5x12y3 ::G5x12y3(){ note_ctor("G5x12y3", this);} // tgen

static void Test_G5x12y3()
{
  extern Class_Descriptor cd_G5x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G5x12y3, buf);
    G5x12y3 *dp, &lv = *(dp=new (buf) G5x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G5x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x12y3)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x12*), ABISELECT(16,8), "G5x12y3");
    check_base_class_offset(lv, (B1*)(C5*)(E5x12*), ABISELECT(32,16), "G5x12y3");
    check_base_class_offset(lv, (C5*)(E5x12*), ABISELECT(16,8), "G5x12y3");
    check_base_class_offset(lv, (D0*)(E5x12*), ABISELECT(48,28), "G5x12y3");
    check_base_class_offset(lv, (E5x12*), ABISELECT(16,8), "G5x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G5x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G5x12y3.ff");
    test_class_info(&lv, &cd_G5x12y3);
    dp->~G5x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x12y3(Test_G5x12y3, "G5x12y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G5x12y3C1Ev();
extern void _ZN7G5x12y3D1Ev();
Name_Map name_map_G5x12y3[] = {
  NSPAIR(_ZN7G5x12y3C1Ev),
  NSPAIR(_ZN7G5x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x12;
extern VTBL_ENTRY _ZTI5E5x12[];
extern  VTBL_ENTRY _ZTV5E5x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x12y3[] = {
  // 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_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_E5x12,    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
    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 _ZTI7G5x12y3[];
extern void _ZN5E5x123fooEv();
extern void ABISELECT(_ZThn16_N5E5x123fooEv,_ZThn8_N5E5x123fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x12y3[] = {
  ABISELECT(56,36),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x12y3[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G5x12y3[0]),
  (VTBL_ENTRY)&_ZN5E5x123fooEv,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G5x12y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N5E5x123fooEv,_ZThn8_N5E5x123fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G5x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G5x12y3[];
static  VTT_ENTRY vtt_G5x12y3[] = {
  {&(_ZTV7G5x12y3[4]),  4,15},
  {&(_ZTV7G5x12y3[7]),  7,15},
  {&(_ZTV7G5x12y3[10]),  10,15},
  {&(_ZTV7G5x12y3[14]),  14,15},
};
extern VTBL_ENTRY _ZTI7G5x12y3[];
extern  VTBL_ENTRY _ZTV7G5x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x12y3[];
Class_Descriptor cd_G5x12y3 = {  "G5x12y3", // class name
  bases_G5x12y3, 6,
  &(vtc_G5x12y3[0]), // expected_vtbl_contents
  &(vtt_G5x12y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G5x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x12y3),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x12y3),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  G5x12y4  : E5x12 , F0 {
  int ff;
  ~G5x12y4(); // tgen
  G5x12y4(); // tgen
};
//SIG(1 G5x12y4) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G5x12y4 ::~G5x12y4(){ note_dtor("G5x12y4", this);} // tgen
G5x12y4 ::G5x12y4(){ note_ctor("G5x12y4", this);} // tgen

static void Test_G5x12y4()
{
  extern Class_Descriptor cd_G5x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G5x12y4, buf);
    G5x12y4 *dp, &lv = *(dp=new (buf) G5x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G5x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x12y4)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x12*), 0, "G5x12y4");
    check_base_class_offset(lv, (B1*)(C5*)(E5x12*), ABISELECT(16,8), "G5x12y4");
    check_base_class_offset(lv, (C5*)(E5x12*), 0, "G5x12y4");
    check_base_class_offset(lv, (D0*)(E5x12*), ABISELECT(32,20), "G5x12y4");
    check_base_class_offset(lv, (E5x12*), 0, "G5x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(40,28), "G5x12y4");
    check_field_offset(lv, ff, ABISELECT(44,32), "G5x12y4.ff");
    test_class_info(&lv, &cd_G5x12y4);
    dp->~G5x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x12y4(Test_G5x12y4, "G5x12y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G5x12y4C1Ev();
extern void _ZN7G5x12y4D1Ev();
Name_Map name_map_G5x12y4[] = {
  NSPAIR(_ZN7G5x12y4C1Ev),
  NSPAIR(_ZN7G5x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x12;
extern VTBL_ENTRY _ZTI5E5x12[];
extern  VTBL_ENTRY _ZTV5E5x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x12y4[] = {
  // 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_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_E5x12,    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
    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 _ZTI7G5x12y4[];
extern void _ZN5E5x123fooEv();
extern void ABISELECT(_ZThn16_N5E5x123fooEv,_ZThn8_N5E5x123fooEv)();
static  VTBL_ENTRY vtc_G5x12y4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7G5x12y4[0]),
  (VTBL_ENTRY)&_ZN5E5x123fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G5x12y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N5E5x123fooEv,_ZThn8_N5E5x123fooEv),
};
extern VTBL_ENTRY _ZTI7G5x12y4[];
extern  VTBL_ENTRY _ZTV7G5x12y4[];
Class_Descriptor cd_G5x12y4 = {  "G5x12y4", // class name
  bases_G5x12y4, 6,
  &(vtc_G5x12y4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G5x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x12y4),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  G5x12y5  : virtual E5x12 , F0 {
  int ff;
  ~G5x12y5(); // tgen
  G5x12y5(); // tgen
};
//SIG(1 G5x12y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G5x12y5 ::~G5x12y5(){ note_dtor("G5x12y5", this);} // tgen
G5x12y5 ::G5x12y5(){ note_ctor("G5x12y5", this);} // tgen

static void Test_G5x12y5()
{
  extern Class_Descriptor cd_G5x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G5x12y5, buf);
    G5x12y5 *dp, &lv = *(dp=new (buf) G5x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G5x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x12y5)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x12*), ABISELECT(16,12), "G5x12y5");
    check_base_class_offset(lv, (B1*)(C5*)(E5x12*), ABISELECT(32,20), "G5x12y5");
    check_base_class_offset(lv, (C5*)(E5x12*), ABISELECT(16,12), "G5x12y5");
    check_base_class_offset(lv, (D0*)(E5x12*), ABISELECT(48,32), "G5x12y5");
    check_base_class_offset(lv, (E5x12*), ABISELECT(16,12), "G5x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G5x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x12y5.ff");
    test_class_info(&lv, &cd_G5x12y5);
    dp->~G5x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x12y5(Test_G5x12y5, "G5x12y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G5x12y5C1Ev();
extern void _ZN7G5x12y5D1Ev();
Name_Map name_map_G5x12y5[] = {
  NSPAIR(_ZN7G5x12y5C1Ev),
  NSPAIR(_ZN7G5x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x12;
extern VTBL_ENTRY _ZTI5E5x12[];
extern  VTBL_ENTRY _ZTV5E5x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x12y5[] = {
  // 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_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_E5x12,    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
    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 _ZTI7G5x12y5[];
extern void _ZN5E5x123fooEv();
extern void ABISELECT(_ZThn16_N5E5x123fooEv,_ZThn8_N5E5x123fooEv)();
static  VTBL_ENTRY vtc_G5x12y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x12y5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G5x12y5[0]),
  (VTBL_ENTRY)&_ZN5E5x123fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G5x12y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N5E5x123fooEv,_ZThn8_N5E5x123fooEv),
};
extern VTBL_ENTRY _ZTV7G5x12y5[];
static  VTT_ENTRY vtt_G5x12y5[] = {
  {&(_ZTV7G5x12y5[3]),  3,10},
  {&(_ZTV7G5x12y5[6]),  6,10},
  {&(_ZTV7G5x12y5[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G5x12y5[];
extern  VTBL_ENTRY _ZTV7G5x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x12y5[];
Class_Descriptor cd_G5x12y5 = {  "G5x12y5", // class name
  bases_G5x12y5, 6,
  &(vtc_G5x12y5[0]), // expected_vtbl_contents
  &(vtt_G5x12y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G5x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x12y5),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x12y5),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  G5x12y6  : E5x12 , virtual F0 {
  int ff;
  ~G5x12y6(); // tgen
  G5x12y6(); // tgen
};
//SIG(1 G5x12y6) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G5x12y6 ::~G5x12y6(){ note_dtor("G5x12y6", this);} // tgen
G5x12y6 ::G5x12y6(){ note_ctor("G5x12y6", this);} // tgen

static void Test_G5x12y6()
{
  extern Class_Descriptor cd_G5x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G5x12y6, buf);
    G5x12y6 *dp, &lv = *(dp=new (buf) G5x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G5x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x12y6)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x12*), 0, "G5x12y6");
    check_base_class_offset(lv, (B1*)(C5*)(E5x12*), ABISELECT(16,8), "G5x12y6");
    check_base_class_offset(lv, (C5*)(E5x12*), 0, "G5x12y6");
    check_base_class_offset(lv, (D0*)(E5x12*), ABISELECT(32,20), "G5x12y6");
    check_base_class_offset(lv, (E5x12*), 0, "G5x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G5x12y6");
    check_field_offset(lv, ff, ABISELECT(40,28), "G5x12y6.ff");
    test_class_info(&lv, &cd_G5x12y6);
    dp->~G5x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x12y6(Test_G5x12y6, "G5x12y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G5x12y6C1Ev();
extern void _ZN7G5x12y6D1Ev();
Name_Map name_map_G5x12y6[] = {
  NSPAIR(_ZN7G5x12y6C1Ev),
  NSPAIR(_ZN7G5x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x12;
extern VTBL_ENTRY _ZTI5E5x12[];
extern  VTBL_ENTRY _ZTV5E5x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x12y6[] = {
  // 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_E5x12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7G5x12y6[];
extern void _ZN5E5x123fooEv();
extern void ABISELECT(_ZThn16_N5E5x123fooEv,_ZThn8_N5E5x123fooEv)();
static  VTBL_ENTRY vtc_G5x12y6[] = {
  ABISELECT(44,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x12y6[0]),
  (VTBL_ENTRY)&_ZN5E5x123fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G5x12y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N5E5x123fooEv,_ZThn8_N5E5x123fooEv),
};
extern VTBL_ENTRY _ZTV7G5x12y6[];
static  VTT_ENTRY vtt_G5x12y6[] = {
  {&(_ZTV7G5x12y6[3]),  3,7},
};
extern VTBL_ENTRY _ZTI7G5x12y6[];
extern  VTBL_ENTRY _ZTV7G5x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x12y6[];
Class_Descriptor cd_G5x12y6 = {  "G5x12y6", // class name
  bases_G5x12y6, 6,
  &(vtc_G5x12y6[0]), // expected_vtbl_contents
  &(vtt_G5x12y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G5x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x12y6),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x12y6),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  G5x12y7  : virtual E5x12 , virtual F0 {
  int ff;
  ~G5x12y7(); // tgen
  G5x12y7(); // tgen
};
//SIG(1 G5x12y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G5x12y7 ::~G5x12y7(){ note_dtor("G5x12y7", this);} // tgen
G5x12y7 ::G5x12y7(){ note_ctor("G5x12y7", this);} // tgen

static void Test_G5x12y7()
{
  extern Class_Descriptor cd_G5x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G5x12y7, buf);
    G5x12y7 *dp, &lv = *(dp=new (buf) G5x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G5x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x12y7)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x12*), ABISELECT(16,8), "G5x12y7");
    check_base_class_offset(lv, (B1*)(C5*)(E5x12*), ABISELECT(32,16), "G5x12y7");
    check_base_class_offset(lv, (C5*)(E5x12*), ABISELECT(16,8), "G5x12y7");
    check_base_class_offset(lv, (D0*)(E5x12*), ABISELECT(48,28), "G5x12y7");
    check_base_class_offset(lv, (E5x12*), ABISELECT(16,8), "G5x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G5x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G5x12y7.ff");
    test_class_info(&lv, &cd_G5x12y7);
    dp->~G5x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x12y7(Test_G5x12y7, "G5x12y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G5x12y7C1Ev();
extern void _ZN7G5x12y7D1Ev();
Name_Map name_map_G5x12y7[] = {
  NSPAIR(_ZN7G5x12y7C1Ev),
  NSPAIR(_ZN7G5x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x12;
extern VTBL_ENTRY _ZTI5E5x12[];
extern  VTBL_ENTRY _ZTV5E5x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x12y7[] = {
  // 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_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_E5x12,    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
    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 _ZTI7G5x12y7[];
extern void _ZN5E5x123fooEv();
extern void ABISELECT(_ZThn16_N5E5x123fooEv,_ZThn8_N5E5x123fooEv)();
static  VTBL_ENTRY vtc_G5x12y7[] = {
  ABISELECT(56,36),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x12y7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G5x12y7[0]),
  (VTBL_ENTRY)&_ZN5E5x123fooEv,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G5x12y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N5E5x123fooEv,_ZThn8_N5E5x123fooEv),
};
extern VTBL_ENTRY _ZTV7G5x12y7[];
static  VTT_ENTRY vtt_G5x12y7[] = {
  {&(_ZTV7G5x12y7[4]),  4,11},
  {&(_ZTV7G5x12y7[7]),  7,11},
  {&(_ZTV7G5x12y7[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G5x12y7[];
extern  VTBL_ENTRY _ZTV7G5x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x12y7[];
Class_Descriptor cd_G5x12y7 = {  "G5x12y7", // class name
  bases_G5x12y7, 6,
  &(vtc_G5x12y7[0]), // expected_vtbl_contents
  &(vtt_G5x12y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G5x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x12y7),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x12y7),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  E6x12  : C6 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E6x123fooEv
  ~E6x12(); // tgen
  E6x12(); // tgen
};
//SIG(-1 E6x12) C1{ BC2{ VBC3{ Fi} BC4{ v1 Fi} Fi} BC5{ Fi} v1 Fi}


void  E6x12 ::foo(){vfunc_called(this, "_ZN5E6x123fooEv");}
E6x12 ::~E6x12(){ note_dtor("E6x12", this);} // tgen
E6x12 ::E6x12(){ note_ctor("E6x12", this);} // tgen

static void Test_E6x12()
{
  extern Class_Descriptor cd_E6x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E6x12, buf);
    E6x12 *dp, &lv = *(dp=new (buf) E6x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E6x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E6x12)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(24,20), "E6x12");
    check_base_class_offset(lv, (B1*)(C6*), 0, "E6x12");
    check_base_class_offset(lv, (C6*), 0, "E6x12");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E6x12");
    check_field_offset(lv, fd, ABISELECT(20,16), "E6x12.fd");
    test_class_info(&lv, &cd_E6x12);
    dp->~E6x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE6x12(Test_E6x12, "E6x12", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E6x12C1Ev();
extern void _ZN5E6x12D1Ev();
Name_Map name_map_E6x12[] = {
  NSPAIR(_ZN5E6x12C1Ev),
  NSPAIR(_ZN5E6x12D1Ev),
  {0,0}
};
extern Class_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_E6x12[] = {
  // 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 _ZTI5E6x12[];
extern void _ZN5E6x123fooEv();
static  VTBL_ENTRY vtc_E6x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x12[0]),
  (VTBL_ENTRY)&_ZN5E6x123fooEv,
};
extern VTBL_ENTRY _ZTV5E6x12[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__5E6x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E6x12[] = {
  {&(_ZTV5E6x12[3]),  3,4},
  {&(_tg__ZTV2C6__5E6x12[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E6x12[];
extern  VTBL_ENTRY _ZTV5E6x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x12[];
Class_Descriptor cd_E6x12 = {  "E6x12", // class name
  bases_E6x12, 4,
  &(vtc_E6x12[0]), // expected_vtbl_contents
  &(vtt_E6x12[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E6x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E6x12),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E6x12),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  G6x12y0  : E6x12 , F1 {
  int ff;
  ~G6x12y0(); // tgen
  G6x12y0(); // tgen
};
//SIG(1 G6x12y0) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G6x12y0 ::~G6x12y0(){ note_dtor("G6x12y0", this);} // tgen
G6x12y0 ::G6x12y0(){ note_ctor("G6x12y0", this);} // tgen

static void Test_G6x12y0()
{
  extern Class_Descriptor cd_G6x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x12y0, buf);
    G6x12y0 *dp, &lv = *(dp=new (buf) G6x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x12y0)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x12*), ABISELECT(40,32), "G6x12y0");
    check_base_class_offset(lv, (B1*)(C6*)(E6x12*), 0, "G6x12y0");
    check_base_class_offset(lv, (C6*)(E6x12*), 0, "G6x12y0");
    check_base_class_offset(lv, (D0*)(E6x12*), ABISELECT(16,12), "G6x12y0");
    check_base_class_offset(lv, (E6x12*), 0, "G6x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G6x12y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G6x12y0.ff");
    test_class_info(&lv, &cd_G6x12y0);
    dp->~G6x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x12y0(Test_G6x12y0, "G6x12y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G6x12y0C1Ev();
extern void _ZN7G6x12y0D1Ev();
Name_Map name_map_G6x12y0[] = {
  NSPAIR(_ZN7G6x12y0C1Ev),
  NSPAIR(_ZN7G6x12y0D1Ev),
  {0,0}
};
extern Class_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_E6x12;
extern VTBL_ENTRY _ZTI5E6x12[];
extern  VTBL_ENTRY _ZTV5E6x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x12y0[] = {
  // 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_E6x12,    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 _ZTI7G6x12y0[];
extern void _ZN5E6x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x12y0[0]),
  (VTBL_ENTRY)&_ZN5E6x123fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G6x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G6x12y0[];
extern void _ZN5E6x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x12__7G6x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x12[0]),
  (VTBL_ENTRY)&_ZN5E6x123fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C65E6x12__7G6x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x12y0[] = {
  {&(_ZTV7G6x12y0[3]),  3,7},
  {&(_tg__ZTV5E6x12__7G6x12y0[3]),  3,4},
  {&(_tg__ZTV2C65E6x12__7G6x12y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x12y0[];
extern  VTBL_ENTRY _ZTV7G6x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x12y0[];
Class_Descriptor cd_G6x12y0 = {  "G6x12y0", // class name
  bases_G6x12y0, 6,
  &(vtc_G6x12y0[0]), // expected_vtbl_contents
  &(vtt_G6x12y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G6x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x12y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x12y0),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  G6x12y1  : virtual E6x12 , F1 {
  int ff;
  ~G6x12y1(); // tgen
  G6x12y1(); // tgen
};
//SIG(1 G6x12y1) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G6x12y1 ::~G6x12y1(){ note_dtor("G6x12y1", this);} // tgen
G6x12y1 ::G6x12y1(){ note_ctor("G6x12y1", this);} // tgen

static void Test_G6x12y1()
{
  extern Class_Descriptor cd_G6x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x12y1, buf);
    G6x12y1 *dp, &lv = *(dp=new (buf) G6x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x12y1)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x12*), ABISELECT(40,32), "G6x12y1");
    check_base_class_offset(lv, (B1*)(C6*)(E6x12*), ABISELECT(16,12), "G6x12y1");
    check_base_class_offset(lv, (C6*)(E6x12*), ABISELECT(16,12), "G6x12y1");
    check_base_class_offset(lv, (D0*)(E6x12*), ABISELECT(32,24), "G6x12y1");
    check_base_class_offset(lv, (E6x12*), ABISELECT(16,12), "G6x12y1");
    check_base_class_offset(lv, (F1*), 0, "G6x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x12y1.ff");
    test_class_info(&lv, &cd_G6x12y1);
    dp->~G6x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x12y1(Test_G6x12y1, "G6x12y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G6x12y1C1Ev();
extern void _ZN7G6x12y1D1Ev();
Name_Map name_map_G6x12y1[] = {
  NSPAIR(_ZN7G6x12y1C1Ev),
  NSPAIR(_ZN7G6x12y1D1Ev),
  {0,0}
};
extern Class_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_E6x12;
extern VTBL_ENTRY _ZTI5E6x12[];
extern  VTBL_ENTRY _ZTV5E6x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x12y1[] = {
  // 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_E6x12,    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 _ZTI7G6x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E6x123fooEv();
static  VTBL_ENTRY vtc_G6x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G6x12y1[0]),
  (VTBL_ENTRY)&_ZN5E6x123fooEv,
};
extern VTBL_ENTRY _ZTV7G6x12y1[];
extern void _ZN5E6x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x12__7G6x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x12[0]),
  (VTBL_ENTRY)&_ZN5E6x123fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C65E6x12__7G6x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x12y1[] = {
  {&(_ZTV7G6x12y1[4]),  4,10},
  {&(_ZTV7G6x12y1[9]),  9,10},
  {&(_tg__ZTV5E6x12__7G6x12y1[3]),  3,4},
  {&(_tg__ZTV2C65E6x12__7G6x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x12y1[];
extern  VTBL_ENTRY _ZTV7G6x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x12y1[];
Class_Descriptor cd_G6x12y1 = {  "G6x12y1", // class name
  bases_G6x12y1, 6,
  &(vtc_G6x12y1[0]), // expected_vtbl_contents
  &(vtt_G6x12y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G6x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x12y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x12y1),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  G6x12y2  : E6x12 , virtual F1 {
  int ff;
  ~G6x12y2(); // tgen
  G6x12y2(); // tgen
};
//SIG(1 G6x12y2) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G6x12y2 ::~G6x12y2(){ note_dtor("G6x12y2", this);} // tgen
G6x12y2 ::G6x12y2(){ note_ctor("G6x12y2", this);} // tgen

static void Test_G6x12y2()
{
  extern Class_Descriptor cd_G6x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x12y2, buf);
    G6x12y2 *dp, &lv = *(dp=new (buf) G6x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x12y2)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x12*), ABISELECT(28,24), "G6x12y2");
    check_base_class_offset(lv, (B1*)(C6*)(E6x12*), 0, "G6x12y2");
    check_base_class_offset(lv, (C6*)(E6x12*), 0, "G6x12y2");
    check_base_class_offset(lv, (D0*)(E6x12*), ABISELECT(16,12), "G6x12y2");
    check_base_class_offset(lv, (E6x12*), 0, "G6x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G6x12y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G6x12y2.ff");
    test_class_info(&lv, &cd_G6x12y2);
    dp->~G6x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x12y2(Test_G6x12y2, "G6x12y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G6x12y2C1Ev();
extern void _ZN7G6x12y2D1Ev();
Name_Map name_map_G6x12y2[] = {
  NSPAIR(_ZN7G6x12y2C1Ev),
  NSPAIR(_ZN7G6x12y2D1Ev),
  {0,0}
};
extern Class_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_E6x12;
extern VTBL_ENTRY _ZTI5E6x12[];
extern  VTBL_ENTRY _ZTV5E6x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x12y2[] = {
  // 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_E6x12,    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 _ZTI7G6x12y2[];
extern void _ZN5E6x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x12y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x12y2[0]),
  (VTBL_ENTRY)&_ZN5E6x123fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G6x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G6x12y2[];
extern void _ZN5E6x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x12__7G6x12y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x12[0]),
  (VTBL_ENTRY)&_ZN5E6x123fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C65E6x12__7G6x12y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x12y2[] = {
  {&(_ZTV7G6x12y2[4]),  4,9},
  {&(_tg__ZTV5E6x12__7G6x12y2[3]),  3,4},
  {&(_tg__ZTV2C65E6x12__7G6x12y2[3]),  3,4},
  {&(_ZTV7G6x12y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G6x12y2[];
extern  VTBL_ENTRY _ZTV7G6x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x12y2[];
Class_Descriptor cd_G6x12y2 = {  "G6x12y2", // class name
  bases_G6x12y2, 6,
  &(vtc_G6x12y2[0]), // expected_vtbl_contents
  &(vtt_G6x12y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G6x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x12y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x12y2),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  G6x12y3  : virtual E6x12 , virtual F1 {
  int ff;
  ~G6x12y3(); // tgen
  G6x12y3(); // tgen
};
//SIG(1 G6x12y3) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G6x12y3 ::~G6x12y3(){ note_dtor("G6x12y3", this);} // tgen
G6x12y3 ::G6x12y3(){ note_ctor("G6x12y3", this);} // tgen

static void Test_G6x12y3()
{
  extern Class_Descriptor cd_G6x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G6x12y3, buf);
    G6x12y3 *dp, &lv = *(dp=new (buf) G6x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G6x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x12y3)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x12*), ABISELECT(40,28), "G6x12y3");
    check_base_class_offset(lv, (B1*)(C6*)(E6x12*), ABISELECT(16,8), "G6x12y3");
    check_base_class_offset(lv, (C6*)(E6x12*), ABISELECT(16,8), "G6x12y3");
    check_base_class_offset(lv, (D0*)(E6x12*), ABISELECT(32,20), "G6x12y3");
    check_base_class_offset(lv, (E6x12*), ABISELECT(16,8), "G6x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G6x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G6x12y3.ff");
    test_class_info(&lv, &cd_G6x12y3);
    dp->~G6x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x12y3(Test_G6x12y3, "G6x12y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G6x12y3C1Ev();
extern void _ZN7G6x12y3D1Ev();
Name_Map name_map_G6x12y3[] = {
  NSPAIR(_ZN7G6x12y3C1Ev),
  NSPAIR(_ZN7G6x12y3D1Ev),
  {0,0}
};
extern Class_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_E6x12;
extern VTBL_ENTRY _ZTI5E6x12[];
extern  VTBL_ENTRY _ZTV5E6x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x12y3[] = {
  // 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_E6x12,    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 _ZTI7G6x12y3[];
extern void _ZN5E6x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x12y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G6x12y3[0]),
  (VTBL_ENTRY)&_ZN5E6x123fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G6x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G6x12y3[];
extern void _ZN5E6x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x12__7G6x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x12[0]),
  (VTBL_ENTRY)&_ZN5E6x123fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C65E6x12__7G6x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x12y3[] = {
  {&(_ZTV7G6x12y3[5]),  5,14},
  {&(_ZTV7G6x12y3[9]),  9,14},
  {&(_ZTV7G6x12y3[13]),  13,14},
  {&(_tg__ZTV5E6x12__7G6x12y3[3]),  3,4},
  {&(_tg__ZTV2C65E6x12__7G6x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x12y3[];
extern  VTBL_ENTRY _ZTV7G6x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x12y3[];
Class_Descriptor cd_G6x12y3 = {  "G6x12y3", // class name
  bases_G6x12y3, 6,
  &(vtc_G6x12y3[0]), // expected_vtbl_contents
  &(vtt_G6x12y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G6x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x12y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x12y3),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  G6x12y4  : E6x12 , F0 {
  int ff;
  ~G6x12y4(); // tgen
  G6x12y4(); // tgen
};
//SIG(1 G6x12y4) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G6x12y4 ::~G6x12y4(){ note_dtor("G6x12y4", this);} // tgen
G6x12y4 ::G6x12y4(){ note_ctor("G6x12y4", this);} // tgen

static void Test_G6x12y4()
{
  extern Class_Descriptor cd_G6x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G6x12y4, buf);
    G6x12y4 *dp, &lv = *(dp=new (buf) G6x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G6x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x12y4)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x12*), ABISELECT(32,28), "G6x12y4");
    check_base_class_offset(lv, (B1*)(C6*)(E6x12*), 0, "G6x12y4");
    check_base_class_offset(lv, (C6*)(E6x12*), 0, "G6x12y4");
    check_base_class_offset(lv, (D0*)(E6x12*), ABISELECT(16,12), "G6x12y4");
    check_base_class_offset(lv, (E6x12*), 0, "G6x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G6x12y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G6x12y4.ff");
    test_class_info(&lv, &cd_G6x12y4);
    dp->~G6x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x12y4(Test_G6x12y4, "G6x12y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G6x12y4C1Ev();
extern void _ZN7G6x12y4D1Ev();
Name_Map name_map_G6x12y4[] = {
  NSPAIR(_ZN7G6x12y4C1Ev),
  NSPAIR(_ZN7G6x12y4D1Ev),
  {0,0}
};
extern Class_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_E6x12;
extern VTBL_ENTRY _ZTI5E6x12[];
extern  VTBL_ENTRY _ZTV5E6x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x12y4[] = {
  // 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_E6x12,    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 _ZTI7G6x12y4[];
extern void _ZN5E6x123fooEv();
static  VTBL_ENTRY vtc_G6x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x12y4[0]),
  (VTBL_ENTRY)&_ZN5E6x123fooEv,
};
extern VTBL_ENTRY _ZTV7G6x12y4[];
extern void _ZN5E6x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x12__7G6x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x12[0]),
  (VTBL_ENTRY)&_ZN5E6x123fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C65E6x12__7G6x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x12y4[] = {
  {&(_ZTV7G6x12y4[3]),  3,4},
  {&(_tg__ZTV5E6x12__7G6x12y4[3]),  3,4},
  {&(_tg__ZTV2C65E6x12__7G6x12y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x12y4[];
extern  VTBL_ENTRY _ZTV7G6x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x12y4[];
Class_Descriptor cd_G6x12y4 = {  "G6x12y4", // class name
  bases_G6x12y4, 6,
  &(vtc_G6x12y4[0]), // expected_vtbl_contents
  &(vtt_G6x12y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G6x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x12y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x12y4),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  G6x12y5  : virtual E6x12 , F0 {
  int ff;
  ~G6x12y5(); // tgen
  G6x12y5(); // tgen
};
//SIG(1 G6x12y5) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G6x12y5 ::~G6x12y5(){ note_dtor("G6x12y5", this);} // tgen
G6x12y5 ::G6x12y5(){ note_ctor("G6x12y5", this);} // tgen

static void Test_G6x12y5()
{
  extern Class_Descriptor cd_G6x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x12y5, buf);
    G6x12y5 *dp, &lv = *(dp=new (buf) G6x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x12y5)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x12*), ABISELECT(40,32), "G6x12y5");
    check_base_class_offset(lv, (B1*)(C6*)(E6x12*), ABISELECT(16,12), "G6x12y5");
    check_base_class_offset(lv, (C6*)(E6x12*), ABISELECT(16,12), "G6x12y5");
    check_base_class_offset(lv, (D0*)(E6x12*), ABISELECT(32,24), "G6x12y5");
    check_base_class_offset(lv, (E6x12*), ABISELECT(16,12), "G6x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G6x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x12y5.ff");
    test_class_info(&lv, &cd_G6x12y5);
    dp->~G6x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x12y5(Test_G6x12y5, "G6x12y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G6x12y5C1Ev();
extern void _ZN7G6x12y5D1Ev();
Name_Map name_map_G6x12y5[] = {
  NSPAIR(_ZN7G6x12y5C1Ev),
  NSPAIR(_ZN7G6x12y5D1Ev),
  {0,0}
};
extern Class_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_E6x12;
extern VTBL_ENTRY _ZTI5E6x12[];
extern  VTBL_ENTRY _ZTV5E6x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x12y5[] = {
  // 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_E6x12,    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 _ZTI7G6x12y5[];
extern void _ZN5E6x123fooEv();
static  VTBL_ENTRY vtc_G6x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G6x12y5[0]),
  (VTBL_ENTRY)&_ZN5E6x123fooEv,
};
extern VTBL_ENTRY _ZTV7G6x12y5[];
extern void _ZN5E6x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x12__7G6x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x12[0]),
  (VTBL_ENTRY)&_ZN5E6x123fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C65E6x12__7G6x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x12y5[] = {
  {&(_ZTV7G6x12y5[4]),  4,9},
  {&(_ZTV7G6x12y5[8]),  8,9},
  {&(_tg__ZTV5E6x12__7G6x12y5[3]),  3,4},
  {&(_tg__ZTV2C65E6x12__7G6x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x12y5[];
extern  VTBL_ENTRY _ZTV7G6x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x12y5[];
Class_Descriptor cd_G6x12y5 = {  "G6x12y5", // class name
  bases_G6x12y5, 6,
  &(vtc_G6x12y5[0]), // expected_vtbl_contents
  &(vtt_G6x12y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G6x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x12y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x12y5),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  G6x12y6  : E6x12 , virtual F0 {
  int ff;
  ~G6x12y6(); // tgen
  G6x12y6(); // tgen
};
//SIG(1 G6x12y6) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G6x12y6 ::~G6x12y6(){ note_dtor("G6x12y6", this);} // tgen
G6x12y6 ::G6x12y6(){ note_ctor("G6x12y6", this);} // tgen

static void Test_G6x12y6()
{
  extern Class_Descriptor cd_G6x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G6x12y6, buf);
    G6x12y6 *dp, &lv = *(dp=new (buf) G6x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G6x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x12y6)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x12*), ABISELECT(28,24), "G6x12y6");
    check_base_class_offset(lv, (B1*)(C6*)(E6x12*), 0, "G6x12y6");
    check_base_class_offset(lv, (C6*)(E6x12*), 0, "G6x12y6");
    check_base_class_offset(lv, (D0*)(E6x12*), ABISELECT(16,12), "G6x12y6");
    check_base_class_offset(lv, (E6x12*), 0, "G6x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G6x12y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G6x12y6.ff");
    test_class_info(&lv, &cd_G6x12y6);
    dp->~G6x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x12y6(Test_G6x12y6, "G6x12y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G6x12y6C1Ev();
extern void _ZN7G6x12y6D1Ev();
Name_Map name_map_G6x12y6[] = {
  NSPAIR(_ZN7G6x12y6C1Ev),
  NSPAIR(_ZN7G6x12y6D1Ev),
  {0,0}
};
extern Class_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_E6x12;
extern VTBL_ENTRY _ZTI5E6x12[];
extern  VTBL_ENTRY _ZTV5E6x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x12y6[] = {
  // 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_E6x12,    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 _ZTI7G6x12y6[];
extern void _ZN5E6x123fooEv();
static  VTBL_ENTRY vtc_G6x12y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x12y6[0]),
  (VTBL_ENTRY)&_ZN5E6x123fooEv,
};
extern VTBL_ENTRY _ZTV7G6x12y6[];
extern void _ZN5E6x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x12__7G6x12y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x12[0]),
  (VTBL_ENTRY)&_ZN5E6x123fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C65E6x12__7G6x12y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x12y6[] = {
  {&(_ZTV7G6x12y6[4]),  4,5},
  {&(_tg__ZTV5E6x12__7G6x12y6[3]),  3,4},
  {&(_tg__ZTV2C65E6x12__7G6x12y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x12y6[];
extern  VTBL_ENTRY _ZTV7G6x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x12y6[];
Class_Descriptor cd_G6x12y6 = {  "G6x12y6", // class name
  bases_G6x12y6, 6,
  &(vtc_G6x12y6[0]), // expected_vtbl_contents
  &(vtt_G6x12y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G6x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x12y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x12y6),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  G6x12y7  : virtual E6x12 , virtual F0 {
  int ff;
  ~G6x12y7(); // tgen
  G6x12y7(); // tgen
};
//SIG(1 G6x12y7) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G6x12y7 ::~G6x12y7(){ note_dtor("G6x12y7", this);} // tgen
G6x12y7 ::G6x12y7(){ note_ctor("G6x12y7", this);} // tgen

static void Test_G6x12y7()
{
  extern Class_Descriptor cd_G6x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x12y7, buf);
    G6x12y7 *dp, &lv = *(dp=new (buf) G6x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x12y7)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x12*), ABISELECT(40,28), "G6x12y7");
    check_base_class_offset(lv, (B1*)(C6*)(E6x12*), ABISELECT(16,8), "G6x12y7");
    check_base_class_offset(lv, (C6*)(E6x12*), ABISELECT(16,8), "G6x12y7");
    check_base_class_offset(lv, (D0*)(E6x12*), ABISELECT(32,20), "G6x12y7");
    check_base_class_offset(lv, (E6x12*), ABISELECT(16,8), "G6x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G6x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G6x12y7.ff");
    test_class_info(&lv, &cd_G6x12y7);
    dp->~G6x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x12y7(Test_G6x12y7, "G6x12y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G6x12y7C1Ev();
extern void _ZN7G6x12y7D1Ev();
Name_Map name_map_G6x12y7[] = {
  NSPAIR(_ZN7G6x12y7C1Ev),
  NSPAIR(_ZN7G6x12y7D1Ev),
  {0,0}
};
extern Class_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_E6x12;
extern VTBL_ENTRY _ZTI5E6x12[];
extern  VTBL_ENTRY _ZTV5E6x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x12y7[] = {
  // 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_E6x12,    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 _ZTI7G6x12y7[];
extern void _ZN5E6x123fooEv();
static  VTBL_ENTRY vtc_G6x12y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G6x12y7[0]),
  (VTBL_ENTRY)&_ZN5E6x123fooEv,
};
extern VTBL_ENTRY _ZTV7G6x12y7[];
extern void _ZN5E6x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x12__7G6x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x12[0]),
  (VTBL_ENTRY)&_ZN5E6x123fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C65E6x12__7G6x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x12y7[] = {
  {&(_ZTV7G6x12y7[5]),  5,10},
  {&(_ZTV7G6x12y7[9]),  9,10},
  {&(_tg__ZTV5E6x12__7G6x12y7[3]),  3,4},
  {&(_tg__ZTV2C65E6x12__7G6x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x12y7[];
extern  VTBL_ENTRY _ZTV7G6x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x12y7[];
Class_Descriptor cd_G6x12y7 = {  "G6x12y7", // class name
  bases_G6x12y7, 6,
  &(vtc_G6x12y7[0]), // expected_vtbl_contents
  &(vtt_G6x12y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G6x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x12y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x12y7),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  E7x12  : C7 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E7x123fooEv
  ~E7x12(); // tgen
  E7x12(); // tgen
};
//SIG(-1 E7x12) C1{ BC2{ VBC3{ v1 Fi} BC4{ v1 Fi} Fi} BC5{ Fi} v1 Fi}


void  E7x12 ::foo(){vfunc_called(this, "_ZN5E7x123fooEv");}
E7x12 ::~E7x12(){ note_dtor("E7x12", this);} // tgen
E7x12 ::E7x12(){ note_ctor("E7x12", this);} // tgen

static void Test_E7x12()
{
  extern Class_Descriptor cd_E7x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E7x12, buf);
    E7x12 *dp, &lv = *(dp=new (buf) E7x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E7x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E7x12)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(24,20), "E7x12");
    check_base_class_offset(lv, (B1*)(C7*), 0, "E7x12");
    check_base_class_offset(lv, (C7*), 0, "E7x12");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E7x12");
    check_field_offset(lv, fd, ABISELECT(20,16), "E7x12.fd");
    test_class_info(&lv, &cd_E7x12);
    dp->~E7x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE7x12(Test_E7x12, "E7x12", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E7x12C1Ev();
extern void _ZN5E7x12D1Ev();
Name_Map name_map_E7x12[] = {
  NSPAIR(_ZN5E7x12C1Ev),
  NSPAIR(_ZN5E7x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x12[] = {
  // 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 _ZTI5E7x12[];
extern void _ZN5E7x123fooEv();
extern void ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv)();
extern void ABISELECT(_ZThn24_N5E7x123fooEv,_ZThn20_N5E7x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E7x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x12[0]),
  (VTBL_ENTRY)&_ZN5E7x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E7x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv),
};
extern VTBL_ENTRY _ZTV5E7x12[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__5E7x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__5E7x12[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E7x12[] = {
  {&(_ZTV5E7x12[3]),  3,8},
  {&(_tg__ZTV2C7__5E7x12[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__5E7x12[3]),  3,4},
  {&(_ZTV5E7x12[7]),  7,8},
};
extern VTBL_ENTRY _ZTI5E7x12[];
extern  VTBL_ENTRY _ZTV5E7x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x12[];
static VTBL_ENTRY alt_thunk_names17[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x123fooEv,_ZThn20_N5E7x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E7x12 = {  "E7x12", // class name
  bases_E7x12, 4,
  &(vtc_E7x12[0]), // expected_vtbl_contents
  &(vtt_E7x12[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E7x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E7x12),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E7x12),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  G7x12y0  : E7x12 , F1 {
  int ff;
  ~G7x12y0(); // tgen
  G7x12y0(); // tgen
};
//SIG(1 G7x12y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G7x12y0 ::~G7x12y0(){ note_dtor("G7x12y0", this);} // tgen
G7x12y0 ::G7x12y0(){ note_ctor("G7x12y0", this);} // tgen

static void Test_G7x12y0()
{
  extern Class_Descriptor cd_G7x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x12y0, buf);
    G7x12y0 *dp, &lv = *(dp=new (buf) G7x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x12y0)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x12*), ABISELECT(40,32), "G7x12y0");
    check_base_class_offset(lv, (B1*)(C7*)(E7x12*), 0, "G7x12y0");
    check_base_class_offset(lv, (C7*)(E7x12*), 0, "G7x12y0");
    check_base_class_offset(lv, (D0*)(E7x12*), ABISELECT(16,12), "G7x12y0");
    check_base_class_offset(lv, (E7x12*), 0, "G7x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G7x12y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G7x12y0.ff");
    test_class_info(&lv, &cd_G7x12y0);
    dp->~G7x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x12y0(Test_G7x12y0, "G7x12y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G7x12y0C1Ev();
extern void _ZN7G7x12y0D1Ev();
Name_Map name_map_G7x12y0[] = {
  NSPAIR(_ZN7G7x12y0C1Ev),
  NSPAIR(_ZN7G7x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x12;
extern VTBL_ENTRY _ZTI5E7x12[];
extern  VTBL_ENTRY _ZTV5E7x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x12y0[] = {
  // 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_E7x12,    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 _ZTI7G7x12y0[];
extern void _ZN5E7x123fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv)();
extern void ABISELECT(_ZThn40_N5E7x123fooEv,_ZThn32_N5E7x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x12y0[0]),
  (VTBL_ENTRY)&_ZN5E7x123fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G7x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G7x12y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv),
};
extern VTBL_ENTRY _ZTV7G7x12y0[];
extern void _ZN5E7x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x12__7G7x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x12[0]),
  (VTBL_ENTRY)&_ZN5E7x123fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C75E7x12__7G7x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C75E7x12__7G7x12y0[] = {
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv)();
extern void ABISELECT(_ZThn40_N5E7x123fooEv,_ZThn32_N5E7x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x12__7G7x12y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI5E7x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv),
};
static  VTT_ENTRY vtt_G7x12y0[] = {
  {&(_ZTV7G7x12y0[3]),  3,11},
  {&(_tg__ZTV5E7x12__7G7x12y0[3]),  3,4},
  {&(_tg__ZTV2C75E7x12__7G7x12y0[3]),  3,4},
  {&(_tg__ZTV2A1__2C75E7x12__7G7x12y0[3]),  3,4},
  {&(_tg__ZTV2A1__5E7x12__7G7x12y0[3]),  3,4},
  {&(_ZTV7G7x12y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G7x12y0[];
extern  VTBL_ENTRY _ZTV7G7x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x12y0[];
static VTBL_ENTRY alt_thunk_names18[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E7x123fooEv,_ZThn32_N5E7x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E7x123fooEv,_ZThn32_N5E7x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x12y0 = {  "G7x12y0", // class name
  bases_G7x12y0, 6,
  &(vtc_G7x12y0[0]), // expected_vtbl_contents
  &(vtt_G7x12y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G7x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x12y0),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x12y0),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  G7x12y1  : virtual E7x12 , F1 {
  int ff;
  ~G7x12y1(); // tgen
  G7x12y1(); // tgen
};
//SIG(1 G7x12y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G7x12y1 ::~G7x12y1(){ note_dtor("G7x12y1", this);} // tgen
G7x12y1 ::G7x12y1(){ note_ctor("G7x12y1", this);} // tgen

static void Test_G7x12y1()
{
  extern Class_Descriptor cd_G7x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x12y1, buf);
    G7x12y1 *dp, &lv = *(dp=new (buf) G7x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x12y1)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x12*), ABISELECT(40,32), "G7x12y1");
    check_base_class_offset(lv, (B1*)(C7*)(E7x12*), ABISELECT(16,12), "G7x12y1");
    check_base_class_offset(lv, (C7*)(E7x12*), ABISELECT(16,12), "G7x12y1");
    check_base_class_offset(lv, (D0*)(E7x12*), ABISELECT(32,24), "G7x12y1");
    check_base_class_offset(lv, (E7x12*), ABISELECT(16,12), "G7x12y1");
    check_base_class_offset(lv, (F1*), 0, "G7x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x12y1.ff");
    test_class_info(&lv, &cd_G7x12y1);
    dp->~G7x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x12y1(Test_G7x12y1, "G7x12y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G7x12y1C1Ev();
extern void _ZN7G7x12y1D1Ev();
Name_Map name_map_G7x12y1[] = {
  NSPAIR(_ZN7G7x12y1C1Ev),
  NSPAIR(_ZN7G7x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x12;
extern VTBL_ENTRY _ZTI5E7x12[];
extern  VTBL_ENTRY _ZTV5E7x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x12y1[] = {
  // 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_E7x12,    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 _ZTI7G7x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E7x123fooEv();
extern void ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv)();
extern void ABISELECT(_ZThn24_N5E7x123fooEv,_ZThn20_N5E7x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G7x12y1[0]),
  (VTBL_ENTRY)&_ZN5E7x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G7x12y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv),
};
extern VTBL_ENTRY _ZTV7G7x12y1[];
extern void _ZN5E7x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x12__7G7x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x12[0]),
  (VTBL_ENTRY)&_ZN5E7x123fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C75E7x12__7G7x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C75E7x12__7G7x12y1[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv)();
extern void ABISELECT(_ZThn24_N5E7x123fooEv,_ZThn20_N5E7x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x12__7G7x12y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E7x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv),
};
static  VTT_ENTRY vtt_G7x12y1[] = {
  {&(_ZTV7G7x12y1[4]),  4,14},
  {&(_ZTV7G7x12y1[9]),  9,14},
  {&(_ZTV7G7x12y1[13]),  13,14},
  {&(_tg__ZTV5E7x12__7G7x12y1[3]),  3,4},
  {&(_tg__ZTV2C75E7x12__7G7x12y1[3]),  3,4},
  {&(_tg__ZTV2A1__2C75E7x12__7G7x12y1[3]),  3,4},
  {&(_tg__ZTV2A1__5E7x12__7G7x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x12y1[];
extern  VTBL_ENTRY _ZTV7G7x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x12y1[];
static VTBL_ENTRY alt_thunk_names19[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x123fooEv,_ZThn20_N5E7x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x123fooEv,_ZThn20_N5E7x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x12y1 = {  "G7x12y1", // class name
  bases_G7x12y1, 6,
  &(vtc_G7x12y1[0]), // expected_vtbl_contents
  &(vtt_G7x12y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G7x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x12y1),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x12y1),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  G7x12y2  : E7x12 , virtual F1 {
  int ff;
  ~G7x12y2(); // tgen
  G7x12y2(); // tgen
};
//SIG(1 G7x12y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G7x12y2 ::~G7x12y2(){ note_dtor("G7x12y2", this);} // tgen
G7x12y2 ::G7x12y2(){ note_ctor("G7x12y2", this);} // tgen

static void Test_G7x12y2()
{
  extern Class_Descriptor cd_G7x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G7x12y2, buf);
    G7x12y2 *dp, &lv = *(dp=new (buf) G7x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G7x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x12y2)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x12*), ABISELECT(32,24), "G7x12y2");
    check_base_class_offset(lv, (B1*)(C7*)(E7x12*), 0, "G7x12y2");
    check_base_class_offset(lv, (C7*)(E7x12*), 0, "G7x12y2");
    check_base_class_offset(lv, (D0*)(E7x12*), ABISELECT(16,12), "G7x12y2");
    check_base_class_offset(lv, (E7x12*), 0, "G7x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G7x12y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G7x12y2.ff");
    test_class_info(&lv, &cd_G7x12y2);
    dp->~G7x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x12y2(Test_G7x12y2, "G7x12y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G7x12y2C1Ev();
extern void _ZN7G7x12y2D1Ev();
Name_Map name_map_G7x12y2[] = {
  NSPAIR(_ZN7G7x12y2C1Ev),
  NSPAIR(_ZN7G7x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x12;
extern VTBL_ENTRY _ZTI5E7x12[];
extern  VTBL_ENTRY _ZTV5E7x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x12y2[] = {
  // 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_E7x12,    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 _ZTI7G7x12y2[];
extern void _ZN5E7x123fooEv();
extern void ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv)();
extern void ABISELECT(_ZThn32_N5E7x123fooEv,_ZThn24_N5E7x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G7x12y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x12y2[0]),
  (VTBL_ENTRY)&_ZN5E7x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G7x12y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G7x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G7x12y2[];
extern void _ZN5E7x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x12__7G7x12y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x12[0]),
  (VTBL_ENTRY)&_ZN5E7x123fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C75E7x12__7G7x12y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C75E7x12__7G7x12y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv)();
extern void ABISELECT(_ZThn32_N5E7x123fooEv,_ZThn24_N5E7x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x12__7G7x12y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E7x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv),
};
static  VTT_ENTRY vtt_G7x12y2[] = {
  {&(_ZTV7G7x12y2[4]),  4,13},
  {&(_tg__ZTV5E7x12__7G7x12y2[3]),  3,4},
  {&(_tg__ZTV2C75E7x12__7G7x12y2[3]),  3,4},
  {&(_tg__ZTV2A1__2C75E7x12__7G7x12y2[3]),  3,4},
  {&(_tg__ZTV2A1__5E7x12__7G7x12y2[3]),  3,4},
  {&(_ZTV7G7x12y2[8]),  8,13},
  {&(_ZTV7G7x12y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G7x12y2[];
extern  VTBL_ENTRY _ZTV7G7x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x12y2[];
static VTBL_ENTRY alt_thunk_names20[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x123fooEv,_ZThn24_N5E7x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x123fooEv,_ZThn24_N5E7x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x12y2 = {  "G7x12y2", // class name
  bases_G7x12y2, 6,
  &(vtc_G7x12y2[0]), // expected_vtbl_contents
  &(vtt_G7x12y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G7x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x12y2),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x12y2),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  G7x12y3  : virtual E7x12 , virtual F1 {
  int ff;
  ~G7x12y3(); // tgen
  G7x12y3(); // tgen
};
//SIG(1 G7x12y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G7x12y3 ::~G7x12y3(){ note_dtor("G7x12y3", this);} // tgen
G7x12y3 ::G7x12y3(){ note_ctor("G7x12y3", this);} // tgen

static void Test_G7x12y3()
{
  extern Class_Descriptor cd_G7x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G7x12y3, buf);
    G7x12y3 *dp, &lv = *(dp=new (buf) G7x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G7x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x12y3)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x12*), ABISELECT(40,28), "G7x12y3");
    check_base_class_offset(lv, (B1*)(C7*)(E7x12*), ABISELECT(16,8), "G7x12y3");
    check_base_class_offset(lv, (C7*)(E7x12*), ABISELECT(16,8), "G7x12y3");
    check_base_class_offset(lv, (D0*)(E7x12*), ABISELECT(32,20), "G7x12y3");
    check_base_class_offset(lv, (E7x12*), ABISELECT(16,8), "G7x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G7x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G7x12y3.ff");
    test_class_info(&lv, &cd_G7x12y3);
    dp->~G7x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x12y3(Test_G7x12y3, "G7x12y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G7x12y3C1Ev();
extern void _ZN7G7x12y3D1Ev();
Name_Map name_map_G7x12y3[] = {
  NSPAIR(_ZN7G7x12y3C1Ev),
  NSPAIR(_ZN7G7x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x12;
extern VTBL_ENTRY _ZTI5E7x12[];
extern  VTBL_ENTRY _ZTV5E7x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x12y3[] = {
  // 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_E7x12,    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 _ZTI7G7x12y3[];
extern void _ZN5E7x123fooEv();
extern void ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv)();
extern void ABISELECT(_ZThn24_N5E7x123fooEv,_ZThn20_N5E7x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G7x12y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G7x12y3[0]),
  (VTBL_ENTRY)&_ZN5E7x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G7x12y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G7x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G7x12y3[];
extern void _ZN5E7x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x12__7G7x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x12[0]),
  (VTBL_ENTRY)&_ZN5E7x123fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C75E7x12__7G7x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C75E7x12__7G7x12y3[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv)();
extern void ABISELECT(_ZThn24_N5E7x123fooEv,_ZThn20_N5E7x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x12__7G7x12y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E7x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv),
};
static  VTT_ENTRY vtt_G7x12y3[] = {
  {&(_ZTV7G7x12y3[5]),  5,18},
  {&(_ZTV7G7x12y3[9]),  9,18},
  {&(_ZTV7G7x12y3[13]),  13,18},
  {&(_ZTV7G7x12y3[17]),  17,18},
  {&(_tg__ZTV5E7x12__7G7x12y3[3]),  3,4},
  {&(_tg__ZTV2C75E7x12__7G7x12y3[3]),  3,4},
  {&(_tg__ZTV2A1__2C75E7x12__7G7x12y3[3]),  3,4},
  {&(_tg__ZTV2A1__5E7x12__7G7x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x12y3[];
extern  VTBL_ENTRY _ZTV7G7x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x12y3[];
static VTBL_ENTRY alt_thunk_names21[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x123fooEv,_ZThn20_N5E7x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x123fooEv,_ZThn20_N5E7x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x12y3 = {  "G7x12y3", // class name
  bases_G7x12y3, 6,
  &(vtc_G7x12y3[0]), // expected_vtbl_contents
  &(vtt_G7x12y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G7x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x12y3),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x12y3),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  G7x12y4  : E7x12 , F0 {
  int ff;
  ~G7x12y4(); // tgen
  G7x12y4(); // tgen
};
//SIG(1 G7x12y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G7x12y4 ::~G7x12y4(){ note_dtor("G7x12y4", this);} // tgen
G7x12y4 ::G7x12y4(){ note_ctor("G7x12y4", this);} // tgen

static void Test_G7x12y4()
{
  extern Class_Descriptor cd_G7x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G7x12y4, buf);
    G7x12y4 *dp, &lv = *(dp=new (buf) G7x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G7x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x12y4)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x12*), ABISELECT(32,28), "G7x12y4");
    check_base_class_offset(lv, (B1*)(C7*)(E7x12*), 0, "G7x12y4");
    check_base_class_offset(lv, (C7*)(E7x12*), 0, "G7x12y4");
    check_base_class_offset(lv, (D0*)(E7x12*), ABISELECT(16,12), "G7x12y4");
    check_base_class_offset(lv, (E7x12*), 0, "G7x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G7x12y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G7x12y4.ff");
    test_class_info(&lv, &cd_G7x12y4);
    dp->~G7x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x12y4(Test_G7x12y4, "G7x12y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G7x12y4C1Ev();
extern void _ZN7G7x12y4D1Ev();
Name_Map name_map_G7x12y4[] = {
  NSPAIR(_ZN7G7x12y4C1Ev),
  NSPAIR(_ZN7G7x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x12;
extern VTBL_ENTRY _ZTI5E7x12[];
extern  VTBL_ENTRY _ZTV5E7x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x12y4[] = {
  // 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_E7x12,    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 _ZTI7G7x12y4[];
extern void _ZN5E7x123fooEv();
extern void ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv)();
extern void ABISELECT(_ZThn32_N5E7x123fooEv,_ZThn28_N5E7x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x12y4[0]),
  (VTBL_ENTRY)&_ZN5E7x123fooEv,
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G7x12y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv),
};
extern VTBL_ENTRY _ZTV7G7x12y4[];
extern void _ZN5E7x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x12__7G7x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x12[0]),
  (VTBL_ENTRY)&_ZN5E7x123fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C75E7x12__7G7x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C75E7x12__7G7x12y4[] = {
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv)();
extern void ABISELECT(_ZThn32_N5E7x123fooEv,_ZThn28_N5E7x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x12__7G7x12y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI5E7x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv),
};
static  VTT_ENTRY vtt_G7x12y4[] = {
  {&(_ZTV7G7x12y4[3]),  3,8},
  {&(_tg__ZTV5E7x12__7G7x12y4[3]),  3,4},
  {&(_tg__ZTV2C75E7x12__7G7x12y4[3]),  3,4},
  {&(_tg__ZTV2A1__2C75E7x12__7G7x12y4[3]),  3,4},
  {&(_tg__ZTV2A1__5E7x12__7G7x12y4[3]),  3,4},
  {&(_ZTV7G7x12y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G7x12y4[];
extern  VTBL_ENTRY _ZTV7G7x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x12y4[];
static VTBL_ENTRY alt_thunk_names22[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x123fooEv,_ZThn28_N5E7x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x123fooEv,_ZThn28_N5E7x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x12y4 = {  "G7x12y4", // class name
  bases_G7x12y4, 6,
  &(vtc_G7x12y4[0]), // expected_vtbl_contents
  &(vtt_G7x12y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G7x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x12y4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x12y4),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  G7x12y5  : virtual E7x12 , F0 {
  int ff;
  ~G7x12y5(); // tgen
  G7x12y5(); // tgen
};
//SIG(1 G7x12y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G7x12y5 ::~G7x12y5(){ note_dtor("G7x12y5", this);} // tgen
G7x12y5 ::G7x12y5(){ note_ctor("G7x12y5", this);} // tgen

static void Test_G7x12y5()
{
  extern Class_Descriptor cd_G7x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x12y5, buf);
    G7x12y5 *dp, &lv = *(dp=new (buf) G7x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x12y5)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x12*), ABISELECT(40,32), "G7x12y5");
    check_base_class_offset(lv, (B1*)(C7*)(E7x12*), ABISELECT(16,12), "G7x12y5");
    check_base_class_offset(lv, (C7*)(E7x12*), ABISELECT(16,12), "G7x12y5");
    check_base_class_offset(lv, (D0*)(E7x12*), ABISELECT(32,24), "G7x12y5");
    check_base_class_offset(lv, (E7x12*), ABISELECT(16,12), "G7x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G7x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x12y5.ff");
    test_class_info(&lv, &cd_G7x12y5);
    dp->~G7x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x12y5(Test_G7x12y5, "G7x12y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G7x12y5C1Ev();
extern void _ZN7G7x12y5D1Ev();
Name_Map name_map_G7x12y5[] = {
  NSPAIR(_ZN7G7x12y5C1Ev),
  NSPAIR(_ZN7G7x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x12;
extern VTBL_ENTRY _ZTI5E7x12[];
extern  VTBL_ENTRY _ZTV5E7x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x12y5[] = {
  // 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_E7x12,    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 _ZTI7G7x12y5[];
extern void _ZN5E7x123fooEv();
extern void ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv)();
extern void ABISELECT(_ZThn24_N5E7x123fooEv,_ZThn20_N5E7x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G7x12y5[0]),
  (VTBL_ENTRY)&_ZN5E7x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G7x12y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv),
};
extern VTBL_ENTRY _ZTV7G7x12y5[];
extern void _ZN5E7x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x12__7G7x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x12[0]),
  (VTBL_ENTRY)&_ZN5E7x123fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C75E7x12__7G7x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C75E7x12__7G7x12y5[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv)();
extern void ABISELECT(_ZThn24_N5E7x123fooEv,_ZThn20_N5E7x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x12__7G7x12y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E7x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv),
};
static  VTT_ENTRY vtt_G7x12y5[] = {
  {&(_ZTV7G7x12y5[4]),  4,13},
  {&(_ZTV7G7x12y5[8]),  8,13},
  {&(_ZTV7G7x12y5[12]),  12,13},
  {&(_tg__ZTV5E7x12__7G7x12y5[3]),  3,4},
  {&(_tg__ZTV2C75E7x12__7G7x12y5[3]),  3,4},
  {&(_tg__ZTV2A1__2C75E7x12__7G7x12y5[3]),  3,4},
  {&(_tg__ZTV2A1__5E7x12__7G7x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x12y5[];
extern  VTBL_ENTRY _ZTV7G7x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x12y5[];
static VTBL_ENTRY alt_thunk_names23[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x123fooEv,_ZThn20_N5E7x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x123fooEv,_ZThn20_N5E7x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x12y5 = {  "G7x12y5", // class name
  bases_G7x12y5, 6,
  &(vtc_G7x12y5[0]), // expected_vtbl_contents
  &(vtt_G7x12y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G7x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x12y5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x12y5),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  G7x12y6  : E7x12 , virtual F0 {
  int ff;
  ~G7x12y6(); // tgen
  G7x12y6(); // tgen
};
//SIG(1 G7x12y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G7x12y6 ::~G7x12y6(){ note_dtor("G7x12y6", this);} // tgen
G7x12y6 ::G7x12y6(){ note_ctor("G7x12y6", this);} // tgen

static void Test_G7x12y6()
{
  extern Class_Descriptor cd_G7x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G7x12y6, buf);
    G7x12y6 *dp, &lv = *(dp=new (buf) G7x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G7x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x12y6)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x12*), ABISELECT(32,24), "G7x12y6");
    check_base_class_offset(lv, (B1*)(C7*)(E7x12*), 0, "G7x12y6");
    check_base_class_offset(lv, (C7*)(E7x12*), 0, "G7x12y6");
    check_base_class_offset(lv, (D0*)(E7x12*), ABISELECT(16,12), "G7x12y6");
    check_base_class_offset(lv, (E7x12*), 0, "G7x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G7x12y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G7x12y6.ff");
    test_class_info(&lv, &cd_G7x12y6);
    dp->~G7x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x12y6(Test_G7x12y6, "G7x12y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G7x12y6C1Ev();
extern void _ZN7G7x12y6D1Ev();
Name_Map name_map_G7x12y6[] = {
  NSPAIR(_ZN7G7x12y6C1Ev),
  NSPAIR(_ZN7G7x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x12;
extern VTBL_ENTRY _ZTI5E7x12[];
extern  VTBL_ENTRY _ZTV5E7x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x12y6[] = {
  // 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_E7x12,    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 _ZTI7G7x12y6[];
extern void _ZN5E7x123fooEv();
extern void ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv)();
extern void ABISELECT(_ZThn32_N5E7x123fooEv,_ZThn24_N5E7x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x12y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x12y6[0]),
  (VTBL_ENTRY)&_ZN5E7x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G7x12y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv),
};
extern VTBL_ENTRY _ZTV7G7x12y6[];
extern void _ZN5E7x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x12__7G7x12y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x12[0]),
  (VTBL_ENTRY)&_ZN5E7x123fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C75E7x12__7G7x12y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C75E7x12__7G7x12y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv)();
extern void ABISELECT(_ZThn32_N5E7x123fooEv,_ZThn24_N5E7x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x12__7G7x12y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E7x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv),
};
static  VTT_ENTRY vtt_G7x12y6[] = {
  {&(_ZTV7G7x12y6[4]),  4,9},
  {&(_tg__ZTV5E7x12__7G7x12y6[3]),  3,4},
  {&(_tg__ZTV2C75E7x12__7G7x12y6[3]),  3,4},
  {&(_tg__ZTV2A1__2C75E7x12__7G7x12y6[3]),  3,4},
  {&(_tg__ZTV2A1__5E7x12__7G7x12y6[3]),  3,4},
  {&(_ZTV7G7x12y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G7x12y6[];
extern  VTBL_ENTRY _ZTV7G7x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x12y6[];
static VTBL_ENTRY alt_thunk_names24[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x123fooEv,_ZThn24_N5E7x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x123fooEv,_ZThn24_N5E7x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x12y6 = {  "G7x12y6", // class name
  bases_G7x12y6, 6,
  &(vtc_G7x12y6[0]), // expected_vtbl_contents
  &(vtt_G7x12y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G7x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x12y6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x12y6),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  G7x12y7  : virtual E7x12 , virtual F0 {
  int ff;
  ~G7x12y7(); // tgen
  G7x12y7(); // tgen
};
//SIG(1 G7x12y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G7x12y7 ::~G7x12y7(){ note_dtor("G7x12y7", this);} // tgen
G7x12y7 ::G7x12y7(){ note_ctor("G7x12y7", this);} // tgen

static void Test_G7x12y7()
{
  extern Class_Descriptor cd_G7x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x12y7, buf);
    G7x12y7 *dp, &lv = *(dp=new (buf) G7x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x12y7)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x12*), ABISELECT(40,28), "G7x12y7");
    check_base_class_offset(lv, (B1*)(C7*)(E7x12*), ABISELECT(16,8), "G7x12y7");
    check_base_class_offset(lv, (C7*)(E7x12*), ABISELECT(16,8), "G7x12y7");
    check_base_class_offset(lv, (D0*)(E7x12*), ABISELECT(32,20), "G7x12y7");
    check_base_class_offset(lv, (E7x12*), ABISELECT(16,8), "G7x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G7x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G7x12y7.ff");
    test_class_info(&lv, &cd_G7x12y7);
    dp->~G7x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x12y7(Test_G7x12y7, "G7x12y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G7x12y7C1Ev();
extern void _ZN7G7x12y7D1Ev();
Name_Map name_map_G7x12y7[] = {
  NSPAIR(_ZN7G7x12y7C1Ev),
  NSPAIR(_ZN7G7x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x12;
extern VTBL_ENTRY _ZTI5E7x12[];
extern  VTBL_ENTRY _ZTV5E7x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x12y7[] = {
  // 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_E7x12,    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 _ZTI7G7x12y7[];
extern void _ZN5E7x123fooEv();
extern void ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv)();
extern void ABISELECT(_ZThn24_N5E7x123fooEv,_ZThn20_N5E7x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x12y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G7x12y7[0]),
  (VTBL_ENTRY)&_ZN5E7x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G7x12y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv),
};
extern VTBL_ENTRY _ZTV7G7x12y7[];
extern void _ZN5E7x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x12__7G7x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x12[0]),
  (VTBL_ENTRY)&_ZN5E7x123fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C75E7x12__7G7x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C75E7x12__7G7x12y7[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv)();
extern void ABISELECT(_ZThn24_N5E7x123fooEv,_ZThn20_N5E7x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x12__7G7x12y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E7x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv),
};
static  VTT_ENTRY vtt_G7x12y7[] = {
  {&(_ZTV7G7x12y7[5]),  5,14},
  {&(_ZTV7G7x12y7[9]),  9,14},
  {&(_ZTV7G7x12y7[13]),  13,14},
  {&(_tg__ZTV5E7x12__7G7x12y7[3]),  3,4},
  {&(_tg__ZTV2C75E7x12__7G7x12y7[3]),  3,4},
  {&(_tg__ZTV2A1__2C75E7x12__7G7x12y7[3]),  3,4},
  {&(_tg__ZTV2A1__5E7x12__7G7x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x12y7[];
extern  VTBL_ENTRY _ZTV7G7x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x12y7[];
static VTBL_ENTRY alt_thunk_names25[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x123fooEv,_ZTv0_n12_N5E7x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x123fooEv,_ZThn20_N5E7x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x123fooEv,_ZThn20_N5E7x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x12y7 = {  "G7x12y7", // class name
  bases_G7x12y7, 6,
  &(vtc_G7x12y7[0]), // expected_vtbl_contents
  &(vtt_G7x12y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G7x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x12y7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x12y7),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  E8x12  : C8 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E8x123fooEv
  ~E8x12(); // tgen
  E8x12(); // tgen
};
//SIG(-1 E8x12) C1{ BC2{ BC3{ Fi} VBC4{ Fi} Fi} BC5{ Fi} v1 Fi}


void  E8x12 ::foo(){vfunc_called(this, "_ZN5E8x123fooEv");}
E8x12 ::~E8x12(){ note_dtor("E8x12", this);} // tgen
E8x12 ::E8x12(){ note_ctor("E8x12", this);} // tgen

static void Test_E8x12()
{
  extern Class_Descriptor cd_E8x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E8x12, buf);
    E8x12 *dp, &lv = *(dp=new (buf) E8x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E8x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E8x12)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(8,4), "E8x12");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(24,20), "E8x12");
    check_base_class_offset(lv, (C8*), 0, "E8x12");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E8x12");
    check_field_offset(lv, fd, ABISELECT(20,16), "E8x12.fd");
    test_class_info(&lv, &cd_E8x12);
    dp->~E8x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE8x12(Test_E8x12, "E8x12", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E8x12C1Ev();
extern void _ZN5E8x12D1Ev();
Name_Map name_map_E8x12[] = {
  NSPAIR(_ZN5E8x12C1Ev),
  NSPAIR(_ZN5E8x12D1Ev),
  {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_E8x12[] = {
  // 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 _ZTI5E8x12[];
extern void _ZN5E8x123fooEv();
static  VTBL_ENTRY vtc_E8x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x12[0]),
  (VTBL_ENTRY)&_ZN5E8x123fooEv,
};
extern VTBL_ENTRY _ZTV5E8x12[];
static  VTBL_ENTRY _tg__ZTV2C8__5E8x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_E8x12[] = {
  {&(_ZTV5E8x12[3]),  3,4},
  {&(_tg__ZTV2C8__5E8x12[3]),  3,3},
};
extern VTBL_ENTRY _ZTI5E8x12[];
extern  VTBL_ENTRY _ZTV5E8x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x12[];
Class_Descriptor cd_E8x12 = {  "E8x12", // class name
  bases_E8x12, 4,
  &(vtc_E8x12[0]), // expected_vtbl_contents
  &(vtt_E8x12[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E8x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E8x12),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E8x12),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  G8x12y0  : E8x12 , F1 {
  int ff;
  ~G8x12y0(); // tgen
  G8x12y0(); // tgen
};
//SIG(1 G8x12y0) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G8x12y0 ::~G8x12y0(){ note_dtor("G8x12y0", this);} // tgen
G8x12y0 ::G8x12y0(){ note_ctor("G8x12y0", this);} // tgen

static void Test_G8x12y0()
{
  extern Class_Descriptor cd_G8x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x12y0, buf);
    G8x12y0 *dp, &lv = *(dp=new (buf) G8x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x12y0)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x12*), ABISELECT(8,4), "G8x12y0");
    check_base_class_offset(lv, (B0*)(C8*)(E8x12*), ABISELECT(40,32), "G8x12y0");
    check_base_class_offset(lv, (C8*)(E8x12*), 0, "G8x12y0");
    check_base_class_offset(lv, (D0*)(E8x12*), ABISELECT(16,12), "G8x12y0");
    check_base_class_offset(lv, (E8x12*), 0, "G8x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G8x12y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G8x12y0.ff");
    test_class_info(&lv, &cd_G8x12y0);
    dp->~G8x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x12y0(Test_G8x12y0, "G8x12y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G8x12y0C1Ev();
extern void _ZN7G8x12y0D1Ev();
Name_Map name_map_G8x12y0[] = {
  NSPAIR(_ZN7G8x12y0C1Ev),
  NSPAIR(_ZN7G8x12y0D1Ev),
  {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_E8x12;
extern VTBL_ENTRY _ZTI5E8x12[];
extern  VTBL_ENTRY _ZTV5E8x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x12y0[] = {
  // 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_E8x12,    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 _ZTI7G8x12y0[];
extern void _ZN5E8x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x12y0[0]),
  (VTBL_ENTRY)&_ZN5E8x123fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G8x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G8x12y0[];
extern void _ZN5E8x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x12__7G8x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x12[0]),
  (VTBL_ENTRY)&_ZN5E8x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C85E8x12__7G8x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x12y0[] = {
  {&(_ZTV7G8x12y0[3]),  3,7},
  {&(_tg__ZTV5E8x12__7G8x12y0[3]),  3,4},
  {&(_tg__ZTV2C85E8x12__7G8x12y0[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x12y0[];
extern  VTBL_ENTRY _ZTV7G8x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x12y0[];
Class_Descriptor cd_G8x12y0 = {  "G8x12y0", // class name
  bases_G8x12y0, 6,
  &(vtc_G8x12y0[0]), // expected_vtbl_contents
  &(vtt_G8x12y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G8x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x12y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x12y0),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  G8x12y1  : virtual E8x12 , F1 {
  int ff;
  ~G8x12y1(); // tgen
  G8x12y1(); // tgen
};
//SIG(1 G8x12y1) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G8x12y1 ::~G8x12y1(){ note_dtor("G8x12y1", this);} // tgen
G8x12y1 ::G8x12y1(){ note_ctor("G8x12y1", this);} // tgen

static void Test_G8x12y1()
{
  extern Class_Descriptor cd_G8x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x12y1, buf);
    G8x12y1 *dp, &lv = *(dp=new (buf) G8x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x12y1)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x12*), ABISELECT(24,16), "G8x12y1");
    check_base_class_offset(lv, (B0*)(C8*)(E8x12*), ABISELECT(40,32), "G8x12y1");
    check_base_class_offset(lv, (C8*)(E8x12*), ABISELECT(16,12), "G8x12y1");
    check_base_class_offset(lv, (D0*)(E8x12*), ABISELECT(32,24), "G8x12y1");
    check_base_class_offset(lv, (E8x12*), ABISELECT(16,12), "G8x12y1");
    check_base_class_offset(lv, (F1*), 0, "G8x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x12y1.ff");
    test_class_info(&lv, &cd_G8x12y1);
    dp->~G8x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x12y1(Test_G8x12y1, "G8x12y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G8x12y1C1Ev();
extern void _ZN7G8x12y1D1Ev();
Name_Map name_map_G8x12y1[] = {
  NSPAIR(_ZN7G8x12y1C1Ev),
  NSPAIR(_ZN7G8x12y1D1Ev),
  {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_E8x12;
extern VTBL_ENTRY _ZTI5E8x12[];
extern  VTBL_ENTRY _ZTV5E8x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x12y1[] = {
  // 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_E8x12,    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 _ZTI7G8x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E8x123fooEv();
static  VTBL_ENTRY vtc_G8x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G8x12y1[0]),
  (VTBL_ENTRY)&_ZN5E8x123fooEv,
};
extern VTBL_ENTRY _ZTV7G8x12y1[];
extern void _ZN5E8x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x12__7G8x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x12[0]),
  (VTBL_ENTRY)&_ZN5E8x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C85E8x12__7G8x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x12y1[] = {
  {&(_ZTV7G8x12y1[4]),  4,10},
  {&(_ZTV7G8x12y1[9]),  9,10},
  {&(_tg__ZTV5E8x12__7G8x12y1[3]),  3,4},
  {&(_tg__ZTV2C85E8x12__7G8x12y1[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x12y1[];
extern  VTBL_ENTRY _ZTV7G8x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x12y1[];
Class_Descriptor cd_G8x12y1 = {  "G8x12y1", // class name
  bases_G8x12y1, 6,
  &(vtc_G8x12y1[0]), // expected_vtbl_contents
  &(vtt_G8x12y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G8x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x12y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x12y1),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  G8x12y2  : E8x12 , virtual F1 {
  int ff;
  ~G8x12y2(); // tgen
  G8x12y2(); // tgen
};
//SIG(1 G8x12y2) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G8x12y2 ::~G8x12y2(){ note_dtor("G8x12y2", this);} // tgen
G8x12y2 ::G8x12y2(){ note_ctor("G8x12y2", this);} // tgen

static void Test_G8x12y2()
{
  extern Class_Descriptor cd_G8x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x12y2, buf);
    G8x12y2 *dp, &lv = *(dp=new (buf) G8x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x12y2)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x12*), ABISELECT(8,4), "G8x12y2");
    check_base_class_offset(lv, (B0*)(C8*)(E8x12*), ABISELECT(28,24), "G8x12y2");
    check_base_class_offset(lv, (C8*)(E8x12*), 0, "G8x12y2");
    check_base_class_offset(lv, (D0*)(E8x12*), ABISELECT(16,12), "G8x12y2");
    check_base_class_offset(lv, (E8x12*), 0, "G8x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G8x12y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G8x12y2.ff");
    test_class_info(&lv, &cd_G8x12y2);
    dp->~G8x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x12y2(Test_G8x12y2, "G8x12y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G8x12y2C1Ev();
extern void _ZN7G8x12y2D1Ev();
Name_Map name_map_G8x12y2[] = {
  NSPAIR(_ZN7G8x12y2C1Ev),
  NSPAIR(_ZN7G8x12y2D1Ev),
  {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_E8x12;
extern VTBL_ENTRY _ZTI5E8x12[];
extern  VTBL_ENTRY _ZTV5E8x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x12y2[] = {
  // 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_E8x12,    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 _ZTI7G8x12y2[];
extern void _ZN5E8x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x12y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x12y2[0]),
  (VTBL_ENTRY)&_ZN5E8x123fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G8x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G8x12y2[];
extern void _ZN5E8x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x12__7G8x12y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x12[0]),
  (VTBL_ENTRY)&_ZN5E8x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C85E8x12__7G8x12y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x12y2[] = {
  {&(_ZTV7G8x12y2[4]),  4,9},
  {&(_tg__ZTV5E8x12__7G8x12y2[3]),  3,4},
  {&(_tg__ZTV2C85E8x12__7G8x12y2[3]),  3,3},
  {&(_ZTV7G8x12y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G8x12y2[];
extern  VTBL_ENTRY _ZTV7G8x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x12y2[];
Class_Descriptor cd_G8x12y2 = {  "G8x12y2", // class name
  bases_G8x12y2, 6,
  &(vtc_G8x12y2[0]), // expected_vtbl_contents
  &(vtt_G8x12y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G8x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x12y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x12y2),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  G8x12y3  : virtual E8x12 , virtual F1 {
  int ff;
  ~G8x12y3(); // tgen
  G8x12y3(); // tgen
};
//SIG(1 G8x12y3) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G8x12y3 ::~G8x12y3(){ note_dtor("G8x12y3", this);} // tgen
G8x12y3 ::G8x12y3(){ note_ctor("G8x12y3", this);} // tgen

static void Test_G8x12y3()
{
  extern Class_Descriptor cd_G8x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G8x12y3, buf);
    G8x12y3 *dp, &lv = *(dp=new (buf) G8x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G8x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x12y3)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x12*), ABISELECT(24,12), "G8x12y3");
    check_base_class_offset(lv, (B0*)(C8*)(E8x12*), ABISELECT(40,28), "G8x12y3");
    check_base_class_offset(lv, (C8*)(E8x12*), ABISELECT(16,8), "G8x12y3");
    check_base_class_offset(lv, (D0*)(E8x12*), ABISELECT(32,20), "G8x12y3");
    check_base_class_offset(lv, (E8x12*), ABISELECT(16,8), "G8x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G8x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G8x12y3.ff");
    test_class_info(&lv, &cd_G8x12y3);
    dp->~G8x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x12y3(Test_G8x12y3, "G8x12y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G8x12y3C1Ev();
extern void _ZN7G8x12y3D1Ev();
Name_Map name_map_G8x12y3[] = {
  NSPAIR(_ZN7G8x12y3C1Ev),
  NSPAIR(_ZN7G8x12y3D1Ev),
  {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_E8x12;
extern VTBL_ENTRY _ZTI5E8x12[];
extern  VTBL_ENTRY _ZTV5E8x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x12y3[] = {
  // 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_E8x12,    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 _ZTI7G8x12y3[];
extern void _ZN5E8x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x12y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G8x12y3[0]),
  (VTBL_ENTRY)&_ZN5E8x123fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G8x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G8x12y3[];
extern void _ZN5E8x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x12__7G8x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x12[0]),
  (VTBL_ENTRY)&_ZN5E8x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C85E8x12__7G8x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x12y3[] = {
  {&(_ZTV7G8x12y3[5]),  5,14},
  {&(_ZTV7G8x12y3[9]),  9,14},
  {&(_ZTV7G8x12y3[13]),  13,14},
  {&(_tg__ZTV5E8x12__7G8x12y3[3]),  3,4},
  {&(_tg__ZTV2C85E8x12__7G8x12y3[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x12y3[];
extern  VTBL_ENTRY _ZTV7G8x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x12y3[];
Class_Descriptor cd_G8x12y3 = {  "G8x12y3", // class name
  bases_G8x12y3, 6,
  &(vtc_G8x12y3[0]), // expected_vtbl_contents
  &(vtt_G8x12y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G8x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x12y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x12y3),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  G8x12y4  : E8x12 , F0 {
  int ff;
  ~G8x12y4(); // tgen
  G8x12y4(); // tgen
};
//SIG(1 G8x12y4) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G8x12y4 ::~G8x12y4(){ note_dtor("G8x12y4", this);} // tgen
G8x12y4 ::G8x12y4(){ note_ctor("G8x12y4", this);} // tgen

static void Test_G8x12y4()
{
  extern Class_Descriptor cd_G8x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G8x12y4, buf);
    G8x12y4 *dp, &lv = *(dp=new (buf) G8x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G8x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x12y4)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x12*), ABISELECT(8,4), "G8x12y4");
    check_base_class_offset(lv, (B0*)(C8*)(E8x12*), ABISELECT(32,28), "G8x12y4");
    check_base_class_offset(lv, (C8*)(E8x12*), 0, "G8x12y4");
    check_base_class_offset(lv, (D0*)(E8x12*), ABISELECT(16,12), "G8x12y4");
    check_base_class_offset(lv, (E8x12*), 0, "G8x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G8x12y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G8x12y4.ff");
    test_class_info(&lv, &cd_G8x12y4);
    dp->~G8x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x12y4(Test_G8x12y4, "G8x12y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G8x12y4C1Ev();
extern void _ZN7G8x12y4D1Ev();
Name_Map name_map_G8x12y4[] = {
  NSPAIR(_ZN7G8x12y4C1Ev),
  NSPAIR(_ZN7G8x12y4D1Ev),
  {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_E8x12;
extern VTBL_ENTRY _ZTI5E8x12[];
extern  VTBL_ENTRY _ZTV5E8x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x12y4[] = {
  // 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_E8x12,    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 _ZTI7G8x12y4[];
extern void _ZN5E8x123fooEv();
static  VTBL_ENTRY vtc_G8x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x12y4[0]),
  (VTBL_ENTRY)&_ZN5E8x123fooEv,
};
extern VTBL_ENTRY _ZTV7G8x12y4[];
extern void _ZN5E8x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x12__7G8x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x12[0]),
  (VTBL_ENTRY)&_ZN5E8x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C85E8x12__7G8x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x12y4[] = {
  {&(_ZTV7G8x12y4[3]),  3,4},
  {&(_tg__ZTV5E8x12__7G8x12y4[3]),  3,4},
  {&(_tg__ZTV2C85E8x12__7G8x12y4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x12y4[];
extern  VTBL_ENTRY _ZTV7G8x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x12y4[];
Class_Descriptor cd_G8x12y4 = {  "G8x12y4", // class name
  bases_G8x12y4, 6,
  &(vtc_G8x12y4[0]), // expected_vtbl_contents
  &(vtt_G8x12y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G8x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x12y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x12y4),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  G8x12y5  : virtual E8x12 , F0 {
  int ff;
  ~G8x12y5(); // tgen
  G8x12y5(); // tgen
};
//SIG(1 G8x12y5) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G8x12y5 ::~G8x12y5(){ note_dtor("G8x12y5", this);} // tgen
G8x12y5 ::G8x12y5(){ note_ctor("G8x12y5", this);} // tgen

static void Test_G8x12y5()
{
  extern Class_Descriptor cd_G8x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x12y5, buf);
    G8x12y5 *dp, &lv = *(dp=new (buf) G8x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x12y5)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x12*), ABISELECT(24,16), "G8x12y5");
    check_base_class_offset(lv, (B0*)(C8*)(E8x12*), ABISELECT(40,32), "G8x12y5");
    check_base_class_offset(lv, (C8*)(E8x12*), ABISELECT(16,12), "G8x12y5");
    check_base_class_offset(lv, (D0*)(E8x12*), ABISELECT(32,24), "G8x12y5");
    check_base_class_offset(lv, (E8x12*), ABISELECT(16,12), "G8x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G8x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x12y5.ff");
    test_class_info(&lv, &cd_G8x12y5);
    dp->~G8x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x12y5(Test_G8x12y5, "G8x12y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G8x12y5C1Ev();
extern void _ZN7G8x12y5D1Ev();
Name_Map name_map_G8x12y5[] = {
  NSPAIR(_ZN7G8x12y5C1Ev),
  NSPAIR(_ZN7G8x12y5D1Ev),
  {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_E8x12;
extern VTBL_ENTRY _ZTI5E8x12[];
extern  VTBL_ENTRY _ZTV5E8x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x12y5[] = {
  // 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_E8x12,    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 _ZTI7G8x12y5[];
extern void _ZN5E8x123fooEv();
static  VTBL_ENTRY vtc_G8x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G8x12y5[0]),
  (VTBL_ENTRY)&_ZN5E8x123fooEv,
};
extern VTBL_ENTRY _ZTV7G8x12y5[];
extern void _ZN5E8x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x12__7G8x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x12[0]),
  (VTBL_ENTRY)&_ZN5E8x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C85E8x12__7G8x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x12y5[] = {
  {&(_ZTV7G8x12y5[4]),  4,9},
  {&(_ZTV7G8x12y5[8]),  8,9},
  {&(_tg__ZTV5E8x12__7G8x12y5[3]),  3,4},
  {&(_tg__ZTV2C85E8x12__7G8x12y5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x12y5[];
extern  VTBL_ENTRY _ZTV7G8x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x12y5[];
Class_Descriptor cd_G8x12y5 = {  "G8x12y5", // class name
  bases_G8x12y5, 6,
  &(vtc_G8x12y5[0]), // expected_vtbl_contents
  &(vtt_G8x12y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G8x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x12y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x12y5),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  G8x12y6  : E8x12 , virtual F0 {
  int ff;
  ~G8x12y6(); // tgen
  G8x12y6(); // tgen
};
//SIG(1 G8x12y6) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G8x12y6 ::~G8x12y6(){ note_dtor("G8x12y6", this);} // tgen
G8x12y6 ::G8x12y6(){ note_ctor("G8x12y6", this);} // tgen

static void Test_G8x12y6()
{
  extern Class_Descriptor cd_G8x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G8x12y6, buf);
    G8x12y6 *dp, &lv = *(dp=new (buf) G8x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G8x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x12y6)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x12*), ABISELECT(8,4), "G8x12y6");
    check_base_class_offset(lv, (B0*)(C8*)(E8x12*), ABISELECT(28,24), "G8x12y6");
    check_base_class_offset(lv, (C8*)(E8x12*), 0, "G8x12y6");
    check_base_class_offset(lv, (D0*)(E8x12*), ABISELECT(16,12), "G8x12y6");
    check_base_class_offset(lv, (E8x12*), 0, "G8x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G8x12y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G8x12y6.ff");
    test_class_info(&lv, &cd_G8x12y6);
    dp->~G8x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x12y6(Test_G8x12y6, "G8x12y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G8x12y6C1Ev();
extern void _ZN7G8x12y6D1Ev();
Name_Map name_map_G8x12y6[] = {
  NSPAIR(_ZN7G8x12y6C1Ev),
  NSPAIR(_ZN7G8x12y6D1Ev),
  {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_E8x12;
extern VTBL_ENTRY _ZTI5E8x12[];
extern  VTBL_ENTRY _ZTV5E8x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x12y6[] = {
  // 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_E8x12,    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 _ZTI7G8x12y6[];
extern void _ZN5E8x123fooEv();
static  VTBL_ENTRY vtc_G8x12y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x12y6[0]),
  (VTBL_ENTRY)&_ZN5E8x123fooEv,
};
extern VTBL_ENTRY _ZTV7G8x12y6[];
extern void _ZN5E8x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x12__7G8x12y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x12[0]),
  (VTBL_ENTRY)&_ZN5E8x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C85E8x12__7G8x12y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x12y6[] = {
  {&(_ZTV7G8x12y6[4]),  4,5},
  {&(_tg__ZTV5E8x12__7G8x12y6[3]),  3,4},
  {&(_tg__ZTV2C85E8x12__7G8x12y6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x12y6[];
extern  VTBL_ENTRY _ZTV7G8x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x12y6[];
Class_Descriptor cd_G8x12y6 = {  "G8x12y6", // class name
  bases_G8x12y6, 6,
  &(vtc_G8x12y6[0]), // expected_vtbl_contents
  &(vtt_G8x12y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G8x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x12y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x12y6),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  G8x12y7  : virtual E8x12 , virtual F0 {
  int ff;
  ~G8x12y7(); // tgen
  G8x12y7(); // tgen
};
//SIG(1 G8x12y7) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G8x12y7 ::~G8x12y7(){ note_dtor("G8x12y7", this);} // tgen
G8x12y7 ::G8x12y7(){ note_ctor("G8x12y7", this);} // tgen

static void Test_G8x12y7()
{
  extern Class_Descriptor cd_G8x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x12y7, buf);
    G8x12y7 *dp, &lv = *(dp=new (buf) G8x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x12y7)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x12*), ABISELECT(24,12), "G8x12y7");
    check_base_class_offset(lv, (B0*)(C8*)(E8x12*), ABISELECT(40,28), "G8x12y7");
    check_base_class_offset(lv, (C8*)(E8x12*), ABISELECT(16,8), "G8x12y7");
    check_base_class_offset(lv, (D0*)(E8x12*), ABISELECT(32,20), "G8x12y7");
    check_base_class_offset(lv, (E8x12*), ABISELECT(16,8), "G8x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G8x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G8x12y7.ff");
    test_class_info(&lv, &cd_G8x12y7);
    dp->~G8x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x12y7(Test_G8x12y7, "G8x12y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G8x12y7C1Ev();
extern void _ZN7G8x12y7D1Ev();
Name_Map name_map_G8x12y7[] = {
  NSPAIR(_ZN7G8x12y7C1Ev),
  NSPAIR(_ZN7G8x12y7D1Ev),
  {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_E8x12;
extern VTBL_ENTRY _ZTI5E8x12[];
extern  VTBL_ENTRY _ZTV5E8x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x12y7[] = {
  // 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_E8x12,    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 _ZTI7G8x12y7[];
extern void _ZN5E8x123fooEv();
static  VTBL_ENTRY vtc_G8x12y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G8x12y7[0]),
  (VTBL_ENTRY)&_ZN5E8x123fooEv,
};
extern VTBL_ENTRY _ZTV7G8x12y7[];
extern void _ZN5E8x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x12__7G8x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x12[0]),
  (VTBL_ENTRY)&_ZN5E8x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C85E8x12__7G8x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x12y7[] = {
  {&(_ZTV7G8x12y7[5]),  5,10},
  {&(_ZTV7G8x12y7[9]),  9,10},
  {&(_tg__ZTV5E8x12__7G8x12y7[3]),  3,4},
  {&(_tg__ZTV2C85E8x12__7G8x12y7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x12y7[];
extern  VTBL_ENTRY _ZTV7G8x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x12y7[];
Class_Descriptor cd_G8x12y7 = {  "G8x12y7", // class name
  bases_G8x12y7, 6,
  &(vtc_G8x12y7[0]), // expected_vtbl_contents
  &(vtt_G8x12y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G8x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x12y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x12y7),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  E9x12  : C9 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E9x123fooEv
  ~E9x12(); // tgen
  E9x12(); // tgen
};
//SIG(-1 E9x12) C1{ BC2{ BC3{ v1 Fi} VBC4{ Fi} Fi} BC5{ Fi} v1 Fi}


void  E9x12 ::foo(){vfunc_called(this, "_ZN5E9x123fooEv");}
E9x12 ::~E9x12(){ note_dtor("E9x12", this);} // tgen
E9x12 ::E9x12(){ note_ctor("E9x12", this);} // tgen

static void Test_E9x12()
{
  extern Class_Descriptor cd_E9x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E9x12, buf);
    E9x12 *dp, &lv = *(dp=new (buf) E9x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E9x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E9x12)");
    check_base_class_offset(lv, (A1*)(C9*), 0, "E9x12");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(24,20), "E9x12");
    check_base_class_offset(lv, (C9*), 0, "E9x12");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E9x12");
    check_field_offset(lv, fd, ABISELECT(20,16), "E9x12.fd");
    test_class_info(&lv, &cd_E9x12);
    dp->~E9x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE9x12(Test_E9x12, "E9x12", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E9x12C1Ev();
extern void _ZN5E9x12D1Ev();
Name_Map name_map_E9x12[] = {
  NSPAIR(_ZN5E9x12C1Ev),
  NSPAIR(_ZN5E9x12D1Ev),
  {0,0}
};
extern Class_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_E9x12[] = {
  // 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 _ZTI5E9x12[];
extern void _ZN5E9x123fooEv();
static  VTBL_ENTRY vtc_E9x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x12[0]),
  (VTBL_ENTRY)&_ZN5E9x123fooEv,
};
extern VTBL_ENTRY _ZTV5E9x12[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__5E9x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E9x12[] = {
  {&(_ZTV5E9x12[3]),  3,4},
  {&(_tg__ZTV2C9__5E9x12[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E9x12[];
extern  VTBL_ENTRY _ZTV5E9x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x12[];
Class_Descriptor cd_E9x12 = {  "E9x12", // class name
  bases_E9x12, 4,
  &(vtc_E9x12[0]), // expected_vtbl_contents
  &(vtt_E9x12[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E9x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E9x12),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E9x12),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  G9x12y0  : E9x12 , F1 {
  int ff;
  ~G9x12y0(); // tgen
  G9x12y0(); // tgen
};
//SIG(1 G9x12y0) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G9x12y0 ::~G9x12y0(){ note_dtor("G9x12y0", this);} // tgen
G9x12y0 ::G9x12y0(){ note_ctor("G9x12y0", this);} // tgen

static void Test_G9x12y0()
{
  extern Class_Descriptor cd_G9x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x12y0, buf);
    G9x12y0 *dp, &lv = *(dp=new (buf) G9x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x12y0)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x12*), 0, "G9x12y0");
    check_base_class_offset(lv, (B0*)(C9*)(E9x12*), ABISELECT(40,32), "G9x12y0");
    check_base_class_offset(lv, (C9*)(E9x12*), 0, "G9x12y0");
    check_base_class_offset(lv, (D0*)(E9x12*), ABISELECT(16,12), "G9x12y0");
    check_base_class_offset(lv, (E9x12*), 0, "G9x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G9x12y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G9x12y0.ff");
    test_class_info(&lv, &cd_G9x12y0);
    dp->~G9x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x12y0(Test_G9x12y0, "G9x12y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G9x12y0C1Ev();
extern void _ZN7G9x12y0D1Ev();
Name_Map name_map_G9x12y0[] = {
  NSPAIR(_ZN7G9x12y0C1Ev),
  NSPAIR(_ZN7G9x12y0D1Ev),
  {0,0}
};
extern Class_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_E9x12;
extern VTBL_ENTRY _ZTI5E9x12[];
extern  VTBL_ENTRY _ZTV5E9x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x12y0[] = {
  // 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_E9x12,    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 _ZTI7G9x12y0[];
extern void _ZN5E9x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x12y0[0]),
  (VTBL_ENTRY)&_ZN5E9x123fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G9x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G9x12y0[];
extern void _ZN5E9x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x12__7G9x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x12[0]),
  (VTBL_ENTRY)&_ZN5E9x123fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C95E9x12__7G9x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x12y0[] = {
  {&(_ZTV7G9x12y0[3]),  3,7},
  {&(_tg__ZTV5E9x12__7G9x12y0[3]),  3,4},
  {&(_tg__ZTV2C95E9x12__7G9x12y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x12y0[];
extern  VTBL_ENTRY _ZTV7G9x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x12y0[];
Class_Descriptor cd_G9x12y0 = {  "G9x12y0", // class name
  bases_G9x12y0, 6,
  &(vtc_G9x12y0[0]), // expected_vtbl_contents
  &(vtt_G9x12y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G9x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x12y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x12y0),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  G9x12y1  : virtual E9x12 , F1 {
  int ff;
  ~G9x12y1(); // tgen
  G9x12y1(); // tgen
};
//SIG(1 G9x12y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G9x12y1 ::~G9x12y1(){ note_dtor("G9x12y1", this);} // tgen
G9x12y1 ::G9x12y1(){ note_ctor("G9x12y1", this);} // tgen

static void Test_G9x12y1()
{
  extern Class_Descriptor cd_G9x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x12y1, buf);
    G9x12y1 *dp, &lv = *(dp=new (buf) G9x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x12y1)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x12*), ABISELECT(16,12), "G9x12y1");
    check_base_class_offset(lv, (B0*)(C9*)(E9x12*), ABISELECT(40,32), "G9x12y1");
    check_base_class_offset(lv, (C9*)(E9x12*), ABISELECT(16,12), "G9x12y1");
    check_base_class_offset(lv, (D0*)(E9x12*), ABISELECT(32,24), "G9x12y1");
    check_base_class_offset(lv, (E9x12*), ABISELECT(16,12), "G9x12y1");
    check_base_class_offset(lv, (F1*), 0, "G9x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x12y1.ff");
    test_class_info(&lv, &cd_G9x12y1);
    dp->~G9x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x12y1(Test_G9x12y1, "G9x12y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G9x12y1C1Ev();
extern void _ZN7G9x12y1D1Ev();
Name_Map name_map_G9x12y1[] = {
  NSPAIR(_ZN7G9x12y1C1Ev),
  NSPAIR(_ZN7G9x12y1D1Ev),
  {0,0}
};
extern Class_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_E9x12;
extern VTBL_ENTRY _ZTI5E9x12[];
extern  VTBL_ENTRY _ZTV5E9x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x12y1[] = {
  // 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_E9x12,    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 _ZTI7G9x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E9x123fooEv();
static  VTBL_ENTRY vtc_G9x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G9x12y1[0]),
  (VTBL_ENTRY)&_ZN5E9x123fooEv,
};
extern VTBL_ENTRY _ZTV7G9x12y1[];
extern void _ZN5E9x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x12__7G9x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x12[0]),
  (VTBL_ENTRY)&_ZN5E9x123fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C95E9x12__7G9x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x12y1[] = {
  {&(_ZTV7G9x12y1[4]),  4,10},
  {&(_ZTV7G9x12y1[9]),  9,10},
  {&(_tg__ZTV5E9x12__7G9x12y1[3]),  3,4},
  {&(_tg__ZTV2C95E9x12__7G9x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x12y1[];
extern  VTBL_ENTRY _ZTV7G9x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x12y1[];
Class_Descriptor cd_G9x12y1 = {  "G9x12y1", // class name
  bases_G9x12y1, 6,
  &(vtc_G9x12y1[0]), // expected_vtbl_contents
  &(vtt_G9x12y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G9x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x12y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x12y1),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  G9x12y2  : E9x12 , virtual F1 {
  int ff;
  ~G9x12y2(); // tgen
  G9x12y2(); // tgen
};
//SIG(1 G9x12y2) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G9x12y2 ::~G9x12y2(){ note_dtor("G9x12y2", this);} // tgen
G9x12y2 ::G9x12y2(){ note_ctor("G9x12y2", this);} // tgen

static void Test_G9x12y2()
{
  extern Class_Descriptor cd_G9x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x12y2, buf);
    G9x12y2 *dp, &lv = *(dp=new (buf) G9x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x12y2)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x12*), 0, "G9x12y2");
    check_base_class_offset(lv, (B0*)(C9*)(E9x12*), ABISELECT(28,24), "G9x12y2");
    check_base_class_offset(lv, (C9*)(E9x12*), 0, "G9x12y2");
    check_base_class_offset(lv, (D0*)(E9x12*), ABISELECT(16,12), "G9x12y2");
    check_base_class_offset(lv, (E9x12*), 0, "G9x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G9x12y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G9x12y2.ff");
    test_class_info(&lv, &cd_G9x12y2);
    dp->~G9x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x12y2(Test_G9x12y2, "G9x12y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G9x12y2C1Ev();
extern void _ZN7G9x12y2D1Ev();
Name_Map name_map_G9x12y2[] = {
  NSPAIR(_ZN7G9x12y2C1Ev),
  NSPAIR(_ZN7G9x12y2D1Ev),
  {0,0}
};
extern Class_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_E9x12;
extern VTBL_ENTRY _ZTI5E9x12[];
extern  VTBL_ENTRY _ZTV5E9x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x12y2[] = {
  // 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_E9x12,    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 _ZTI7G9x12y2[];
extern void _ZN5E9x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x12y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x12y2[0]),
  (VTBL_ENTRY)&_ZN5E9x123fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G9x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G9x12y2[];
extern void _ZN5E9x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x12__7G9x12y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x12[0]),
  (VTBL_ENTRY)&_ZN5E9x123fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C95E9x12__7G9x12y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x12y2[] = {
  {&(_ZTV7G9x12y2[4]),  4,9},
  {&(_tg__ZTV5E9x12__7G9x12y2[3]),  3,4},
  {&(_tg__ZTV2C95E9x12__7G9x12y2[3]),  3,4},
  {&(_ZTV7G9x12y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G9x12y2[];
extern  VTBL_ENTRY _ZTV7G9x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x12y2[];
Class_Descriptor cd_G9x12y2 = {  "G9x12y2", // class name
  bases_G9x12y2, 6,
  &(vtc_G9x12y2[0]), // expected_vtbl_contents
  &(vtt_G9x12y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G9x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x12y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x12y2),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  G9x12y3  : virtual E9x12 , virtual F1 {
  int ff;
  ~G9x12y3(); // tgen
  G9x12y3(); // tgen
};
//SIG(1 G9x12y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G9x12y3 ::~G9x12y3(){ note_dtor("G9x12y3", this);} // tgen
G9x12y3 ::G9x12y3(){ note_ctor("G9x12y3", this);} // tgen

static void Test_G9x12y3()
{
  extern Class_Descriptor cd_G9x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G9x12y3, buf);
    G9x12y3 *dp, &lv = *(dp=new (buf) G9x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G9x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x12y3)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x12*), ABISELECT(16,8), "G9x12y3");
    check_base_class_offset(lv, (B0*)(C9*)(E9x12*), ABISELECT(40,28), "G9x12y3");
    check_base_class_offset(lv, (C9*)(E9x12*), ABISELECT(16,8), "G9x12y3");
    check_base_class_offset(lv, (D0*)(E9x12*), ABISELECT(32,20), "G9x12y3");
    check_base_class_offset(lv, (E9x12*), ABISELECT(16,8), "G9x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G9x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G9x12y3.ff");
    test_class_info(&lv, &cd_G9x12y3);
    dp->~G9x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x12y3(Test_G9x12y3, "G9x12y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G9x12y3C1Ev();
extern void _ZN7G9x12y3D1Ev();
Name_Map name_map_G9x12y3[] = {
  NSPAIR(_ZN7G9x12y3C1Ev),
  NSPAIR(_ZN7G9x12y3D1Ev),
  {0,0}
};
extern Class_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_E9x12;
extern VTBL_ENTRY _ZTI5E9x12[];
extern  VTBL_ENTRY _ZTV5E9x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x12y3[] = {
  // 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_E9x12,    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 _ZTI7G9x12y3[];
extern void _ZN5E9x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x12y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G9x12y3[0]),
  (VTBL_ENTRY)&_ZN5E9x123fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G9x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G9x12y3[];
extern void _ZN5E9x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x12__7G9x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x12[0]),
  (VTBL_ENTRY)&_ZN5E9x123fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C95E9x12__7G9x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x12y3[] = {
  {&(_ZTV7G9x12y3[5]),  5,14},
  {&(_ZTV7G9x12y3[9]),  9,14},
  {&(_ZTV7G9x12y3[13]),  13,14},
  {&(_tg__ZTV5E9x12__7G9x12y3[3]),  3,4},
  {&(_tg__ZTV2C95E9x12__7G9x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x12y3[];
extern  VTBL_ENTRY _ZTV7G9x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x12y3[];
Class_Descriptor cd_G9x12y3 = {  "G9x12y3", // class name
  bases_G9x12y3, 6,
  &(vtc_G9x12y3[0]), // expected_vtbl_contents
  &(vtt_G9x12y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G9x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x12y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x12y3),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  G9x12y4  : E9x12 , F0 {
  int ff;
  ~G9x12y4(); // tgen
  G9x12y4(); // tgen
};
//SIG(1 G9x12y4) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G9x12y4 ::~G9x12y4(){ note_dtor("G9x12y4", this);} // tgen
G9x12y4 ::G9x12y4(){ note_ctor("G9x12y4", this);} // tgen

static void Test_G9x12y4()
{
  extern Class_Descriptor cd_G9x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G9x12y4, buf);
    G9x12y4 *dp, &lv = *(dp=new (buf) G9x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G9x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x12y4)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x12*), 0, "G9x12y4");
    check_base_class_offset(lv, (B0*)(C9*)(E9x12*), ABISELECT(32,28), "G9x12y4");
    check_base_class_offset(lv, (C9*)(E9x12*), 0, "G9x12y4");
    check_base_class_offset(lv, (D0*)(E9x12*), ABISELECT(16,12), "G9x12y4");
    check_base_class_offset(lv, (E9x12*), 0, "G9x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G9x12y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G9x12y4.ff");
    test_class_info(&lv, &cd_G9x12y4);
    dp->~G9x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x12y4(Test_G9x12y4, "G9x12y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G9x12y4C1Ev();
extern void _ZN7G9x12y4D1Ev();
Name_Map name_map_G9x12y4[] = {
  NSPAIR(_ZN7G9x12y4C1Ev),
  NSPAIR(_ZN7G9x12y4D1Ev),
  {0,0}
};
extern Class_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_E9x12;
extern VTBL_ENTRY _ZTI5E9x12[];
extern  VTBL_ENTRY _ZTV5E9x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x12y4[] = {
  // 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_E9x12,    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 _ZTI7G9x12y4[];
extern void _ZN5E9x123fooEv();
static  VTBL_ENTRY vtc_G9x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x12y4[0]),
  (VTBL_ENTRY)&_ZN5E9x123fooEv,
};
extern VTBL_ENTRY _ZTV7G9x12y4[];
extern void _ZN5E9x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x12__7G9x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x12[0]),
  (VTBL_ENTRY)&_ZN5E9x123fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C95E9x12__7G9x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x12y4[] = {
  {&(_ZTV7G9x12y4[3]),  3,4},
  {&(_tg__ZTV5E9x12__7G9x12y4[3]),  3,4},
  {&(_tg__ZTV2C95E9x12__7G9x12y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x12y4[];
extern  VTBL_ENTRY _ZTV7G9x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x12y4[];
Class_Descriptor cd_G9x12y4 = {  "G9x12y4", // class name
  bases_G9x12y4, 6,
  &(vtc_G9x12y4[0]), // expected_vtbl_contents
  &(vtt_G9x12y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G9x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x12y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x12y4),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  G9x12y5  : virtual E9x12 , F0 {
  int ff;
  ~G9x12y5(); // tgen
  G9x12y5(); // tgen
};
//SIG(1 G9x12y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G9x12y5 ::~G9x12y5(){ note_dtor("G9x12y5", this);} // tgen
G9x12y5 ::G9x12y5(){ note_ctor("G9x12y5", this);} // tgen

static void Test_G9x12y5()
{
  extern Class_Descriptor cd_G9x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x12y5, buf);
    G9x12y5 *dp, &lv = *(dp=new (buf) G9x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x12y5)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x12*), ABISELECT(16,12), "G9x12y5");
    check_base_class_offset(lv, (B0*)(C9*)(E9x12*), ABISELECT(40,32), "G9x12y5");
    check_base_class_offset(lv, (C9*)(E9x12*), ABISELECT(16,12), "G9x12y5");
    check_base_class_offset(lv, (D0*)(E9x12*), ABISELECT(32,24), "G9x12y5");
    check_base_class_offset(lv, (E9x12*), ABISELECT(16,12), "G9x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G9x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x12y5.ff");
    test_class_info(&lv, &cd_G9x12y5);
    dp->~G9x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x12y5(Test_G9x12y5, "G9x12y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G9x12y5C1Ev();
extern void _ZN7G9x12y5D1Ev();
Name_Map name_map_G9x12y5[] = {
  NSPAIR(_ZN7G9x12y5C1Ev),
  NSPAIR(_ZN7G9x12y5D1Ev),
  {0,0}
};
extern Class_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_E9x12;
extern VTBL_ENTRY _ZTI5E9x12[];
extern  VTBL_ENTRY _ZTV5E9x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x12y5[] = {
  // 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_E9x12,    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 _ZTI7G9x12y5[];
extern void _ZN5E9x123fooEv();
static  VTBL_ENTRY vtc_G9x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G9x12y5[0]),
  (VTBL_ENTRY)&_ZN5E9x123fooEv,
};
extern VTBL_ENTRY _ZTV7G9x12y5[];
extern void _ZN5E9x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x12__7G9x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x12[0]),
  (VTBL_ENTRY)&_ZN5E9x123fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C95E9x12__7G9x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x12y5[] = {
  {&(_ZTV7G9x12y5[4]),  4,9},
  {&(_ZTV7G9x12y5[8]),  8,9},
  {&(_tg__ZTV5E9x12__7G9x12y5[3]),  3,4},
  {&(_tg__ZTV2C95E9x12__7G9x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x12y5[];
extern  VTBL_ENTRY _ZTV7G9x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x12y5[];
Class_Descriptor cd_G9x12y5 = {  "G9x12y5", // class name
  bases_G9x12y5, 6,
  &(vtc_G9x12y5[0]), // expected_vtbl_contents
  &(vtt_G9x12y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G9x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x12y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x12y5),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  G9x12y6  : E9x12 , virtual F0 {
  int ff;
  ~G9x12y6(); // tgen
  G9x12y6(); // tgen
};
//SIG(1 G9x12y6) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G9x12y6 ::~G9x12y6(){ note_dtor("G9x12y6", this);} // tgen
G9x12y6 ::G9x12y6(){ note_ctor("G9x12y6", this);} // tgen

static void Test_G9x12y6()
{
  extern Class_Descriptor cd_G9x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G9x12y6, buf);
    G9x12y6 *dp, &lv = *(dp=new (buf) G9x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G9x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x12y6)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x12*), 0, "G9x12y6");
    check_base_class_offset(lv, (B0*)(C9*)(E9x12*), ABISELECT(28,24), "G9x12y6");
    check_base_class_offset(lv, (C9*)(E9x12*), 0, "G9x12y6");
    check_base_class_offset(lv, (D0*)(E9x12*), ABISELECT(16,12), "G9x12y6");
    check_base_class_offset(lv, (E9x12*), 0, "G9x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G9x12y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G9x12y6.ff");
    test_class_info(&lv, &cd_G9x12y6);
    dp->~G9x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x12y6(Test_G9x12y6, "G9x12y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G9x12y6C1Ev();
extern void _ZN7G9x12y6D1Ev();
Name_Map name_map_G9x12y6[] = {
  NSPAIR(_ZN7G9x12y6C1Ev),
  NSPAIR(_ZN7G9x12y6D1Ev),
  {0,0}
};
extern Class_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_E9x12;
extern VTBL_ENTRY _ZTI5E9x12[];
extern  VTBL_ENTRY _ZTV5E9x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x12y6[] = {
  // 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_E9x12,    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 _ZTI7G9x12y6[];
extern void _ZN5E9x123fooEv();
static  VTBL_ENTRY vtc_G9x12y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x12y6[0]),
  (VTBL_ENTRY)&_ZN5E9x123fooEv,
};
extern VTBL_ENTRY _ZTV7G9x12y6[];
extern void _ZN5E9x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x12__7G9x12y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x12[0]),
  (VTBL_ENTRY)&_ZN5E9x123fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C95E9x12__7G9x12y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x12y6[] = {
  {&(_ZTV7G9x12y6[4]),  4,5},
  {&(_tg__ZTV5E9x12__7G9x12y6[3]),  3,4},
  {&(_tg__ZTV2C95E9x12__7G9x12y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x12y6[];
extern  VTBL_ENTRY _ZTV7G9x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x12y6[];
Class_Descriptor cd_G9x12y6 = {  "G9x12y6", // class name
  bases_G9x12y6, 6,
  &(vtc_G9x12y6[0]), // expected_vtbl_contents
  &(vtt_G9x12y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G9x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x12y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x12y6),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  G9x12y7  : virtual E9x12 , virtual F0 {
  int ff;
  ~G9x12y7(); // tgen
  G9x12y7(); // tgen
};
//SIG(1 G9x12y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G9x12y7 ::~G9x12y7(){ note_dtor("G9x12y7", this);} // tgen
G9x12y7 ::G9x12y7(){ note_ctor("G9x12y7", this);} // tgen

static void Test_G9x12y7()
{
  extern Class_Descriptor cd_G9x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x12y7, buf);
    G9x12y7 *dp, &lv = *(dp=new (buf) G9x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x12y7)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x12*), ABISELECT(16,8), "G9x12y7");
    check_base_class_offset(lv, (B0*)(C9*)(E9x12*), ABISELECT(40,28), "G9x12y7");
    check_base_class_offset(lv, (C9*)(E9x12*), ABISELECT(16,8), "G9x12y7");
    check_base_class_offset(lv, (D0*)(E9x12*), ABISELECT(32,20), "G9x12y7");
    check_base_class_offset(lv, (E9x12*), ABISELECT(16,8), "G9x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G9x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G9x12y7.ff");
    test_class_info(&lv, &cd_G9x12y7);
    dp->~G9x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x12y7(Test_G9x12y7, "G9x12y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G9x12y7C1Ev();
extern void _ZN7G9x12y7D1Ev();
Name_Map name_map_G9x12y7[] = {
  NSPAIR(_ZN7G9x12y7C1Ev),
  NSPAIR(_ZN7G9x12y7D1Ev),
  {0,0}
};
extern Class_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_E9x12;
extern VTBL_ENTRY _ZTI5E9x12[];
extern  VTBL_ENTRY _ZTV5E9x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x12y7[] = {
  // 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_E9x12,    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 _ZTI7G9x12y7[];
extern void _ZN5E9x123fooEv();
static  VTBL_ENTRY vtc_G9x12y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G9x12y7[0]),
  (VTBL_ENTRY)&_ZN5E9x123fooEv,
};
extern VTBL_ENTRY _ZTV7G9x12y7[];
extern void _ZN5E9x123fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x12__7G9x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x12[0]),
  (VTBL_ENTRY)&_ZN5E9x123fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C95E9x12__7G9x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x12y7[] = {
  {&(_ZTV7G9x12y7[5]),  5,10},
  {&(_ZTV7G9x12y7[9]),  9,10},
  {&(_tg__ZTV5E9x12__7G9x12y7[3]),  3,4},
  {&(_tg__ZTV2C95E9x12__7G9x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x12y7[];
extern  VTBL_ENTRY _ZTV7G9x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x12y7[];
Class_Descriptor cd_G9x12y7 = {  "G9x12y7", // class name
  bases_G9x12y7, 6,
  &(vtc_G9x12y7[0]), // expected_vtbl_contents
  &(vtt_G9x12y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G9x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x12y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x12y7),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  E10x12  : C10 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E10x123fooEv
  ~E10x12(); // tgen
  E10x12(); // tgen
};
//SIG(-1 E10x12) C1{ BC2{ VBC3{ Fi} VBC4{ Fi} Fi} BC5{ Fi} v1 Fi}


void  E10x12 ::foo(){vfunc_called(this, "_ZN6E10x123fooEv");}
E10x12 ::~E10x12(){ note_dtor("E10x12", this);} // tgen
E10x12 ::E10x12(){ note_ctor("E10x12", this);} // tgen

static void Test_E10x12()
{
  extern Class_Descriptor cd_E10x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E10x12, buf);
    E10x12 *dp, &lv = *(dp=new (buf) E10x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E10x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E10x12)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(20,16), "E10x12");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(24,20), "E10x12");
    check_base_class_offset(lv, (C10*), 0, "E10x12");
    check_base_class_offset(lv, (D0*), ABISELECT(12,8), "E10x12");
    check_field_offset(lv, fd, ABISELECT(16,12), "E10x12.fd");
    test_class_info(&lv, &cd_E10x12);
    dp->~E10x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE10x12(Test_E10x12, "E10x12", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6E10x12C1Ev();
extern void _ZN6E10x12D1Ev();
Name_Map name_map_E10x12[] = {
  NSPAIR(_ZN6E10x12C1Ev),
  NSPAIR(_ZN6E10x12D1Ev),
  {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_E10x12[] = {
  // 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 _ZTI6E10x12[];
extern void _ZN6E10x123fooEv();
static  VTBL_ENTRY vtc_E10x12[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x12[0]),
  (VTBL_ENTRY)&_ZN6E10x123fooEv,
};
extern VTBL_ENTRY _ZTV6E10x12[];
static  VTBL_ENTRY _tg__ZTV3C10__6E10x12[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_E10x12[] = {
  {&(_ZTV6E10x12[4]),  4,5},
  {&(_tg__ZTV3C10__6E10x12[4]),  4,4},
};
extern VTBL_ENTRY _ZTI6E10x12[];
extern  VTBL_ENTRY _ZTV6E10x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x12[];
Class_Descriptor cd_E10x12 = {  "E10x12", // class name
  bases_E10x12, 4,
  &(vtc_E10x12[0]), // expected_vtbl_contents
  &(vtt_E10x12[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6E10x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E10x12),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E10x12),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  G10x12y0  : E10x12 , F1 {
  int ff;
  ~G10x12y0(); // tgen
  G10x12y0(); // tgen
};
//SIG(1 G10x12y0) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G10x12y0 ::~G10x12y0(){ note_dtor("G10x12y0", this);} // tgen
G10x12y0 ::G10x12y0(){ note_ctor("G10x12y0", this);} // tgen

static void Test_G10x12y0()
{
  extern Class_Descriptor cd_G10x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x12y0, buf);
    G10x12y0 *dp, &lv = *(dp=new (buf) G10x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x12y0)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x12*), ABISELECT(40,28), "G10x12y0");
    check_base_class_offset(lv, (B0*)(C10*)(E10x12*), ABISELECT(44,32), "G10x12y0");
    check_base_class_offset(lv, (C10*)(E10x12*), 0, "G10x12y0");
    check_base_class_offset(lv, (D0*)(E10x12*), ABISELECT(12,8), "G10x12y0");
    check_base_class_offset(lv, (E10x12*), 0, "G10x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G10x12y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G10x12y0.ff");
    test_class_info(&lv, &cd_G10x12y0);
    dp->~G10x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x12y0(Test_G10x12y0, "G10x12y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G10x12y0C1Ev();
extern void _ZN8G10x12y0D1Ev();
Name_Map name_map_G10x12y0[] = {
  NSPAIR(_ZN8G10x12y0C1Ev),
  NSPAIR(_ZN8G10x12y0D1Ev),
  {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_E10x12;
extern VTBL_ENTRY _ZTI6E10x12[];
extern  VTBL_ENTRY _ZTV6E10x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x12y0[] = {
  // 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_E10x12,    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 _ZTI8G10x12y0[];
extern void _ZN6E10x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x12y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x12y0[0]),
  (VTBL_ENTRY)&_ZN6E10x123fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G10x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G10x12y0[];
extern void _ZN6E10x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x12__8G10x12y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x12[0]),
  (VTBL_ENTRY)&_ZN6E10x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C106E10x12__8G10x12y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x12y0[] = {
  {&(_ZTV8G10x12y0[4]),  4,8},
  {&(_tg__ZTV6E10x12__8G10x12y0[4]),  4,5},
  {&(_tg__ZTV3C106E10x12__8G10x12y0[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x12y0[];
extern  VTBL_ENTRY _ZTV8G10x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x12y0[];
Class_Descriptor cd_G10x12y0 = {  "G10x12y0", // class name
  bases_G10x12y0, 6,
  &(vtc_G10x12y0[0]), // expected_vtbl_contents
  &(vtt_G10x12y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G10x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x12y0),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x12y0),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  G10x12y1  : virtual E10x12 , F1 {
  int ff;
  ~G10x12y1(); // tgen
  G10x12y1(); // tgen
};
//SIG(1 G10x12y1) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G10x12y1 ::~G10x12y1(){ note_dtor("G10x12y1", this);} // tgen
G10x12y1 ::G10x12y1(){ note_ctor("G10x12y1", this);} // tgen

static void Test_G10x12y1()
{
  extern Class_Descriptor cd_G10x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x12y1, buf);
    G10x12y1 *dp, &lv = *(dp=new (buf) G10x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x12y1)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x12*), ABISELECT(36,28), "G10x12y1");
    check_base_class_offset(lv, (B0*)(C10*)(E10x12*), ABISELECT(40,32), "G10x12y1");
    check_base_class_offset(lv, (C10*)(E10x12*), ABISELECT(16,12), "G10x12y1");
    check_base_class_offset(lv, (D0*)(E10x12*), ABISELECT(28,20), "G10x12y1");
    check_base_class_offset(lv, (E10x12*), ABISELECT(16,12), "G10x12y1");
    check_base_class_offset(lv, (F1*), 0, "G10x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x12y1.ff");
    test_class_info(&lv, &cd_G10x12y1);
    dp->~G10x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x12y1(Test_G10x12y1, "G10x12y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G10x12y1C1Ev();
extern void _ZN8G10x12y1D1Ev();
Name_Map name_map_G10x12y1[] = {
  NSPAIR(_ZN8G10x12y1C1Ev),
  NSPAIR(_ZN8G10x12y1D1Ev),
  {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_E10x12;
extern VTBL_ENTRY _ZTI6E10x12[];
extern  VTBL_ENTRY _ZTV6E10x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x12y1[] = {
  // 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_E10x12,    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 _ZTI8G10x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E10x123fooEv();
static  VTBL_ENTRY vtc_G10x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G10x12y1[0]),
  (VTBL_ENTRY)&_ZN6E10x123fooEv,
};
extern VTBL_ENTRY _ZTV8G10x12y1[];
extern void _ZN6E10x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x12__8G10x12y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x12[0]),
  (VTBL_ENTRY)&_ZN6E10x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C106E10x12__8G10x12y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x12y1[] = {
  {&(_ZTV8G10x12y1[5]),  5,12},
  {&(_ZTV8G10x12y1[11]),  11,12},
  {&(_tg__ZTV6E10x12__8G10x12y1[4]),  4,5},
  {&(_tg__ZTV3C106E10x12__8G10x12y1[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x12y1[];
extern  VTBL_ENTRY _ZTV8G10x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x12y1[];
Class_Descriptor cd_G10x12y1 = {  "G10x12y1", // class name
  bases_G10x12y1, 6,
  &(vtc_G10x12y1[0]), // expected_vtbl_contents
  &(vtt_G10x12y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G10x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x12y1),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x12y1),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  G10x12y2  : E10x12 , virtual F1 {
  int ff;
  ~G10x12y2(); // tgen
  G10x12y2(); // tgen
};
//SIG(1 G10x12y2) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G10x12y2 ::~G10x12y2(){ note_dtor("G10x12y2", this);} // tgen
G10x12y2 ::G10x12y2(){ note_ctor("G10x12y2", this);} // tgen

static void Test_G10x12y2()
{
  extern Class_Descriptor cd_G10x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x12y2, buf);
    G10x12y2 *dp, &lv = *(dp=new (buf) G10x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x12y2)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x12*), ABISELECT(24,20), "G10x12y2");
    check_base_class_offset(lv, (B0*)(C10*)(E10x12*), ABISELECT(28,24), "G10x12y2");
    check_base_class_offset(lv, (C10*)(E10x12*), 0, "G10x12y2");
    check_base_class_offset(lv, (D0*)(E10x12*), ABISELECT(12,8), "G10x12y2");
    check_base_class_offset(lv, (E10x12*), 0, "G10x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G10x12y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G10x12y2.ff");
    test_class_info(&lv, &cd_G10x12y2);
    dp->~G10x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x12y2(Test_G10x12y2, "G10x12y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G10x12y2C1Ev();
extern void _ZN8G10x12y2D1Ev();
Name_Map name_map_G10x12y2[] = {
  NSPAIR(_ZN8G10x12y2C1Ev),
  NSPAIR(_ZN8G10x12y2D1Ev),
  {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_E10x12;
extern VTBL_ENTRY _ZTI6E10x12[];
extern  VTBL_ENTRY _ZTV6E10x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x12y2[] = {
  // 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_E10x12,    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 _ZTI8G10x12y2[];
extern void _ZN6E10x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x12y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x12y2[0]),
  (VTBL_ENTRY)&_ZN6E10x123fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G10x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G10x12y2[];
extern void _ZN6E10x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x12__8G10x12y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x12[0]),
  (VTBL_ENTRY)&_ZN6E10x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C106E10x12__8G10x12y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x12y2[] = {
  {&(_ZTV8G10x12y2[5]),  5,10},
  {&(_tg__ZTV6E10x12__8G10x12y2[4]),  4,5},
  {&(_tg__ZTV3C106E10x12__8G10x12y2[4]),  4,4},
  {&(_ZTV8G10x12y2[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G10x12y2[];
extern  VTBL_ENTRY _ZTV8G10x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x12y2[];
Class_Descriptor cd_G10x12y2 = {  "G10x12y2", // class name
  bases_G10x12y2, 6,
  &(vtc_G10x12y2[0]), // expected_vtbl_contents
  &(vtt_G10x12y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G10x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x12y2),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x12y2),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  G10x12y3  : virtual E10x12 , virtual F1 {
  int ff;
  ~G10x12y3(); // tgen
  G10x12y3(); // tgen
};
//SIG(1 G10x12y3) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G10x12y3 ::~G10x12y3(){ note_dtor("G10x12y3", this);} // tgen
G10x12y3 ::G10x12y3(){ note_ctor("G10x12y3", this);} // tgen

static void Test_G10x12y3()
{
  extern Class_Descriptor cd_G10x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G10x12y3, buf);
    G10x12y3 *dp, &lv = *(dp=new (buf) G10x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G10x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x12y3)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x12*), ABISELECT(36,24), "G10x12y3");
    check_base_class_offset(lv, (B0*)(C10*)(E10x12*), ABISELECT(40,28), "G10x12y3");
    check_base_class_offset(lv, (C10*)(E10x12*), ABISELECT(16,8), "G10x12y3");
    check_base_class_offset(lv, (D0*)(E10x12*), ABISELECT(28,16), "G10x12y3");
    check_base_class_offset(lv, (E10x12*), ABISELECT(16,8), "G10x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G10x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G10x12y3.ff");
    test_class_info(&lv, &cd_G10x12y3);
    dp->~G10x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x12y3(Test_G10x12y3, "G10x12y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G10x12y3C1Ev();
extern void _ZN8G10x12y3D1Ev();
Name_Map name_map_G10x12y3[] = {
  NSPAIR(_ZN8G10x12y3C1Ev),
  NSPAIR(_ZN8G10x12y3D1Ev),
  {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_E10x12;
extern VTBL_ENTRY _ZTI6E10x12[];
extern  VTBL_ENTRY _ZTV6E10x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x12y3[] = {
  // 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_E10x12,    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 _ZTI8G10x12y3[];
extern void _ZN6E10x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x12y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G10x12y3[0]),
  (VTBL_ENTRY)&_ZN6E10x123fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G10x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G10x12y3[];
extern void _ZN6E10x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x12__8G10x12y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x12[0]),
  (VTBL_ENTRY)&_ZN6E10x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C106E10x12__8G10x12y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x12y3[] = {
  {&(_ZTV8G10x12y3[6]),  6,16},
  {&(_ZTV8G10x12y3[11]),  11,16},
  {&(_ZTV8G10x12y3[15]),  15,16},
  {&(_tg__ZTV6E10x12__8G10x12y3[4]),  4,5},
  {&(_tg__ZTV3C106E10x12__8G10x12y3[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x12y3[];
extern  VTBL_ENTRY _ZTV8G10x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x12y3[];
Class_Descriptor cd_G10x12y3 = {  "G10x12y3", // class name
  bases_G10x12y3, 6,
  &(vtc_G10x12y3[0]), // expected_vtbl_contents
  &(vtt_G10x12y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G10x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x12y3),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x12y3),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  G10x12y4  : E10x12 , F0 {
  int ff;
  ~G10x12y4(); // tgen
  G10x12y4(); // tgen
};
//SIG(1 G10x12y4) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G10x12y4 ::~G10x12y4(){ note_dtor("G10x12y4", this);} // tgen
G10x12y4 ::G10x12y4(){ note_ctor("G10x12y4", this);} // tgen

static void Test_G10x12y4()
{
  extern Class_Descriptor cd_G10x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G10x12y4, buf);
    G10x12y4 *dp, &lv = *(dp=new (buf) G10x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G10x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x12y4)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x12*), ABISELECT(28,24), "G10x12y4");
    check_base_class_offset(lv, (B0*)(C10*)(E10x12*), ABISELECT(32,28), "G10x12y4");
    check_base_class_offset(lv, (C10*)(E10x12*), 0, "G10x12y4");
    check_base_class_offset(lv, (D0*)(E10x12*), ABISELECT(12,8), "G10x12y4");
    check_base_class_offset(lv, (E10x12*), 0, "G10x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G10x12y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G10x12y4.ff");
    test_class_info(&lv, &cd_G10x12y4);
    dp->~G10x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x12y4(Test_G10x12y4, "G10x12y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G10x12y4C1Ev();
extern void _ZN8G10x12y4D1Ev();
Name_Map name_map_G10x12y4[] = {
  NSPAIR(_ZN8G10x12y4C1Ev),
  NSPAIR(_ZN8G10x12y4D1Ev),
  {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_E10x12;
extern VTBL_ENTRY _ZTI6E10x12[];
extern  VTBL_ENTRY _ZTV6E10x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x12y4[] = {
  // 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_E10x12,    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 _ZTI8G10x12y4[];
extern void _ZN6E10x123fooEv();
static  VTBL_ENTRY vtc_G10x12y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x12y4[0]),
  (VTBL_ENTRY)&_ZN6E10x123fooEv,
};
extern VTBL_ENTRY _ZTV8G10x12y4[];
extern void _ZN6E10x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x12__8G10x12y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x12[0]),
  (VTBL_ENTRY)&_ZN6E10x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C106E10x12__8G10x12y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x12y4[] = {
  {&(_ZTV8G10x12y4[4]),  4,5},
  {&(_tg__ZTV6E10x12__8G10x12y4[4]),  4,5},
  {&(_tg__ZTV3C106E10x12__8G10x12y4[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x12y4[];
extern  VTBL_ENTRY _ZTV8G10x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x12y4[];
Class_Descriptor cd_G10x12y4 = {  "G10x12y4", // class name
  bases_G10x12y4, 6,
  &(vtc_G10x12y4[0]), // expected_vtbl_contents
  &(vtt_G10x12y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G10x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x12y4),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x12y4),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  G10x12y5  : virtual E10x12 , F0 {
  int ff;
  ~G10x12y5(); // tgen
  G10x12y5(); // tgen
};
//SIG(1 G10x12y5) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G10x12y5 ::~G10x12y5(){ note_dtor("G10x12y5", this);} // tgen
G10x12y5 ::G10x12y5(){ note_ctor("G10x12y5", this);} // tgen

static void Test_G10x12y5()
{
  extern Class_Descriptor cd_G10x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x12y5, buf);
    G10x12y5 *dp, &lv = *(dp=new (buf) G10x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x12y5)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x12*), ABISELECT(36,28), "G10x12y5");
    check_base_class_offset(lv, (B0*)(C10*)(E10x12*), ABISELECT(40,32), "G10x12y5");
    check_base_class_offset(lv, (C10*)(E10x12*), ABISELECT(16,12), "G10x12y5");
    check_base_class_offset(lv, (D0*)(E10x12*), ABISELECT(28,20), "G10x12y5");
    check_base_class_offset(lv, (E10x12*), ABISELECT(16,12), "G10x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G10x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x12y5.ff");
    test_class_info(&lv, &cd_G10x12y5);
    dp->~G10x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x12y5(Test_G10x12y5, "G10x12y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G10x12y5C1Ev();
extern void _ZN8G10x12y5D1Ev();
Name_Map name_map_G10x12y5[] = {
  NSPAIR(_ZN8G10x12y5C1Ev),
  NSPAIR(_ZN8G10x12y5D1Ev),
  {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_E10x12;
extern VTBL_ENTRY _ZTI6E10x12[];
extern  VTBL_ENTRY _ZTV6E10x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x12y5[] = {
  // 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_E10x12,    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 _ZTI8G10x12y5[];
extern void _ZN6E10x123fooEv();
static  VTBL_ENTRY vtc_G10x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G10x12y5[0]),
  (VTBL_ENTRY)&_ZN6E10x123fooEv,
};
extern VTBL_ENTRY _ZTV8G10x12y5[];
extern void _ZN6E10x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x12__8G10x12y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x12[0]),
  (VTBL_ENTRY)&_ZN6E10x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C106E10x12__8G10x12y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x12y5[] = {
  {&(_ZTV8G10x12y5[5]),  5,11},
  {&(_ZTV8G10x12y5[10]),  10,11},
  {&(_tg__ZTV6E10x12__8G10x12y5[4]),  4,5},
  {&(_tg__ZTV3C106E10x12__8G10x12y5[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x12y5[];
extern  VTBL_ENTRY _ZTV8G10x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x12y5[];
Class_Descriptor cd_G10x12y5 = {  "G10x12y5", // class name
  bases_G10x12y5, 6,
  &(vtc_G10x12y5[0]), // expected_vtbl_contents
  &(vtt_G10x12y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G10x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x12y5),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x12y5),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  G10x12y6  : E10x12 , virtual F0 {
  int ff;
  ~G10x12y6(); // tgen
  G10x12y6(); // tgen
};
//SIG(1 G10x12y6) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G10x12y6 ::~G10x12y6(){ note_dtor("G10x12y6", this);} // tgen
G10x12y6 ::G10x12y6(){ note_ctor("G10x12y6", this);} // tgen

static void Test_G10x12y6()
{
  extern Class_Descriptor cd_G10x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G10x12y6, buf);
    G10x12y6 *dp, &lv = *(dp=new (buf) G10x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G10x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x12y6)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x12*), ABISELECT(24,20), "G10x12y6");
    check_base_class_offset(lv, (B0*)(C10*)(E10x12*), ABISELECT(28,24), "G10x12y6");
    check_base_class_offset(lv, (C10*)(E10x12*), 0, "G10x12y6");
    check_base_class_offset(lv, (D0*)(E10x12*), ABISELECT(12,8), "G10x12y6");
    check_base_class_offset(lv, (E10x12*), 0, "G10x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G10x12y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G10x12y6.ff");
    test_class_info(&lv, &cd_G10x12y6);
    dp->~G10x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x12y6(Test_G10x12y6, "G10x12y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G10x12y6C1Ev();
extern void _ZN8G10x12y6D1Ev();
Name_Map name_map_G10x12y6[] = {
  NSPAIR(_ZN8G10x12y6C1Ev),
  NSPAIR(_ZN8G10x12y6D1Ev),
  {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_E10x12;
extern VTBL_ENTRY _ZTI6E10x12[];
extern  VTBL_ENTRY _ZTV6E10x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x12y6[] = {
  // 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_E10x12,    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 _ZTI8G10x12y6[];
extern void _ZN6E10x123fooEv();
static  VTBL_ENTRY vtc_G10x12y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x12y6[0]),
  (VTBL_ENTRY)&_ZN6E10x123fooEv,
};
extern VTBL_ENTRY _ZTV8G10x12y6[];
extern void _ZN6E10x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x12__8G10x12y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x12[0]),
  (VTBL_ENTRY)&_ZN6E10x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C106E10x12__8G10x12y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x12y6[] = {
  {&(_ZTV8G10x12y6[5]),  5,6},
  {&(_tg__ZTV6E10x12__8G10x12y6[4]),  4,5},
  {&(_tg__ZTV3C106E10x12__8G10x12y6[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x12y6[];
extern  VTBL_ENTRY _ZTV8G10x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x12y6[];
Class_Descriptor cd_G10x12y6 = {  "G10x12y6", // class name
  bases_G10x12y6, 6,
  &(vtc_G10x12y6[0]), // expected_vtbl_contents
  &(vtt_G10x12y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G10x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x12y6),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x12y6),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  G10x12y7  : virtual E10x12 , virtual F0 {
  int ff;
  ~G10x12y7(); // tgen
  G10x12y7(); // tgen
};
//SIG(1 G10x12y7) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G10x12y7 ::~G10x12y7(){ note_dtor("G10x12y7", this);} // tgen
G10x12y7 ::G10x12y7(){ note_ctor("G10x12y7", this);} // tgen

static void Test_G10x12y7()
{
  extern Class_Descriptor cd_G10x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x12y7, buf);
    G10x12y7 *dp, &lv = *(dp=new (buf) G10x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x12y7)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x12*), ABISELECT(36,24), "G10x12y7");
    check_base_class_offset(lv, (B0*)(C10*)(E10x12*), ABISELECT(40,28), "G10x12y7");
    check_base_class_offset(lv, (C10*)(E10x12*), ABISELECT(16,8), "G10x12y7");
    check_base_class_offset(lv, (D0*)(E10x12*), ABISELECT(28,16), "G10x12y7");
    check_base_class_offset(lv, (E10x12*), ABISELECT(16,8), "G10x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G10x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G10x12y7.ff");
    test_class_info(&lv, &cd_G10x12y7);
    dp->~G10x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x12y7(Test_G10x12y7, "G10x12y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G10x12y7C1Ev();
extern void _ZN8G10x12y7D1Ev();
Name_Map name_map_G10x12y7[] = {
  NSPAIR(_ZN8G10x12y7C1Ev),
  NSPAIR(_ZN8G10x12y7D1Ev),
  {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_E10x12;
extern VTBL_ENTRY _ZTI6E10x12[];
extern  VTBL_ENTRY _ZTV6E10x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x12y7[] = {
  // 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_E10x12,    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 _ZTI8G10x12y7[];
extern void _ZN6E10x123fooEv();
static  VTBL_ENTRY vtc_G10x12y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G10x12y7[0]),
  (VTBL_ENTRY)&_ZN6E10x123fooEv,
};
extern VTBL_ENTRY _ZTV8G10x12y7[];
extern void _ZN6E10x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x12__8G10x12y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x12[0]),
  (VTBL_ENTRY)&_ZN6E10x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C106E10x12__8G10x12y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x12y7[] = {
  {&(_ZTV8G10x12y7[6]),  6,12},
  {&(_ZTV8G10x12y7[11]),  11,12},
  {&(_tg__ZTV6E10x12__8G10x12y7[4]),  4,5},
  {&(_tg__ZTV3C106E10x12__8G10x12y7[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x12y7[];
extern  VTBL_ENTRY _ZTV8G10x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x12y7[];
Class_Descriptor cd_G10x12y7 = {  "G10x12y7", // class name
  bases_G10x12y7, 6,
  &(vtc_G10x12y7[0]), // expected_vtbl_contents
  &(vtt_G10x12y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G10x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x12y7),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x12y7),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  E11x12  : C11 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E11x123fooEv
  ~E11x12(); // tgen
  E11x12(); // tgen
};
//SIG(-1 E11x12) C1{ BC2{ VBC3{ v1 Fi} VBC4{ Fi} Fi} BC5{ Fi} v1 Fi}


void  E11x12 ::foo(){vfunc_called(this, "_ZN6E11x123fooEv");}
E11x12 ::~E11x12(){ note_dtor("E11x12", this);} // tgen
E11x12 ::E11x12(){ note_ctor("E11x12", this);} // tgen

static void Test_E11x12()
{
  extern Class_Descriptor cd_E11x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E11x12, buf);
    E11x12 *dp, &lv = *(dp=new (buf) E11x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E11x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E11x12)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(24,16), "E11x12");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(36,24), "E11x12");
    check_base_class_offset(lv, (C11*), 0, "E11x12");
    check_base_class_offset(lv, (D0*), ABISELECT(12,8), "E11x12");
    check_field_offset(lv, fd, ABISELECT(16,12), "E11x12.fd");
    test_class_info(&lv, &cd_E11x12);
    dp->~E11x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE11x12(Test_E11x12, "E11x12", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E11x12C1Ev();
extern void _ZN6E11x12D1Ev();
Name_Map name_map_E11x12[] = {
  NSPAIR(_ZN6E11x12C1Ev),
  NSPAIR(_ZN6E11x12D1Ev),
  {0,0}
};
extern Class_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_E11x12[] = {
  // 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_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 _ZTI6E11x12[];
extern void _ZN6E11x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv)();
extern void ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn16_N6E11x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E11x12[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x12[0]),
  (VTBL_ENTRY)&_ZN6E11x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E11x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv),
};
extern VTBL_ENTRY _ZTV6E11x12[];
static  VTBL_ENTRY _tg__ZTV3C11__6E11x12[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__6E11x12[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E11x12[] = {
  {&(_ZTV6E11x12[4]),  4,9},
  {&(_tg__ZTV3C11__6E11x12[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__6E11x12[3]),  3,4},
  {&(_ZTV6E11x12[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6E11x12[];
extern  VTBL_ENTRY _ZTV6E11x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x12[];
static VTBL_ENTRY alt_thunk_names26[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn16_N6E11x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E11x12 = {  "E11x12", // class name
  bases_E11x12, 4,
  &(vtc_E11x12[0]), // expected_vtbl_contents
  &(vtt_E11x12[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E11x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E11x12),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E11x12),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  G11x12y0  : E11x12 , F1 {
  int ff;
  ~G11x12y0(); // tgen
  G11x12y0(); // tgen
};
//SIG(1 G11x12y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G11x12y0 ::~G11x12y0(){ note_dtor("G11x12y0", this);} // tgen
G11x12y0 ::G11x12y0(){ note_ctor("G11x12y0", this);} // tgen

static void Test_G11x12y0()
{
  extern Class_Descriptor cd_G11x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x12y0, buf);
    G11x12y0 *dp, &lv = *(dp=new (buf) G11x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x12y0)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x12*), ABISELECT(40,28), "G11x12y0");
    check_base_class_offset(lv, (B0*)(C11*)(E11x12*), ABISELECT(52,36), "G11x12y0");
    check_base_class_offset(lv, (C11*)(E11x12*), 0, "G11x12y0");
    check_base_class_offset(lv, (D0*)(E11x12*), ABISELECT(12,8), "G11x12y0");
    check_base_class_offset(lv, (E11x12*), 0, "G11x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G11x12y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G11x12y0.ff");
    test_class_info(&lv, &cd_G11x12y0);
    dp->~G11x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x12y0(Test_G11x12y0, "G11x12y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G11x12y0C1Ev();
extern void _ZN8G11x12y0D1Ev();
Name_Map name_map_G11x12y0[] = {
  NSPAIR(_ZN8G11x12y0C1Ev),
  NSPAIR(_ZN8G11x12y0D1Ev),
  {0,0}
};
extern Class_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_E11x12;
extern VTBL_ENTRY _ZTI6E11x12[];
extern  VTBL_ENTRY _ZTV6E11x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x12y0[] = {
  // 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_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_E11x12,    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 _ZTI8G11x12y0[];
extern void _ZN6E11x123fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv)();
extern void ABISELECT(_ZThn40_N6E11x123fooEv,_ZThn28_N6E11x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x12y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x12y0[0]),
  (VTBL_ENTRY)&_ZN6E11x123fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G11x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G11x12y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv),
};
extern VTBL_ENTRY _ZTV8G11x12y0[];
extern void _ZN6E11x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x12__8G11x12y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x12[0]),
  (VTBL_ENTRY)&_ZN6E11x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C116E11x12__8G11x12y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C116E11x12__8G11x12y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv)();
extern void ABISELECT(_ZThn40_N6E11x123fooEv,_ZThn28_N6E11x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x12__8G11x12y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E11x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv),
};
static  VTT_ENTRY vtt_G11x12y0[] = {
  {&(_ZTV8G11x12y0[4]),  4,12},
  {&(_tg__ZTV6E11x12__8G11x12y0[4]),  4,5},
  {&(_tg__ZTV3C116E11x12__8G11x12y0[4]),  4,4},
  {&(_tg__ZTV2A1__3C116E11x12__8G11x12y0[3]),  3,4},
  {&(_tg__ZTV2A1__6E11x12__8G11x12y0[3]),  3,4},
  {&(_ZTV8G11x12y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI8G11x12y0[];
extern  VTBL_ENTRY _ZTV8G11x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x12y0[];
static VTBL_ENTRY alt_thunk_names27[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E11x123fooEv,_ZThn28_N6E11x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E11x123fooEv,_ZThn28_N6E11x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x12y0 = {  "G11x12y0", // class name
  bases_G11x12y0, 6,
  &(vtc_G11x12y0[0]), // expected_vtbl_contents
  &(vtt_G11x12y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G11x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x12y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x12y0),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  G11x12y1  : virtual E11x12 , F1 {
  int ff;
  ~G11x12y1(); // tgen
  G11x12y1(); // tgen
};
//SIG(1 G11x12y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G11x12y1 ::~G11x12y1(){ note_dtor("G11x12y1", this);} // tgen
G11x12y1 ::G11x12y1(){ note_ctor("G11x12y1", this);} // tgen

static void Test_G11x12y1()
{
  extern Class_Descriptor cd_G11x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x12y1, buf);
    G11x12y1 *dp, &lv = *(dp=new (buf) G11x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x12y1)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x12*), ABISELECT(40,28), "G11x12y1");
    check_base_class_offset(lv, (B0*)(C11*)(E11x12*), ABISELECT(52,36), "G11x12y1");
    check_base_class_offset(lv, (C11*)(E11x12*), ABISELECT(16,12), "G11x12y1");
    check_base_class_offset(lv, (D0*)(E11x12*), ABISELECT(28,20), "G11x12y1");
    check_base_class_offset(lv, (E11x12*), ABISELECT(16,12), "G11x12y1");
    check_base_class_offset(lv, (F1*), 0, "G11x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x12y1.ff");
    test_class_info(&lv, &cd_G11x12y1);
    dp->~G11x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x12y1(Test_G11x12y1, "G11x12y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G11x12y1C1Ev();
extern void _ZN8G11x12y1D1Ev();
Name_Map name_map_G11x12y1[] = {
  NSPAIR(_ZN8G11x12y1C1Ev),
  NSPAIR(_ZN8G11x12y1D1Ev),
  {0,0}
};
extern Class_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_E11x12;
extern VTBL_ENTRY _ZTI6E11x12[];
extern  VTBL_ENTRY _ZTV6E11x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x12y1[] = {
  // 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_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_E11x12,    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 _ZTI8G11x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E11x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv)();
extern void ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn16_N6E11x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x12y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G11x12y1[0]),
  (VTBL_ENTRY)&_ZN6E11x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G11x12y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv),
};
extern VTBL_ENTRY _ZTV8G11x12y1[];
extern void _ZN6E11x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x12__8G11x12y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x12[0]),
  (VTBL_ENTRY)&_ZN6E11x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C116E11x12__8G11x12y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C116E11x12__8G11x12y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv)();
extern void ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn16_N6E11x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x12__8G11x12y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E11x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv),
};
static  VTT_ENTRY vtt_G11x12y1[] = {
  {&(_ZTV8G11x12y1[5]),  5,16},
  {&(_ZTV8G11x12y1[11]),  11,16},
  {&(_ZTV8G11x12y1[15]),  15,16},
  {&(_tg__ZTV6E11x12__8G11x12y1[4]),  4,5},
  {&(_tg__ZTV3C116E11x12__8G11x12y1[4]),  4,4},
  {&(_tg__ZTV2A1__3C116E11x12__8G11x12y1[3]),  3,4},
  {&(_tg__ZTV2A1__6E11x12__8G11x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x12y1[];
extern  VTBL_ENTRY _ZTV8G11x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x12y1[];
static VTBL_ENTRY alt_thunk_names28[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn16_N6E11x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn16_N6E11x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x12y1 = {  "G11x12y1", // class name
  bases_G11x12y1, 6,
  &(vtc_G11x12y1[0]), // expected_vtbl_contents
  &(vtt_G11x12y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G11x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x12y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x12y1),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  G11x12y2  : E11x12 , virtual F1 {
  int ff;
  ~G11x12y2(); // tgen
  G11x12y2(); // tgen
};
//SIG(1 G11x12y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G11x12y2 ::~G11x12y2(){ note_dtor("G11x12y2", this);} // tgen
G11x12y2 ::G11x12y2(){ note_ctor("G11x12y2", this);} // tgen

static void Test_G11x12y2()
{
  extern Class_Descriptor cd_G11x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x12y2, buf);
    G11x12y2 *dp, &lv = *(dp=new (buf) G11x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x12y2)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x12*), ABISELECT(24,20), "G11x12y2");
    check_base_class_offset(lv, (B0*)(C11*)(E11x12*), ABISELECT(36,28), "G11x12y2");
    check_base_class_offset(lv, (C11*)(E11x12*), 0, "G11x12y2");
    check_base_class_offset(lv, (D0*)(E11x12*), ABISELECT(12,8), "G11x12y2");
    check_base_class_offset(lv, (E11x12*), 0, "G11x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G11x12y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G11x12y2.ff");
    test_class_info(&lv, &cd_G11x12y2);
    dp->~G11x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x12y2(Test_G11x12y2, "G11x12y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G11x12y2C1Ev();
extern void _ZN8G11x12y2D1Ev();
Name_Map name_map_G11x12y2[] = {
  NSPAIR(_ZN8G11x12y2C1Ev),
  NSPAIR(_ZN8G11x12y2D1Ev),
  {0,0}
};
extern Class_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_E11x12;
extern VTBL_ENTRY _ZTI6E11x12[];
extern  VTBL_ENTRY _ZTV6E11x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x12y2[] = {
  // 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_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_E11x12,    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 _ZTI8G11x12y2[];
extern void _ZN6E11x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv)();
extern void ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn20_N6E11x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G11x12y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x12y2[0]),
  (VTBL_ENTRY)&_ZN6E11x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G11x12y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G11x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G11x12y2[];
extern void _ZN6E11x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x12__8G11x12y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x12[0]),
  (VTBL_ENTRY)&_ZN6E11x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C116E11x12__8G11x12y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C116E11x12__8G11x12y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv)();
extern void ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn20_N6E11x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x12__8G11x12y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E11x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv),
};
static  VTT_ENTRY vtt_G11x12y2[] = {
  {&(_ZTV8G11x12y2[5]),  5,14},
  {&(_tg__ZTV6E11x12__8G11x12y2[4]),  4,5},
  {&(_tg__ZTV3C116E11x12__8G11x12y2[4]),  4,4},
  {&(_tg__ZTV2A1__3C116E11x12__8G11x12y2[3]),  3,4},
  {&(_tg__ZTV2A1__6E11x12__8G11x12y2[3]),  3,4},
  {&(_ZTV8G11x12y2[9]),  9,14},
  {&(_ZTV8G11x12y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI8G11x12y2[];
extern  VTBL_ENTRY _ZTV8G11x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x12y2[];
static VTBL_ENTRY alt_thunk_names29[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn20_N6E11x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn20_N6E11x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x12y2 = {  "G11x12y2", // class name
  bases_G11x12y2, 6,
  &(vtc_G11x12y2[0]), // expected_vtbl_contents
  &(vtt_G11x12y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G11x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x12y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x12y2),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  G11x12y3  : virtual E11x12 , virtual F1 {
  int ff;
  ~G11x12y3(); // tgen
  G11x12y3(); // tgen
};
//SIG(1 G11x12y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G11x12y3 ::~G11x12y3(){ note_dtor("G11x12y3", this);} // tgen
G11x12y3 ::G11x12y3(){ note_ctor("G11x12y3", this);} // tgen

static void Test_G11x12y3()
{
  extern Class_Descriptor cd_G11x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G11x12y3, buf);
    G11x12y3 *dp, &lv = *(dp=new (buf) G11x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G11x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x12y3)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x12*), ABISELECT(40,24), "G11x12y3");
    check_base_class_offset(lv, (B0*)(C11*)(E11x12*), ABISELECT(52,32), "G11x12y3");
    check_base_class_offset(lv, (C11*)(E11x12*), ABISELECT(16,8), "G11x12y3");
    check_base_class_offset(lv, (D0*)(E11x12*), ABISELECT(28,16), "G11x12y3");
    check_base_class_offset(lv, (E11x12*), ABISELECT(16,8), "G11x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G11x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G11x12y3.ff");
    test_class_info(&lv, &cd_G11x12y3);
    dp->~G11x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x12y3(Test_G11x12y3, "G11x12y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G11x12y3C1Ev();
extern void _ZN8G11x12y3D1Ev();
Name_Map name_map_G11x12y3[] = {
  NSPAIR(_ZN8G11x12y3C1Ev),
  NSPAIR(_ZN8G11x12y3D1Ev),
  {0,0}
};
extern Class_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_E11x12;
extern VTBL_ENTRY _ZTI6E11x12[];
extern  VTBL_ENTRY _ZTV6E11x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x12y3[] = {
  // 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_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_E11x12,    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 _ZTI8G11x12y3[];
extern void _ZN6E11x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv)();
extern void ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn16_N6E11x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G11x12y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x12y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G11x12y3[0]),
  (VTBL_ENTRY)&_ZN6E11x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G11x12y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G11x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G11x12y3[];
extern void _ZN6E11x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x12__8G11x12y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x12[0]),
  (VTBL_ENTRY)&_ZN6E11x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C116E11x12__8G11x12y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C116E11x12__8G11x12y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv)();
extern void ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn16_N6E11x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x12__8G11x12y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E11x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv),
};
static  VTT_ENTRY vtt_G11x12y3[] = {
  {&(_ZTV8G11x12y3[6]),  6,20},
  {&(_ZTV8G11x12y3[11]),  11,20},
  {&(_ZTV8G11x12y3[15]),  15,20},
  {&(_ZTV8G11x12y3[19]),  19,20},
  {&(_tg__ZTV6E11x12__8G11x12y3[4]),  4,5},
  {&(_tg__ZTV3C116E11x12__8G11x12y3[4]),  4,4},
  {&(_tg__ZTV2A1__3C116E11x12__8G11x12y3[3]),  3,4},
  {&(_tg__ZTV2A1__6E11x12__8G11x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x12y3[];
extern  VTBL_ENTRY _ZTV8G11x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x12y3[];
static VTBL_ENTRY alt_thunk_names30[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn16_N6E11x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn16_N6E11x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x12y3 = {  "G11x12y3", // class name
  bases_G11x12y3, 6,
  &(vtc_G11x12y3[0]), // expected_vtbl_contents
  &(vtt_G11x12y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G11x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x12y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x12y3),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  G11x12y4  : E11x12 , F0 {
  int ff;
  ~G11x12y4(); // tgen
  G11x12y4(); // tgen
};
//SIG(1 G11x12y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G11x12y4 ::~G11x12y4(){ note_dtor("G11x12y4", this);} // tgen
G11x12y4 ::G11x12y4(){ note_ctor("G11x12y4", this);} // tgen

static void Test_G11x12y4()
{
  extern Class_Descriptor cd_G11x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G11x12y4, buf);
    G11x12y4 *dp, &lv = *(dp=new (buf) G11x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G11x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x12y4)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x12*), ABISELECT(32,24), "G11x12y4");
    check_base_class_offset(lv, (B0*)(C11*)(E11x12*), ABISELECT(44,32), "G11x12y4");
    check_base_class_offset(lv, (C11*)(E11x12*), 0, "G11x12y4");
    check_base_class_offset(lv, (D0*)(E11x12*), ABISELECT(12,8), "G11x12y4");
    check_base_class_offset(lv, (E11x12*), 0, "G11x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G11x12y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G11x12y4.ff");
    test_class_info(&lv, &cd_G11x12y4);
    dp->~G11x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x12y4(Test_G11x12y4, "G11x12y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G11x12y4C1Ev();
extern void _ZN8G11x12y4D1Ev();
Name_Map name_map_G11x12y4[] = {
  NSPAIR(_ZN8G11x12y4C1Ev),
  NSPAIR(_ZN8G11x12y4D1Ev),
  {0,0}
};
extern Class_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_E11x12;
extern VTBL_ENTRY _ZTI6E11x12[];
extern  VTBL_ENTRY _ZTV6E11x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x12y4[] = {
  // 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_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_E11x12,    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 _ZTI8G11x12y4[];
extern void _ZN6E11x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv)();
extern void ABISELECT(_ZThn32_N6E11x123fooEv,_ZThn24_N6E11x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x12y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x12y4[0]),
  (VTBL_ENTRY)&_ZN6E11x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G11x12y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv),
};
extern VTBL_ENTRY _ZTV8G11x12y4[];
extern void _ZN6E11x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x12__8G11x12y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x12[0]),
  (VTBL_ENTRY)&_ZN6E11x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C116E11x12__8G11x12y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C116E11x12__8G11x12y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv)();
extern void ABISELECT(_ZThn32_N6E11x123fooEv,_ZThn24_N6E11x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x12__8G11x12y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E11x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv),
};
static  VTT_ENTRY vtt_G11x12y4[] = {
  {&(_ZTV8G11x12y4[4]),  4,9},
  {&(_tg__ZTV6E11x12__8G11x12y4[4]),  4,5},
  {&(_tg__ZTV3C116E11x12__8G11x12y4[4]),  4,4},
  {&(_tg__ZTV2A1__3C116E11x12__8G11x12y4[3]),  3,4},
  {&(_tg__ZTV2A1__6E11x12__8G11x12y4[3]),  3,4},
  {&(_ZTV8G11x12y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G11x12y4[];
extern  VTBL_ENTRY _ZTV8G11x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x12y4[];
static VTBL_ENTRY alt_thunk_names31[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x123fooEv,_ZThn24_N6E11x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x123fooEv,_ZThn24_N6E11x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x12y4 = {  "G11x12y4", // class name
  bases_G11x12y4, 6,
  &(vtc_G11x12y4[0]), // expected_vtbl_contents
  &(vtt_G11x12y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G11x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x12y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x12y4),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  G11x12y5  : virtual E11x12 , F0 {
  int ff;
  ~G11x12y5(); // tgen
  G11x12y5(); // tgen
};
//SIG(1 G11x12y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G11x12y5 ::~G11x12y5(){ note_dtor("G11x12y5", this);} // tgen
G11x12y5 ::G11x12y5(){ note_ctor("G11x12y5", this);} // tgen

static void Test_G11x12y5()
{
  extern Class_Descriptor cd_G11x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x12y5, buf);
    G11x12y5 *dp, &lv = *(dp=new (buf) G11x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x12y5)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x12*), ABISELECT(40,28), "G11x12y5");
    check_base_class_offset(lv, (B0*)(C11*)(E11x12*), ABISELECT(52,36), "G11x12y5");
    check_base_class_offset(lv, (C11*)(E11x12*), ABISELECT(16,12), "G11x12y5");
    check_base_class_offset(lv, (D0*)(E11x12*), ABISELECT(28,20), "G11x12y5");
    check_base_class_offset(lv, (E11x12*), ABISELECT(16,12), "G11x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G11x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x12y5.ff");
    test_class_info(&lv, &cd_G11x12y5);
    dp->~G11x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x12y5(Test_G11x12y5, "G11x12y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G11x12y5C1Ev();
extern void _ZN8G11x12y5D1Ev();
Name_Map name_map_G11x12y5[] = {
  NSPAIR(_ZN8G11x12y5C1Ev),
  NSPAIR(_ZN8G11x12y5D1Ev),
  {0,0}
};
extern Class_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_E11x12;
extern VTBL_ENTRY _ZTI6E11x12[];
extern  VTBL_ENTRY _ZTV6E11x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x12y5[] = {
  // 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_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_E11x12,    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 _ZTI8G11x12y5[];
extern void _ZN6E11x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv)();
extern void ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn16_N6E11x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x12y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x12y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G11x12y5[0]),
  (VTBL_ENTRY)&_ZN6E11x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G11x12y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv),
};
extern VTBL_ENTRY _ZTV8G11x12y5[];
extern void _ZN6E11x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x12__8G11x12y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x12[0]),
  (VTBL_ENTRY)&_ZN6E11x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C116E11x12__8G11x12y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C116E11x12__8G11x12y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv)();
extern void ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn16_N6E11x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x12__8G11x12y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E11x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv),
};
static  VTT_ENTRY vtt_G11x12y5[] = {
  {&(_ZTV8G11x12y5[5]),  5,15},
  {&(_ZTV8G11x12y5[10]),  10,15},
  {&(_ZTV8G11x12y5[14]),  14,15},
  {&(_tg__ZTV6E11x12__8G11x12y5[4]),  4,5},
  {&(_tg__ZTV3C116E11x12__8G11x12y5[4]),  4,4},
  {&(_tg__ZTV2A1__3C116E11x12__8G11x12y5[3]),  3,4},
  {&(_tg__ZTV2A1__6E11x12__8G11x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x12y5[];
extern  VTBL_ENTRY _ZTV8G11x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x12y5[];
static VTBL_ENTRY alt_thunk_names32[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn16_N6E11x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn16_N6E11x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x12y5 = {  "G11x12y5", // class name
  bases_G11x12y5, 6,
  &(vtc_G11x12y5[0]), // expected_vtbl_contents
  &(vtt_G11x12y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G11x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x12y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x12y5),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  G11x12y6  : E11x12 , virtual F0 {
  int ff;
  ~G11x12y6(); // tgen
  G11x12y6(); // tgen
};
//SIG(1 G11x12y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G11x12y6 ::~G11x12y6(){ note_dtor("G11x12y6", this);} // tgen
G11x12y6 ::G11x12y6(){ note_ctor("G11x12y6", this);} // tgen

static void Test_G11x12y6()
{
  extern Class_Descriptor cd_G11x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G11x12y6, buf);
    G11x12y6 *dp, &lv = *(dp=new (buf) G11x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G11x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x12y6)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x12*), ABISELECT(24,20), "G11x12y6");
    check_base_class_offset(lv, (B0*)(C11*)(E11x12*), ABISELECT(36,28), "G11x12y6");
    check_base_class_offset(lv, (C11*)(E11x12*), 0, "G11x12y6");
    check_base_class_offset(lv, (D0*)(E11x12*), ABISELECT(12,8), "G11x12y6");
    check_base_class_offset(lv, (E11x12*), 0, "G11x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G11x12y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G11x12y6.ff");
    test_class_info(&lv, &cd_G11x12y6);
    dp->~G11x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x12y6(Test_G11x12y6, "G11x12y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G11x12y6C1Ev();
extern void _ZN8G11x12y6D1Ev();
Name_Map name_map_G11x12y6[] = {
  NSPAIR(_ZN8G11x12y6C1Ev),
  NSPAIR(_ZN8G11x12y6D1Ev),
  {0,0}
};
extern Class_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_E11x12;
extern VTBL_ENTRY _ZTI6E11x12[];
extern  VTBL_ENTRY _ZTV6E11x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x12y6[] = {
  // 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_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_E11x12,    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 _ZTI8G11x12y6[];
extern void _ZN6E11x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv)();
extern void ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn20_N6E11x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x12y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x12y6[0]),
  (VTBL_ENTRY)&_ZN6E11x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G11x12y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv),
};
extern VTBL_ENTRY _ZTV8G11x12y6[];
extern void _ZN6E11x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x12__8G11x12y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x12[0]),
  (VTBL_ENTRY)&_ZN6E11x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C116E11x12__8G11x12y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C116E11x12__8G11x12y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv)();
extern void ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn20_N6E11x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x12__8G11x12y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E11x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv),
};
static  VTT_ENTRY vtt_G11x12y6[] = {
  {&(_ZTV8G11x12y6[5]),  5,10},
  {&(_tg__ZTV6E11x12__8G11x12y6[4]),  4,5},
  {&(_tg__ZTV3C116E11x12__8G11x12y6[4]),  4,4},
  {&(_tg__ZTV2A1__3C116E11x12__8G11x12y6[3]),  3,4},
  {&(_tg__ZTV2A1__6E11x12__8G11x12y6[3]),  3,4},
  {&(_ZTV8G11x12y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G11x12y6[];
extern  VTBL_ENTRY _ZTV8G11x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x12y6[];
static VTBL_ENTRY alt_thunk_names33[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn20_N6E11x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn20_N6E11x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x12y6 = {  "G11x12y6", // class name
  bases_G11x12y6, 6,
  &(vtc_G11x12y6[0]), // expected_vtbl_contents
  &(vtt_G11x12y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G11x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x12y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x12y6),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  G11x12y7  : virtual E11x12 , virtual F0 {
  int ff;
  ~G11x12y7(); // tgen
  G11x12y7(); // tgen
};
//SIG(1 G11x12y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G11x12y7 ::~G11x12y7(){ note_dtor("G11x12y7", this);} // tgen
G11x12y7 ::G11x12y7(){ note_ctor("G11x12y7", this);} // tgen

static void Test_G11x12y7()
{
  extern Class_Descriptor cd_G11x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G11x12y7, buf);
    G11x12y7 *dp, &lv = *(dp=new (buf) G11x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G11x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x12y7)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x12*), ABISELECT(40,24), "G11x12y7");
    check_base_class_offset(lv, (B0*)(C11*)(E11x12*), ABISELECT(52,32), "G11x12y7");
    check_base_class_offset(lv, (C11*)(E11x12*), ABISELECT(16,8), "G11x12y7");
    check_base_class_offset(lv, (D0*)(E11x12*), ABISELECT(28,16), "G11x12y7");
    check_base_class_offset(lv, (E11x12*), ABISELECT(16,8), "G11x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G11x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G11x12y7.ff");
    test_class_info(&lv, &cd_G11x12y7);
    dp->~G11x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x12y7(Test_G11x12y7, "G11x12y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G11x12y7C1Ev();
extern void _ZN8G11x12y7D1Ev();
Name_Map name_map_G11x12y7[] = {
  NSPAIR(_ZN8G11x12y7C1Ev),
  NSPAIR(_ZN8G11x12y7D1Ev),
  {0,0}
};
extern Class_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_E11x12;
extern VTBL_ENTRY _ZTI6E11x12[];
extern  VTBL_ENTRY _ZTV6E11x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x12y7[] = {
  // 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_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_E11x12,    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 _ZTI8G11x12y7[];
extern void _ZN6E11x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv)();
extern void ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn16_N6E11x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x12y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x12y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G11x12y7[0]),
  (VTBL_ENTRY)&_ZN6E11x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G11x12y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv),
};
extern VTBL_ENTRY _ZTV8G11x12y7[];
extern void _ZN6E11x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x12__8G11x12y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x12[0]),
  (VTBL_ENTRY)&_ZN6E11x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C116E11x12__8G11x12y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C116E11x12__8G11x12y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv)();
extern void ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn16_N6E11x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x12__8G11x12y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E11x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv),
};
static  VTT_ENTRY vtt_G11x12y7[] = {
  {&(_ZTV8G11x12y7[6]),  6,16},
  {&(_ZTV8G11x12y7[11]),  11,16},
  {&(_ZTV8G11x12y7[15]),  15,16},
  {&(_tg__ZTV6E11x12__8G11x12y7[4]),  4,5},
  {&(_tg__ZTV3C116E11x12__8G11x12y7[4]),  4,4},
  {&(_tg__ZTV2A1__3C116E11x12__8G11x12y7[3]),  3,4},
  {&(_tg__ZTV2A1__6E11x12__8G11x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x12y7[];
extern  VTBL_ENTRY _ZTV8G11x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x12y7[];
static VTBL_ENTRY alt_thunk_names34[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x123fooEv,_ZTv0_n12_N6E11x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn16_N6E11x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E11x123fooEv,_ZThn16_N6E11x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x12y7 = {  "G11x12y7", // class name
  bases_G11x12y7, 6,
  &(vtc_G11x12y7[0]), // expected_vtbl_contents
  &(vtt_G11x12y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G11x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x12y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x12y7),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  E12x12  : C12 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E12x123fooEv
  ~E12x12(); // tgen
  E12x12(); // tgen
};
//SIG(-1 E12x12) C1{ BC2{ BC3{ Fi} VBC4{ v1 Fi} Fi} BC5{ Fi} v1 Fi}


void  E12x12 ::foo(){vfunc_called(this, "_ZN6E12x123fooEv");}
E12x12 ::~E12x12(){ note_dtor("E12x12", this);} // tgen
E12x12 ::E12x12(){ note_ctor("E12x12", this);} // tgen

static void Test_E12x12()
{
  extern Class_Descriptor cd_E12x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E12x12, buf);
    E12x12 *dp, &lv = *(dp=new (buf) E12x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E12x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E12x12)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(8,4), "E12x12");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(24,20), "E12x12");
    check_base_class_offset(lv, (C12*), 0, "E12x12");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E12x12");
    check_field_offset(lv, fd, ABISELECT(20,16), "E12x12.fd");
    test_class_info(&lv, &cd_E12x12);
    dp->~E12x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE12x12(Test_E12x12, "E12x12", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E12x12C1Ev();
extern void _ZN6E12x12D1Ev();
Name_Map name_map_E12x12[] = {
  NSPAIR(_ZN6E12x12C1Ev),
  NSPAIR(_ZN6E12x12D1Ev),
  {0,0}
};
extern Class_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_E12x12[] = {
  // 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_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 _ZTI6E12x12[];
extern void _ZN6E12x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv)();
extern void ABISELECT(_ZThn24_N6E12x123fooEv,_ZThn20_N6E12x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E12x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x12[0]),
  (VTBL_ENTRY)&_ZN6E12x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E12x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv),
};
extern VTBL_ENTRY _ZTV6E12x12[];
static  VTBL_ENTRY _tg__ZTV3C12__6E12x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__6E12x12[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E12x12[] = {
  {&(_ZTV6E12x12[3]),  3,8},
  {&(_tg__ZTV3C12__6E12x12[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__6E12x12[3]),  3,4},
  {&(_ZTV6E12x12[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6E12x12[];
extern  VTBL_ENTRY _ZTV6E12x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x12[];
static VTBL_ENTRY alt_thunk_names35[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x123fooEv,_ZThn20_N6E12x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E12x12 = {  "E12x12", // class name
  bases_E12x12, 4,
  &(vtc_E12x12[0]), // expected_vtbl_contents
  &(vtt_E12x12[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E12x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E12x12),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E12x12),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  G12x12y0  : E12x12 , F1 {
  int ff;
  ~G12x12y0(); // tgen
  G12x12y0(); // tgen
};
//SIG(1 G12x12y0) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G12x12y0 ::~G12x12y0(){ note_dtor("G12x12y0", this);} // tgen
G12x12y0 ::G12x12y0(){ note_ctor("G12x12y0", this);} // tgen

static void Test_G12x12y0()
{
  extern Class_Descriptor cd_G12x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x12y0, buf);
    G12x12y0 *dp, &lv = *(dp=new (buf) G12x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x12y0)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x12*), ABISELECT(8,4), "G12x12y0");
    check_base_class_offset(lv, (B1*)(C12*)(E12x12*), ABISELECT(40,32), "G12x12y0");
    check_base_class_offset(lv, (C12*)(E12x12*), 0, "G12x12y0");
    check_base_class_offset(lv, (D0*)(E12x12*), ABISELECT(16,12), "G12x12y0");
    check_base_class_offset(lv, (E12x12*), 0, "G12x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G12x12y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G12x12y0.ff");
    test_class_info(&lv, &cd_G12x12y0);
    dp->~G12x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x12y0(Test_G12x12y0, "G12x12y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G12x12y0C1Ev();
extern void _ZN8G12x12y0D1Ev();
Name_Map name_map_G12x12y0[] = {
  NSPAIR(_ZN8G12x12y0C1Ev),
  NSPAIR(_ZN8G12x12y0D1Ev),
  {0,0}
};
extern Class_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_E12x12;
extern VTBL_ENTRY _ZTI6E12x12[];
extern  VTBL_ENTRY _ZTV6E12x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x12y0[] = {
  // 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_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_E12x12,    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 _ZTI8G12x12y0[];
extern void _ZN6E12x123fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv)();
extern void ABISELECT(_ZThn40_N6E12x123fooEv,_ZThn32_N6E12x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x12y0[0]),
  (VTBL_ENTRY)&_ZN6E12x123fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G12x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G12x12y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv),
};
extern VTBL_ENTRY _ZTV8G12x12y0[];
extern void _ZN6E12x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x12__8G12x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x12[0]),
  (VTBL_ENTRY)&_ZN6E12x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C126E12x12__8G12x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C126E12x12__8G12x12y0[] = {
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv)();
extern void ABISELECT(_ZThn40_N6E12x123fooEv,_ZThn32_N6E12x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x12__8G12x12y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6E12x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv),
};
static  VTT_ENTRY vtt_G12x12y0[] = {
  {&(_ZTV8G12x12y0[3]),  3,11},
  {&(_tg__ZTV6E12x12__8G12x12y0[3]),  3,4},
  {&(_tg__ZTV3C126E12x12__8G12x12y0[3]),  3,3},
  {&(_tg__ZTV2B1__3C126E12x12__8G12x12y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E12x12__8G12x12y0[3]),  3,4},
  {&(_ZTV8G12x12y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI8G12x12y0[];
extern  VTBL_ENTRY _ZTV8G12x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x12y0[];
static VTBL_ENTRY alt_thunk_names36[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E12x123fooEv,_ZThn32_N6E12x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E12x123fooEv,_ZThn32_N6E12x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x12y0 = {  "G12x12y0", // class name
  bases_G12x12y0, 6,
  &(vtc_G12x12y0[0]), // expected_vtbl_contents
  &(vtt_G12x12y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G12x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x12y0),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x12y0),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  G12x12y1  : virtual E12x12 , F1 {
  int ff;
  ~G12x12y1(); // tgen
  G12x12y1(); // tgen
};
//SIG(1 G12x12y1) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G12x12y1 ::~G12x12y1(){ note_dtor("G12x12y1", this);} // tgen
G12x12y1 ::G12x12y1(){ note_ctor("G12x12y1", this);} // tgen

static void Test_G12x12y1()
{
  extern Class_Descriptor cd_G12x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x12y1, buf);
    G12x12y1 *dp, &lv = *(dp=new (buf) G12x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x12y1)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x12*), ABISELECT(24,16), "G12x12y1");
    check_base_class_offset(lv, (B1*)(C12*)(E12x12*), ABISELECT(40,32), "G12x12y1");
    check_base_class_offset(lv, (C12*)(E12x12*), ABISELECT(16,12), "G12x12y1");
    check_base_class_offset(lv, (D0*)(E12x12*), ABISELECT(32,24), "G12x12y1");
    check_base_class_offset(lv, (E12x12*), ABISELECT(16,12), "G12x12y1");
    check_base_class_offset(lv, (F1*), 0, "G12x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x12y1.ff");
    test_class_info(&lv, &cd_G12x12y1);
    dp->~G12x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x12y1(Test_G12x12y1, "G12x12y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G12x12y1C1Ev();
extern void _ZN8G12x12y1D1Ev();
Name_Map name_map_G12x12y1[] = {
  NSPAIR(_ZN8G12x12y1C1Ev),
  NSPAIR(_ZN8G12x12y1D1Ev),
  {0,0}
};
extern Class_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_E12x12;
extern VTBL_ENTRY _ZTI6E12x12[];
extern  VTBL_ENTRY _ZTV6E12x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x12y1[] = {
  // 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_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_E12x12,    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 _ZTI8G12x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E12x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv)();
extern void ABISELECT(_ZThn24_N6E12x123fooEv,_ZThn20_N6E12x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G12x12y1[0]),
  (VTBL_ENTRY)&_ZN6E12x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G12x12y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv),
};
extern VTBL_ENTRY _ZTV8G12x12y1[];
extern void _ZN6E12x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x12__8G12x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x12[0]),
  (VTBL_ENTRY)&_ZN6E12x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C126E12x12__8G12x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C126E12x12__8G12x12y1[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv)();
extern void ABISELECT(_ZThn24_N6E12x123fooEv,_ZThn20_N6E12x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x12__8G12x12y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E12x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv),
};
static  VTT_ENTRY vtt_G12x12y1[] = {
  {&(_ZTV8G12x12y1[4]),  4,14},
  {&(_ZTV8G12x12y1[9]),  9,14},
  {&(_ZTV8G12x12y1[13]),  13,14},
  {&(_tg__ZTV6E12x12__8G12x12y1[3]),  3,4},
  {&(_tg__ZTV3C126E12x12__8G12x12y1[3]),  3,3},
  {&(_tg__ZTV2B1__3C126E12x12__8G12x12y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E12x12__8G12x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x12y1[];
extern  VTBL_ENTRY _ZTV8G12x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x12y1[];
static VTBL_ENTRY alt_thunk_names37[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x123fooEv,_ZThn20_N6E12x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x123fooEv,_ZThn20_N6E12x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x12y1 = {  "G12x12y1", // class name
  bases_G12x12y1, 6,
  &(vtc_G12x12y1[0]), // expected_vtbl_contents
  &(vtt_G12x12y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G12x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x12y1),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x12y1),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  G12x12y2  : E12x12 , virtual F1 {
  int ff;
  ~G12x12y2(); // tgen
  G12x12y2(); // tgen
};
//SIG(1 G12x12y2) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G12x12y2 ::~G12x12y2(){ note_dtor("G12x12y2", this);} // tgen
G12x12y2 ::G12x12y2(){ note_ctor("G12x12y2", this);} // tgen

static void Test_G12x12y2()
{
  extern Class_Descriptor cd_G12x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G12x12y2, buf);
    G12x12y2 *dp, &lv = *(dp=new (buf) G12x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G12x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x12y2)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x12*), ABISELECT(8,4), "G12x12y2");
    check_base_class_offset(lv, (B1*)(C12*)(E12x12*), ABISELECT(32,24), "G12x12y2");
    check_base_class_offset(lv, (C12*)(E12x12*), 0, "G12x12y2");
    check_base_class_offset(lv, (D0*)(E12x12*), ABISELECT(16,12), "G12x12y2");
    check_base_class_offset(lv, (E12x12*), 0, "G12x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G12x12y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G12x12y2.ff");
    test_class_info(&lv, &cd_G12x12y2);
    dp->~G12x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x12y2(Test_G12x12y2, "G12x12y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G12x12y2C1Ev();
extern void _ZN8G12x12y2D1Ev();
Name_Map name_map_G12x12y2[] = {
  NSPAIR(_ZN8G12x12y2C1Ev),
  NSPAIR(_ZN8G12x12y2D1Ev),
  {0,0}
};
extern Class_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_E12x12;
extern VTBL_ENTRY _ZTI6E12x12[];
extern  VTBL_ENTRY _ZTV6E12x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x12y2[] = {
  // 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_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_E12x12,    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 _ZTI8G12x12y2[];
extern void _ZN6E12x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv)();
extern void ABISELECT(_ZThn32_N6E12x123fooEv,_ZThn24_N6E12x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G12x12y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x12y2[0]),
  (VTBL_ENTRY)&_ZN6E12x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G12x12y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G12x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G12x12y2[];
extern void _ZN6E12x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x12__8G12x12y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x12[0]),
  (VTBL_ENTRY)&_ZN6E12x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C126E12x12__8G12x12y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C126E12x12__8G12x12y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv)();
extern void ABISELECT(_ZThn32_N6E12x123fooEv,_ZThn24_N6E12x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x12__8G12x12y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E12x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv),
};
static  VTT_ENTRY vtt_G12x12y2[] = {
  {&(_ZTV8G12x12y2[4]),  4,13},
  {&(_tg__ZTV6E12x12__8G12x12y2[3]),  3,4},
  {&(_tg__ZTV3C126E12x12__8G12x12y2[3]),  3,3},
  {&(_tg__ZTV2B1__3C126E12x12__8G12x12y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E12x12__8G12x12y2[3]),  3,4},
  {&(_ZTV8G12x12y2[8]),  8,13},
  {&(_ZTV8G12x12y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI8G12x12y2[];
extern  VTBL_ENTRY _ZTV8G12x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x12y2[];
static VTBL_ENTRY alt_thunk_names38[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x123fooEv,_ZThn24_N6E12x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x123fooEv,_ZThn24_N6E12x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x12y2 = {  "G12x12y2", // class name
  bases_G12x12y2, 6,
  &(vtc_G12x12y2[0]), // expected_vtbl_contents
  &(vtt_G12x12y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G12x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x12y2),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x12y2),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  G12x12y3  : virtual E12x12 , virtual F1 {
  int ff;
  ~G12x12y3(); // tgen
  G12x12y3(); // tgen
};
//SIG(1 G12x12y3) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G12x12y3 ::~G12x12y3(){ note_dtor("G12x12y3", this);} // tgen
G12x12y3 ::G12x12y3(){ note_ctor("G12x12y3", this);} // tgen

static void Test_G12x12y3()
{
  extern Class_Descriptor cd_G12x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G12x12y3, buf);
    G12x12y3 *dp, &lv = *(dp=new (buf) G12x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G12x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x12y3)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x12*), ABISELECT(24,12), "G12x12y3");
    check_base_class_offset(lv, (B1*)(C12*)(E12x12*), ABISELECT(40,28), "G12x12y3");
    check_base_class_offset(lv, (C12*)(E12x12*), ABISELECT(16,8), "G12x12y3");
    check_base_class_offset(lv, (D0*)(E12x12*), ABISELECT(32,20), "G12x12y3");
    check_base_class_offset(lv, (E12x12*), ABISELECT(16,8), "G12x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G12x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G12x12y3.ff");
    test_class_info(&lv, &cd_G12x12y3);
    dp->~G12x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x12y3(Test_G12x12y3, "G12x12y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G12x12y3C1Ev();
extern void _ZN8G12x12y3D1Ev();
Name_Map name_map_G12x12y3[] = {
  NSPAIR(_ZN8G12x12y3C1Ev),
  NSPAIR(_ZN8G12x12y3D1Ev),
  {0,0}
};
extern Class_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_E12x12;
extern VTBL_ENTRY _ZTI6E12x12[];
extern  VTBL_ENTRY _ZTV6E12x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x12y3[] = {
  // 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_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_E12x12,    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 _ZTI8G12x12y3[];
extern void _ZN6E12x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv)();
extern void ABISELECT(_ZThn24_N6E12x123fooEv,_ZThn20_N6E12x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G12x12y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G12x12y3[0]),
  (VTBL_ENTRY)&_ZN6E12x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G12x12y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G12x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G12x12y3[];
extern void _ZN6E12x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x12__8G12x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x12[0]),
  (VTBL_ENTRY)&_ZN6E12x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C126E12x12__8G12x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C126E12x12__8G12x12y3[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv)();
extern void ABISELECT(_ZThn24_N6E12x123fooEv,_ZThn20_N6E12x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x12__8G12x12y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E12x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv),
};
static  VTT_ENTRY vtt_G12x12y3[] = {
  {&(_ZTV8G12x12y3[5]),  5,18},
  {&(_ZTV8G12x12y3[9]),  9,18},
  {&(_ZTV8G12x12y3[13]),  13,18},
  {&(_ZTV8G12x12y3[17]),  17,18},
  {&(_tg__ZTV6E12x12__8G12x12y3[3]),  3,4},
  {&(_tg__ZTV3C126E12x12__8G12x12y3[3]),  3,3},
  {&(_tg__ZTV2B1__3C126E12x12__8G12x12y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E12x12__8G12x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x12y3[];
extern  VTBL_ENTRY _ZTV8G12x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x12y3[];
static VTBL_ENTRY alt_thunk_names39[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x123fooEv,_ZThn20_N6E12x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x123fooEv,_ZThn20_N6E12x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x12y3 = {  "G12x12y3", // class name
  bases_G12x12y3, 6,
  &(vtc_G12x12y3[0]), // expected_vtbl_contents
  &(vtt_G12x12y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G12x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x12y3),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x12y3),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  G12x12y4  : E12x12 , F0 {
  int ff;
  ~G12x12y4(); // tgen
  G12x12y4(); // tgen
};
//SIG(1 G12x12y4) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G12x12y4 ::~G12x12y4(){ note_dtor("G12x12y4", this);} // tgen
G12x12y4 ::G12x12y4(){ note_ctor("G12x12y4", this);} // tgen

static void Test_G12x12y4()
{
  extern Class_Descriptor cd_G12x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G12x12y4, buf);
    G12x12y4 *dp, &lv = *(dp=new (buf) G12x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G12x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x12y4)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x12*), ABISELECT(8,4), "G12x12y4");
    check_base_class_offset(lv, (B1*)(C12*)(E12x12*), ABISELECT(32,28), "G12x12y4");
    check_base_class_offset(lv, (C12*)(E12x12*), 0, "G12x12y4");
    check_base_class_offset(lv, (D0*)(E12x12*), ABISELECT(16,12), "G12x12y4");
    check_base_class_offset(lv, (E12x12*), 0, "G12x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G12x12y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G12x12y4.ff");
    test_class_info(&lv, &cd_G12x12y4);
    dp->~G12x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x12y4(Test_G12x12y4, "G12x12y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G12x12y4C1Ev();
extern void _ZN8G12x12y4D1Ev();
Name_Map name_map_G12x12y4[] = {
  NSPAIR(_ZN8G12x12y4C1Ev),
  NSPAIR(_ZN8G12x12y4D1Ev),
  {0,0}
};
extern Class_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_E12x12;
extern VTBL_ENTRY _ZTI6E12x12[];
extern  VTBL_ENTRY _ZTV6E12x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x12y4[] = {
  // 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_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_E12x12,    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 _ZTI8G12x12y4[];
extern void _ZN6E12x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv)();
extern void ABISELECT(_ZThn32_N6E12x123fooEv,_ZThn28_N6E12x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x12y4[0]),
  (VTBL_ENTRY)&_ZN6E12x123fooEv,
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G12x12y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv),
};
extern VTBL_ENTRY _ZTV8G12x12y4[];
extern void _ZN6E12x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x12__8G12x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x12[0]),
  (VTBL_ENTRY)&_ZN6E12x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C126E12x12__8G12x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C126E12x12__8G12x12y4[] = {
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv)();
extern void ABISELECT(_ZThn32_N6E12x123fooEv,_ZThn28_N6E12x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x12__8G12x12y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6E12x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv),
};
static  VTT_ENTRY vtt_G12x12y4[] = {
  {&(_ZTV8G12x12y4[3]),  3,8},
  {&(_tg__ZTV6E12x12__8G12x12y4[3]),  3,4},
  {&(_tg__ZTV3C126E12x12__8G12x12y4[3]),  3,3},
  {&(_tg__ZTV2B1__3C126E12x12__8G12x12y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E12x12__8G12x12y4[3]),  3,4},
  {&(_ZTV8G12x12y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI8G12x12y4[];
extern  VTBL_ENTRY _ZTV8G12x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x12y4[];
static VTBL_ENTRY alt_thunk_names40[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x123fooEv,_ZThn28_N6E12x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x123fooEv,_ZThn28_N6E12x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x12y4 = {  "G12x12y4", // class name
  bases_G12x12y4, 6,
  &(vtc_G12x12y4[0]), // expected_vtbl_contents
  &(vtt_G12x12y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G12x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x12y4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x12y4),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  G12x12y5  : virtual E12x12 , F0 {
  int ff;
  ~G12x12y5(); // tgen
  G12x12y5(); // tgen
};
//SIG(1 G12x12y5) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G12x12y5 ::~G12x12y5(){ note_dtor("G12x12y5", this);} // tgen
G12x12y5 ::G12x12y5(){ note_ctor("G12x12y5", this);} // tgen

static void Test_G12x12y5()
{
  extern Class_Descriptor cd_G12x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x12y5, buf);
    G12x12y5 *dp, &lv = *(dp=new (buf) G12x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x12y5)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x12*), ABISELECT(24,16), "G12x12y5");
    check_base_class_offset(lv, (B1*)(C12*)(E12x12*), ABISELECT(40,32), "G12x12y5");
    check_base_class_offset(lv, (C12*)(E12x12*), ABISELECT(16,12), "G12x12y5");
    check_base_class_offset(lv, (D0*)(E12x12*), ABISELECT(32,24), "G12x12y5");
    check_base_class_offset(lv, (E12x12*), ABISELECT(16,12), "G12x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G12x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x12y5.ff");
    test_class_info(&lv, &cd_G12x12y5);
    dp->~G12x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x12y5(Test_G12x12y5, "G12x12y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G12x12y5C1Ev();
extern void _ZN8G12x12y5D1Ev();
Name_Map name_map_G12x12y5[] = {
  NSPAIR(_ZN8G12x12y5C1Ev),
  NSPAIR(_ZN8G12x12y5D1Ev),
  {0,0}
};
extern Class_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_E12x12;
extern VTBL_ENTRY _ZTI6E12x12[];
extern  VTBL_ENTRY _ZTV6E12x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x12y5[] = {
  // 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_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_E12x12,    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 _ZTI8G12x12y5[];
extern void _ZN6E12x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv)();
extern void ABISELECT(_ZThn24_N6E12x123fooEv,_ZThn20_N6E12x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G12x12y5[0]),
  (VTBL_ENTRY)&_ZN6E12x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G12x12y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv),
};
extern VTBL_ENTRY _ZTV8G12x12y5[];
extern void _ZN6E12x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x12__8G12x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x12[0]),
  (VTBL_ENTRY)&_ZN6E12x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C126E12x12__8G12x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C126E12x12__8G12x12y5[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv)();
extern void ABISELECT(_ZThn24_N6E12x123fooEv,_ZThn20_N6E12x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x12__8G12x12y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E12x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv),
};
static  VTT_ENTRY vtt_G12x12y5[] = {
  {&(_ZTV8G12x12y5[4]),  4,13},
  {&(_ZTV8G12x12y5[8]),  8,13},
  {&(_ZTV8G12x12y5[12]),  12,13},
  {&(_tg__ZTV6E12x12__8G12x12y5[3]),  3,4},
  {&(_tg__ZTV3C126E12x12__8G12x12y5[3]),  3,3},
  {&(_tg__ZTV2B1__3C126E12x12__8G12x12y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E12x12__8G12x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x12y5[];
extern  VTBL_ENTRY _ZTV8G12x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x12y5[];
static VTBL_ENTRY alt_thunk_names41[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x123fooEv,_ZThn20_N6E12x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x123fooEv,_ZThn20_N6E12x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x12y5 = {  "G12x12y5", // class name
  bases_G12x12y5, 6,
  &(vtc_G12x12y5[0]), // expected_vtbl_contents
  &(vtt_G12x12y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G12x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x12y5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x12y5),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  G12x12y6  : E12x12 , virtual F0 {
  int ff;
  ~G12x12y6(); // tgen
  G12x12y6(); // tgen
};
//SIG(1 G12x12y6) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G12x12y6 ::~G12x12y6(){ note_dtor("G12x12y6", this);} // tgen
G12x12y6 ::G12x12y6(){ note_ctor("G12x12y6", this);} // tgen

static void Test_G12x12y6()
{
  extern Class_Descriptor cd_G12x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G12x12y6, buf);
    G12x12y6 *dp, &lv = *(dp=new (buf) G12x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G12x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x12y6)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x12*), ABISELECT(8,4), "G12x12y6");
    check_base_class_offset(lv, (B1*)(C12*)(E12x12*), ABISELECT(32,24), "G12x12y6");
    check_base_class_offset(lv, (C12*)(E12x12*), 0, "G12x12y6");
    check_base_class_offset(lv, (D0*)(E12x12*), ABISELECT(16,12), "G12x12y6");
    check_base_class_offset(lv, (E12x12*), 0, "G12x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G12x12y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G12x12y6.ff");
    test_class_info(&lv, &cd_G12x12y6);
    dp->~G12x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x12y6(Test_G12x12y6, "G12x12y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G12x12y6C1Ev();
extern void _ZN8G12x12y6D1Ev();
Name_Map name_map_G12x12y6[] = {
  NSPAIR(_ZN8G12x12y6C1Ev),
  NSPAIR(_ZN8G12x12y6D1Ev),
  {0,0}
};
extern Class_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_E12x12;
extern VTBL_ENTRY _ZTI6E12x12[];
extern  VTBL_ENTRY _ZTV6E12x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x12y6[] = {
  // 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_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_E12x12,    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 _ZTI8G12x12y6[];
extern void _ZN6E12x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv)();
extern void ABISELECT(_ZThn32_N6E12x123fooEv,_ZThn24_N6E12x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x12y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x12y6[0]),
  (VTBL_ENTRY)&_ZN6E12x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G12x12y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv),
};
extern VTBL_ENTRY _ZTV8G12x12y6[];
extern void _ZN6E12x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x12__8G12x12y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x12[0]),
  (VTBL_ENTRY)&_ZN6E12x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C126E12x12__8G12x12y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C126E12x12__8G12x12y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv)();
extern void ABISELECT(_ZThn32_N6E12x123fooEv,_ZThn24_N6E12x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x12__8G12x12y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E12x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv),
};
static  VTT_ENTRY vtt_G12x12y6[] = {
  {&(_ZTV8G12x12y6[4]),  4,9},
  {&(_tg__ZTV6E12x12__8G12x12y6[3]),  3,4},
  {&(_tg__ZTV3C126E12x12__8G12x12y6[3]),  3,3},
  {&(_tg__ZTV2B1__3C126E12x12__8G12x12y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E12x12__8G12x12y6[3]),  3,4},
  {&(_ZTV8G12x12y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G12x12y6[];
extern  VTBL_ENTRY _ZTV8G12x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x12y6[];
static VTBL_ENTRY alt_thunk_names42[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x123fooEv,_ZThn24_N6E12x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x123fooEv,_ZThn24_N6E12x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x12y6 = {  "G12x12y6", // class name
  bases_G12x12y6, 6,
  &(vtc_G12x12y6[0]), // expected_vtbl_contents
  &(vtt_G12x12y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G12x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x12y6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x12y6),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  G12x12y7  : virtual E12x12 , virtual F0 {
  int ff;
  ~G12x12y7(); // tgen
  G12x12y7(); // tgen
};
//SIG(1 G12x12y7) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G12x12y7 ::~G12x12y7(){ note_dtor("G12x12y7", this);} // tgen
G12x12y7 ::G12x12y7(){ note_ctor("G12x12y7", this);} // tgen

static void Test_G12x12y7()
{
  extern Class_Descriptor cd_G12x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x12y7, buf);
    G12x12y7 *dp, &lv = *(dp=new (buf) G12x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x12y7)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x12*), ABISELECT(24,12), "G12x12y7");
    check_base_class_offset(lv, (B1*)(C12*)(E12x12*), ABISELECT(40,28), "G12x12y7");
    check_base_class_offset(lv, (C12*)(E12x12*), ABISELECT(16,8), "G12x12y7");
    check_base_class_offset(lv, (D0*)(E12x12*), ABISELECT(32,20), "G12x12y7");
    check_base_class_offset(lv, (E12x12*), ABISELECT(16,8), "G12x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G12x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G12x12y7.ff");
    test_class_info(&lv, &cd_G12x12y7);
    dp->~G12x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x12y7(Test_G12x12y7, "G12x12y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G12x12y7C1Ev();
extern void _ZN8G12x12y7D1Ev();
Name_Map name_map_G12x12y7[] = {
  NSPAIR(_ZN8G12x12y7C1Ev),
  NSPAIR(_ZN8G12x12y7D1Ev),
  {0,0}
};
extern Class_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_E12x12;
extern VTBL_ENTRY _ZTI6E12x12[];
extern  VTBL_ENTRY _ZTV6E12x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x12y7[] = {
  // 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_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_E12x12,    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 _ZTI8G12x12y7[];
extern void _ZN6E12x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv)();
extern void ABISELECT(_ZThn24_N6E12x123fooEv,_ZThn20_N6E12x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x12y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G12x12y7[0]),
  (VTBL_ENTRY)&_ZN6E12x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G12x12y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv),
};
extern VTBL_ENTRY _ZTV8G12x12y7[];
extern void _ZN6E12x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x12__8G12x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x12[0]),
  (VTBL_ENTRY)&_ZN6E12x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C126E12x12__8G12x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C126E12x12__8G12x12y7[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv)();
extern void ABISELECT(_ZThn24_N6E12x123fooEv,_ZThn20_N6E12x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x12__8G12x12y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E12x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv),
};
static  VTT_ENTRY vtt_G12x12y7[] = {
  {&(_ZTV8G12x12y7[5]),  5,14},
  {&(_ZTV8G12x12y7[9]),  9,14},
  {&(_ZTV8G12x12y7[13]),  13,14},
  {&(_tg__ZTV6E12x12__8G12x12y7[3]),  3,4},
  {&(_tg__ZTV3C126E12x12__8G12x12y7[3]),  3,3},
  {&(_tg__ZTV2B1__3C126E12x12__8G12x12y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E12x12__8G12x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x12y7[];
extern  VTBL_ENTRY _ZTV8G12x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x12y7[];
static VTBL_ENTRY alt_thunk_names43[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x123fooEv,_ZTv0_n12_N6E12x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x123fooEv,_ZThn20_N6E12x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x123fooEv,_ZThn20_N6E12x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x12y7 = {  "G12x12y7", // class name
  bases_G12x12y7, 6,
  &(vtc_G12x12y7[0]), // expected_vtbl_contents
  &(vtt_G12x12y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G12x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x12y7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x12y7),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  E13x12  : C13 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E13x123fooEv
  ~E13x12(); // tgen
  E13x12(); // tgen
};
//SIG(-1 E13x12) C1{ BC2{ BC3{ v1 Fi} VBC4{ v1 Fi} Fi} BC5{ Fi} v1 Fi}


void  E13x12 ::foo(){vfunc_called(this, "_ZN6E13x123fooEv");}
E13x12 ::~E13x12(){ note_dtor("E13x12", this);} // tgen
E13x12 ::E13x12(){ note_ctor("E13x12", this);} // tgen

static void Test_E13x12()
{
  extern Class_Descriptor cd_E13x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E13x12, buf);
    E13x12 *dp, &lv = *(dp=new (buf) E13x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E13x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E13x12)");
    check_base_class_offset(lv, (A1*)(C13*), 0, "E13x12");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(24,20), "E13x12");
    check_base_class_offset(lv, (C13*), 0, "E13x12");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E13x12");
    check_field_offset(lv, fd, ABISELECT(20,16), "E13x12.fd");
    test_class_info(&lv, &cd_E13x12);
    dp->~E13x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE13x12(Test_E13x12, "E13x12", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E13x12C1Ev();
extern void _ZN6E13x12D1Ev();
Name_Map name_map_E13x12[] = {
  NSPAIR(_ZN6E13x12C1Ev),
  NSPAIR(_ZN6E13x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x12[] = {
  // 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 _ZTI6E13x12[];
extern void _ZN6E13x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv)();
extern void ABISELECT(_ZThn24_N6E13x123fooEv,_ZThn20_N6E13x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E13x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x12[0]),
  (VTBL_ENTRY)&_ZN6E13x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E13x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv),
};
extern VTBL_ENTRY _ZTV6E13x12[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__6E13x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__6E13x12[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E13x12[] = {
  {&(_ZTV6E13x12[3]),  3,8},
  {&(_tg__ZTV3C13__6E13x12[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__6E13x12[3]),  3,4},
  {&(_ZTV6E13x12[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6E13x12[];
extern  VTBL_ENTRY _ZTV6E13x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x12[];
static VTBL_ENTRY alt_thunk_names44[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x123fooEv,_ZThn20_N6E13x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E13x12 = {  "E13x12", // class name
  bases_E13x12, 4,
  &(vtc_E13x12[0]), // expected_vtbl_contents
  &(vtt_E13x12[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E13x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E13x12),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E13x12),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  G13x12y0  : E13x12 , F1 {
  int ff;
  ~G13x12y0(); // tgen
  G13x12y0(); // tgen
};
//SIG(1 G13x12y0) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G13x12y0 ::~G13x12y0(){ note_dtor("G13x12y0", this);} // tgen
G13x12y0 ::G13x12y0(){ note_ctor("G13x12y0", this);} // tgen

static void Test_G13x12y0()
{
  extern Class_Descriptor cd_G13x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x12y0, buf);
    G13x12y0 *dp, &lv = *(dp=new (buf) G13x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x12y0)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x12*), 0, "G13x12y0");
    check_base_class_offset(lv, (B1*)(C13*)(E13x12*), ABISELECT(40,32), "G13x12y0");
    check_base_class_offset(lv, (C13*)(E13x12*), 0, "G13x12y0");
    check_base_class_offset(lv, (D0*)(E13x12*), ABISELECT(16,12), "G13x12y0");
    check_base_class_offset(lv, (E13x12*), 0, "G13x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G13x12y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G13x12y0.ff");
    test_class_info(&lv, &cd_G13x12y0);
    dp->~G13x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x12y0(Test_G13x12y0, "G13x12y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G13x12y0C1Ev();
extern void _ZN8G13x12y0D1Ev();
Name_Map name_map_G13x12y0[] = {
  NSPAIR(_ZN8G13x12y0C1Ev),
  NSPAIR(_ZN8G13x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x12;
extern VTBL_ENTRY _ZTI6E13x12[];
extern  VTBL_ENTRY _ZTV6E13x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x12y0[] = {
  // 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_E13x12,    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 _ZTI8G13x12y0[];
extern void _ZN6E13x123fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv)();
extern void ABISELECT(_ZThn40_N6E13x123fooEv,_ZThn32_N6E13x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x12y0[0]),
  (VTBL_ENTRY)&_ZN6E13x123fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G13x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G13x12y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv),
};
extern VTBL_ENTRY _ZTV8G13x12y0[];
extern void _ZN6E13x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x12__8G13x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x12[0]),
  (VTBL_ENTRY)&_ZN6E13x123fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C136E13x12__8G13x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C136E13x12__8G13x12y0[] = {
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv)();
extern void ABISELECT(_ZThn40_N6E13x123fooEv,_ZThn32_N6E13x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x12__8G13x12y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6E13x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv),
};
static  VTT_ENTRY vtt_G13x12y0[] = {
  {&(_ZTV8G13x12y0[3]),  3,11},
  {&(_tg__ZTV6E13x12__8G13x12y0[3]),  3,4},
  {&(_tg__ZTV3C136E13x12__8G13x12y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C136E13x12__8G13x12y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E13x12__8G13x12y0[3]),  3,4},
  {&(_ZTV8G13x12y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI8G13x12y0[];
extern  VTBL_ENTRY _ZTV8G13x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x12y0[];
static VTBL_ENTRY alt_thunk_names45[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E13x123fooEv,_ZThn32_N6E13x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E13x123fooEv,_ZThn32_N6E13x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x12y0 = {  "G13x12y0", // class name
  bases_G13x12y0, 6,
  &(vtc_G13x12y0[0]), // expected_vtbl_contents
  &(vtt_G13x12y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G13x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x12y0),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x12y0),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  G13x12y1  : virtual E13x12 , F1 {
  int ff;
  ~G13x12y1(); // tgen
  G13x12y1(); // tgen
};
//SIG(1 G13x12y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G13x12y1 ::~G13x12y1(){ note_dtor("G13x12y1", this);} // tgen
G13x12y1 ::G13x12y1(){ note_ctor("G13x12y1", this);} // tgen

static void Test_G13x12y1()
{
  extern Class_Descriptor cd_G13x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x12y1, buf);
    G13x12y1 *dp, &lv = *(dp=new (buf) G13x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x12y1)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x12*), ABISELECT(16,12), "G13x12y1");
    check_base_class_offset(lv, (B1*)(C13*)(E13x12*), ABISELECT(40,32), "G13x12y1");
    check_base_class_offset(lv, (C13*)(E13x12*), ABISELECT(16,12), "G13x12y1");
    check_base_class_offset(lv, (D0*)(E13x12*), ABISELECT(32,24), "G13x12y1");
    check_base_class_offset(lv, (E13x12*), ABISELECT(16,12), "G13x12y1");
    check_base_class_offset(lv, (F1*), 0, "G13x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x12y1.ff");
    test_class_info(&lv, &cd_G13x12y1);
    dp->~G13x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x12y1(Test_G13x12y1, "G13x12y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G13x12y1C1Ev();
extern void _ZN8G13x12y1D1Ev();
Name_Map name_map_G13x12y1[] = {
  NSPAIR(_ZN8G13x12y1C1Ev),
  NSPAIR(_ZN8G13x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x12;
extern VTBL_ENTRY _ZTI6E13x12[];
extern  VTBL_ENTRY _ZTV6E13x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x12y1[] = {
  // 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_E13x12,    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 _ZTI8G13x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E13x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv)();
extern void ABISELECT(_ZThn24_N6E13x123fooEv,_ZThn20_N6E13x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G13x12y1[0]),
  (VTBL_ENTRY)&_ZN6E13x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G13x12y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv),
};
extern VTBL_ENTRY _ZTV8G13x12y1[];
extern void _ZN6E13x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x12__8G13x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x12[0]),
  (VTBL_ENTRY)&_ZN6E13x123fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C136E13x12__8G13x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C136E13x12__8G13x12y1[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv)();
extern void ABISELECT(_ZThn24_N6E13x123fooEv,_ZThn20_N6E13x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x12__8G13x12y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E13x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv),
};
static  VTT_ENTRY vtt_G13x12y1[] = {
  {&(_ZTV8G13x12y1[4]),  4,14},
  {&(_ZTV8G13x12y1[9]),  9,14},
  {&(_ZTV8G13x12y1[13]),  13,14},
  {&(_tg__ZTV6E13x12__8G13x12y1[3]),  3,4},
  {&(_tg__ZTV3C136E13x12__8G13x12y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C136E13x12__8G13x12y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E13x12__8G13x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x12y1[];
extern  VTBL_ENTRY _ZTV8G13x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x12y1[];
static VTBL_ENTRY alt_thunk_names46[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x123fooEv,_ZThn20_N6E13x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x123fooEv,_ZThn20_N6E13x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x12y1 = {  "G13x12y1", // class name
  bases_G13x12y1, 6,
  &(vtc_G13x12y1[0]), // expected_vtbl_contents
  &(vtt_G13x12y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G13x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x12y1),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x12y1),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  G13x12y2  : E13x12 , virtual F1 {
  int ff;
  ~G13x12y2(); // tgen
  G13x12y2(); // tgen
};
//SIG(1 G13x12y2) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G13x12y2 ::~G13x12y2(){ note_dtor("G13x12y2", this);} // tgen
G13x12y2 ::G13x12y2(){ note_ctor("G13x12y2", this);} // tgen

static void Test_G13x12y2()
{
  extern Class_Descriptor cd_G13x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G13x12y2, buf);
    G13x12y2 *dp, &lv = *(dp=new (buf) G13x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G13x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x12y2)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x12*), 0, "G13x12y2");
    check_base_class_offset(lv, (B1*)(C13*)(E13x12*), ABISELECT(32,24), "G13x12y2");
    check_base_class_offset(lv, (C13*)(E13x12*), 0, "G13x12y2");
    check_base_class_offset(lv, (D0*)(E13x12*), ABISELECT(16,12), "G13x12y2");
    check_base_class_offset(lv, (E13x12*), 0, "G13x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G13x12y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G13x12y2.ff");
    test_class_info(&lv, &cd_G13x12y2);
    dp->~G13x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x12y2(Test_G13x12y2, "G13x12y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G13x12y2C1Ev();
extern void _ZN8G13x12y2D1Ev();
Name_Map name_map_G13x12y2[] = {
  NSPAIR(_ZN8G13x12y2C1Ev),
  NSPAIR(_ZN8G13x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x12;
extern VTBL_ENTRY _ZTI6E13x12[];
extern  VTBL_ENTRY _ZTV6E13x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x12y2[] = {
  // 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_E13x12,    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 _ZTI8G13x12y2[];
extern void _ZN6E13x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv)();
extern void ABISELECT(_ZThn32_N6E13x123fooEv,_ZThn24_N6E13x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G13x12y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x12y2[0]),
  (VTBL_ENTRY)&_ZN6E13x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G13x12y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G13x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G13x12y2[];
extern void _ZN6E13x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x12__8G13x12y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x12[0]),
  (VTBL_ENTRY)&_ZN6E13x123fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C136E13x12__8G13x12y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C136E13x12__8G13x12y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv)();
extern void ABISELECT(_ZThn32_N6E13x123fooEv,_ZThn24_N6E13x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x12__8G13x12y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E13x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv),
};
static  VTT_ENTRY vtt_G13x12y2[] = {
  {&(_ZTV8G13x12y2[4]),  4,13},
  {&(_tg__ZTV6E13x12__8G13x12y2[3]),  3,4},
  {&(_tg__ZTV3C136E13x12__8G13x12y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C136E13x12__8G13x12y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E13x12__8G13x12y2[3]),  3,4},
  {&(_ZTV8G13x12y2[8]),  8,13},
  {&(_ZTV8G13x12y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI8G13x12y2[];
extern  VTBL_ENTRY _ZTV8G13x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x12y2[];
static VTBL_ENTRY alt_thunk_names47[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x123fooEv,_ZThn24_N6E13x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x123fooEv,_ZThn24_N6E13x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x12y2 = {  "G13x12y2", // class name
  bases_G13x12y2, 6,
  &(vtc_G13x12y2[0]), // expected_vtbl_contents
  &(vtt_G13x12y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G13x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x12y2),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x12y2),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  G13x12y3  : virtual E13x12 , virtual F1 {
  int ff;
  ~G13x12y3(); // tgen
  G13x12y3(); // tgen
};
//SIG(1 G13x12y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G13x12y3 ::~G13x12y3(){ note_dtor("G13x12y3", this);} // tgen
G13x12y3 ::G13x12y3(){ note_ctor("G13x12y3", this);} // tgen

static void Test_G13x12y3()
{
  extern Class_Descriptor cd_G13x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G13x12y3, buf);
    G13x12y3 *dp, &lv = *(dp=new (buf) G13x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G13x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x12y3)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x12*), ABISELECT(16,8), "G13x12y3");
    check_base_class_offset(lv, (B1*)(C13*)(E13x12*), ABISELECT(40,28), "G13x12y3");
    check_base_class_offset(lv, (C13*)(E13x12*), ABISELECT(16,8), "G13x12y3");
    check_base_class_offset(lv, (D0*)(E13x12*), ABISELECT(32,20), "G13x12y3");
    check_base_class_offset(lv, (E13x12*), ABISELECT(16,8), "G13x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G13x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G13x12y3.ff");
    test_class_info(&lv, &cd_G13x12y3);
    dp->~G13x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x12y3(Test_G13x12y3, "G13x12y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G13x12y3C1Ev();
extern void _ZN8G13x12y3D1Ev();
Name_Map name_map_G13x12y3[] = {
  NSPAIR(_ZN8G13x12y3C1Ev),
  NSPAIR(_ZN8G13x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x12;
extern VTBL_ENTRY _ZTI6E13x12[];
extern  VTBL_ENTRY _ZTV6E13x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x12y3[] = {
  // 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_E13x12,    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 _ZTI8G13x12y3[];
extern void _ZN6E13x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv)();
extern void ABISELECT(_ZThn24_N6E13x123fooEv,_ZThn20_N6E13x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G13x12y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G13x12y3[0]),
  (VTBL_ENTRY)&_ZN6E13x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G13x12y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G13x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G13x12y3[];
extern void _ZN6E13x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x12__8G13x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x12[0]),
  (VTBL_ENTRY)&_ZN6E13x123fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C136E13x12__8G13x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C136E13x12__8G13x12y3[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv)();
extern void ABISELECT(_ZThn24_N6E13x123fooEv,_ZThn20_N6E13x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x12__8G13x12y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E13x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv),
};
static  VTT_ENTRY vtt_G13x12y3[] = {
  {&(_ZTV8G13x12y3[5]),  5,18},
  {&(_ZTV8G13x12y3[9]),  9,18},
  {&(_ZTV8G13x12y3[13]),  13,18},
  {&(_ZTV8G13x12y3[17]),  17,18},
  {&(_tg__ZTV6E13x12__8G13x12y3[3]),  3,4},
  {&(_tg__ZTV3C136E13x12__8G13x12y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C136E13x12__8G13x12y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E13x12__8G13x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x12y3[];
extern  VTBL_ENTRY _ZTV8G13x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x12y3[];
static VTBL_ENTRY alt_thunk_names48[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x123fooEv,_ZThn20_N6E13x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x123fooEv,_ZThn20_N6E13x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x12y3 = {  "G13x12y3", // class name
  bases_G13x12y3, 6,
  &(vtc_G13x12y3[0]), // expected_vtbl_contents
  &(vtt_G13x12y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G13x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x12y3),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x12y3),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  G13x12y4  : E13x12 , F0 {
  int ff;
  ~G13x12y4(); // tgen
  G13x12y4(); // tgen
};
//SIG(1 G13x12y4) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G13x12y4 ::~G13x12y4(){ note_dtor("G13x12y4", this);} // tgen
G13x12y4 ::G13x12y4(){ note_ctor("G13x12y4", this);} // tgen

static void Test_G13x12y4()
{
  extern Class_Descriptor cd_G13x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G13x12y4, buf);
    G13x12y4 *dp, &lv = *(dp=new (buf) G13x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G13x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x12y4)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x12*), 0, "G13x12y4");
    check_base_class_offset(lv, (B1*)(C13*)(E13x12*), ABISELECT(32,28), "G13x12y4");
    check_base_class_offset(lv, (C13*)(E13x12*), 0, "G13x12y4");
    check_base_class_offset(lv, (D0*)(E13x12*), ABISELECT(16,12), "G13x12y4");
    check_base_class_offset(lv, (E13x12*), 0, "G13x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G13x12y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G13x12y4.ff");
    test_class_info(&lv, &cd_G13x12y4);
    dp->~G13x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x12y4(Test_G13x12y4, "G13x12y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G13x12y4C1Ev();
extern void _ZN8G13x12y4D1Ev();
Name_Map name_map_G13x12y4[] = {
  NSPAIR(_ZN8G13x12y4C1Ev),
  NSPAIR(_ZN8G13x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x12;
extern VTBL_ENTRY _ZTI6E13x12[];
extern  VTBL_ENTRY _ZTV6E13x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x12y4[] = {
  // 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_E13x12,    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 _ZTI8G13x12y4[];
extern void _ZN6E13x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv)();
extern void ABISELECT(_ZThn32_N6E13x123fooEv,_ZThn28_N6E13x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x12y4[0]),
  (VTBL_ENTRY)&_ZN6E13x123fooEv,
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G13x12y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv),
};
extern VTBL_ENTRY _ZTV8G13x12y4[];
extern void _ZN6E13x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x12__8G13x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x12[0]),
  (VTBL_ENTRY)&_ZN6E13x123fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C136E13x12__8G13x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C136E13x12__8G13x12y4[] = {
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv)();
extern void ABISELECT(_ZThn32_N6E13x123fooEv,_ZThn28_N6E13x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x12__8G13x12y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6E13x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv),
};
static  VTT_ENTRY vtt_G13x12y4[] = {
  {&(_ZTV8G13x12y4[3]),  3,8},
  {&(_tg__ZTV6E13x12__8G13x12y4[3]),  3,4},
  {&(_tg__ZTV3C136E13x12__8G13x12y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C136E13x12__8G13x12y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E13x12__8G13x12y4[3]),  3,4},
  {&(_ZTV8G13x12y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI8G13x12y4[];
extern  VTBL_ENTRY _ZTV8G13x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x12y4[];
static VTBL_ENTRY alt_thunk_names49[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x123fooEv,_ZThn28_N6E13x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x123fooEv,_ZThn28_N6E13x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x12y4 = {  "G13x12y4", // class name
  bases_G13x12y4, 6,
  &(vtc_G13x12y4[0]), // expected_vtbl_contents
  &(vtt_G13x12y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G13x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x12y4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x12y4),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  G13x12y5  : virtual E13x12 , F0 {
  int ff;
  ~G13x12y5(); // tgen
  G13x12y5(); // tgen
};
//SIG(1 G13x12y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G13x12y5 ::~G13x12y5(){ note_dtor("G13x12y5", this);} // tgen
G13x12y5 ::G13x12y5(){ note_ctor("G13x12y5", this);} // tgen

static void Test_G13x12y5()
{
  extern Class_Descriptor cd_G13x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x12y5, buf);
    G13x12y5 *dp, &lv = *(dp=new (buf) G13x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x12y5)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x12*), ABISELECT(16,12), "G13x12y5");
    check_base_class_offset(lv, (B1*)(C13*)(E13x12*), ABISELECT(40,32), "G13x12y5");
    check_base_class_offset(lv, (C13*)(E13x12*), ABISELECT(16,12), "G13x12y5");
    check_base_class_offset(lv, (D0*)(E13x12*), ABISELECT(32,24), "G13x12y5");
    check_base_class_offset(lv, (E13x12*), ABISELECT(16,12), "G13x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G13x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x12y5.ff");
    test_class_info(&lv, &cd_G13x12y5);
    dp->~G13x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x12y5(Test_G13x12y5, "G13x12y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G13x12y5C1Ev();
extern void _ZN8G13x12y5D1Ev();
Name_Map name_map_G13x12y5[] = {
  NSPAIR(_ZN8G13x12y5C1Ev),
  NSPAIR(_ZN8G13x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x12;
extern VTBL_ENTRY _ZTI6E13x12[];
extern  VTBL_ENTRY _ZTV6E13x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x12y5[] = {
  // 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_E13x12,    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 _ZTI8G13x12y5[];
extern void _ZN6E13x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv)();
extern void ABISELECT(_ZThn24_N6E13x123fooEv,_ZThn20_N6E13x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G13x12y5[0]),
  (VTBL_ENTRY)&_ZN6E13x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G13x12y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv),
};
extern VTBL_ENTRY _ZTV8G13x12y5[];
extern void _ZN6E13x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x12__8G13x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x12[0]),
  (VTBL_ENTRY)&_ZN6E13x123fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C136E13x12__8G13x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C136E13x12__8G13x12y5[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv)();
extern void ABISELECT(_ZThn24_N6E13x123fooEv,_ZThn20_N6E13x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x12__8G13x12y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E13x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv),
};
static  VTT_ENTRY vtt_G13x12y5[] = {
  {&(_ZTV8G13x12y5[4]),  4,13},
  {&(_ZTV8G13x12y5[8]),  8,13},
  {&(_ZTV8G13x12y5[12]),  12,13},
  {&(_tg__ZTV6E13x12__8G13x12y5[3]),  3,4},
  {&(_tg__ZTV3C136E13x12__8G13x12y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C136E13x12__8G13x12y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E13x12__8G13x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x12y5[];
extern  VTBL_ENTRY _ZTV8G13x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x12y5[];
static VTBL_ENTRY alt_thunk_names50[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x123fooEv,_ZThn20_N6E13x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x123fooEv,_ZThn20_N6E13x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x12y5 = {  "G13x12y5", // class name
  bases_G13x12y5, 6,
  &(vtc_G13x12y5[0]), // expected_vtbl_contents
  &(vtt_G13x12y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G13x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x12y5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x12y5),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  G13x12y6  : E13x12 , virtual F0 {
  int ff;
  ~G13x12y6(); // tgen
  G13x12y6(); // tgen
};
//SIG(1 G13x12y6) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G13x12y6 ::~G13x12y6(){ note_dtor("G13x12y6", this);} // tgen
G13x12y6 ::G13x12y6(){ note_ctor("G13x12y6", this);} // tgen

static void Test_G13x12y6()
{
  extern Class_Descriptor cd_G13x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G13x12y6, buf);
    G13x12y6 *dp, &lv = *(dp=new (buf) G13x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G13x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x12y6)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x12*), 0, "G13x12y6");
    check_base_class_offset(lv, (B1*)(C13*)(E13x12*), ABISELECT(32,24), "G13x12y6");
    check_base_class_offset(lv, (C13*)(E13x12*), 0, "G13x12y6");
    check_base_class_offset(lv, (D0*)(E13x12*), ABISELECT(16,12), "G13x12y6");
    check_base_class_offset(lv, (E13x12*), 0, "G13x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G13x12y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G13x12y6.ff");
    test_class_info(&lv, &cd_G13x12y6);
    dp->~G13x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x12y6(Test_G13x12y6, "G13x12y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G13x12y6C1Ev();
extern void _ZN8G13x12y6D1Ev();
Name_Map name_map_G13x12y6[] = {
  NSPAIR(_ZN8G13x12y6C1Ev),
  NSPAIR(_ZN8G13x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x12;
extern VTBL_ENTRY _ZTI6E13x12[];
extern  VTBL_ENTRY _ZTV6E13x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x12y6[] = {
  // 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_E13x12,    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 _ZTI8G13x12y6[];
extern void _ZN6E13x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv)();
extern void ABISELECT(_ZThn32_N6E13x123fooEv,_ZThn24_N6E13x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x12y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x12y6[0]),
  (VTBL_ENTRY)&_ZN6E13x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G13x12y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv),
};
extern VTBL_ENTRY _ZTV8G13x12y6[];
extern void _ZN6E13x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x12__8G13x12y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x12[0]),
  (VTBL_ENTRY)&_ZN6E13x123fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C136E13x12__8G13x12y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C136E13x12__8G13x12y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv)();
extern void ABISELECT(_ZThn32_N6E13x123fooEv,_ZThn24_N6E13x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x12__8G13x12y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E13x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv),
};
static  VTT_ENTRY vtt_G13x12y6[] = {
  {&(_ZTV8G13x12y6[4]),  4,9},
  {&(_tg__ZTV6E13x12__8G13x12y6[3]),  3,4},
  {&(_tg__ZTV3C136E13x12__8G13x12y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C136E13x12__8G13x12y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E13x12__8G13x12y6[3]),  3,4},
  {&(_ZTV8G13x12y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G13x12y6[];
extern  VTBL_ENTRY _ZTV8G13x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x12y6[];
static VTBL_ENTRY alt_thunk_names51[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x123fooEv,_ZThn24_N6E13x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x123fooEv,_ZThn24_N6E13x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x12y6 = {  "G13x12y6", // class name
  bases_G13x12y6, 6,
  &(vtc_G13x12y6[0]), // expected_vtbl_contents
  &(vtt_G13x12y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G13x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x12y6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x12y6),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  G13x12y7  : virtual E13x12 , virtual F0 {
  int ff;
  ~G13x12y7(); // tgen
  G13x12y7(); // tgen
};
//SIG(1 G13x12y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G13x12y7 ::~G13x12y7(){ note_dtor("G13x12y7", this);} // tgen
G13x12y7 ::G13x12y7(){ note_ctor("G13x12y7", this);} // tgen

static void Test_G13x12y7()
{
  extern Class_Descriptor cd_G13x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x12y7, buf);
    G13x12y7 *dp, &lv = *(dp=new (buf) G13x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x12y7)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x12*), ABISELECT(16,8), "G13x12y7");
    check_base_class_offset(lv, (B1*)(C13*)(E13x12*), ABISELECT(40,28), "G13x12y7");
    check_base_class_offset(lv, (C13*)(E13x12*), ABISELECT(16,8), "G13x12y7");
    check_base_class_offset(lv, (D0*)(E13x12*), ABISELECT(32,20), "G13x12y7");
    check_base_class_offset(lv, (E13x12*), ABISELECT(16,8), "G13x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G13x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G13x12y7.ff");
    test_class_info(&lv, &cd_G13x12y7);
    dp->~G13x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x12y7(Test_G13x12y7, "G13x12y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G13x12y7C1Ev();
extern void _ZN8G13x12y7D1Ev();
Name_Map name_map_G13x12y7[] = {
  NSPAIR(_ZN8G13x12y7C1Ev),
  NSPAIR(_ZN8G13x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x12;
extern VTBL_ENTRY _ZTI6E13x12[];
extern  VTBL_ENTRY _ZTV6E13x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x12y7[] = {
  // 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_E13x12,    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 _ZTI8G13x12y7[];
extern void _ZN6E13x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv)();
extern void ABISELECT(_ZThn24_N6E13x123fooEv,_ZThn20_N6E13x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x12y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G13x12y7[0]),
  (VTBL_ENTRY)&_ZN6E13x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G13x12y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv),
};
extern VTBL_ENTRY _ZTV8G13x12y7[];
extern void _ZN6E13x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x12__8G13x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x12[0]),
  (VTBL_ENTRY)&_ZN6E13x123fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C136E13x12__8G13x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C136E13x12__8G13x12y7[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv)();
extern void ABISELECT(_ZThn24_N6E13x123fooEv,_ZThn20_N6E13x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x12__8G13x12y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E13x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv),
};
static  VTT_ENTRY vtt_G13x12y7[] = {
  {&(_ZTV8G13x12y7[5]),  5,14},
  {&(_ZTV8G13x12y7[9]),  9,14},
  {&(_ZTV8G13x12y7[13]),  13,14},
  {&(_tg__ZTV6E13x12__8G13x12y7[3]),  3,4},
  {&(_tg__ZTV3C136E13x12__8G13x12y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C136E13x12__8G13x12y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E13x12__8G13x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x12y7[];
extern  VTBL_ENTRY _ZTV8G13x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x12y7[];
static VTBL_ENTRY alt_thunk_names52[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x123fooEv,_ZTv0_n12_N6E13x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x123fooEv,_ZThn20_N6E13x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x123fooEv,_ZThn20_N6E13x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x12y7 = {  "G13x12y7", // class name
  bases_G13x12y7, 6,
  &(vtc_G13x12y7[0]), // expected_vtbl_contents
  &(vtt_G13x12y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G13x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x12y7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x12y7),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  E14x12  : C14 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E14x123fooEv
  ~E14x12(); // tgen
  E14x12(); // tgen
};
//SIG(-1 E14x12) C1{ BC2{ VBC3{ Fi} VBC4{ v1 Fi} Fi} BC5{ Fi} v1 Fi}


void  E14x12 ::foo(){vfunc_called(this, "_ZN6E14x123fooEv");}
E14x12 ::~E14x12(){ note_dtor("E14x12", this);} // tgen
E14x12 ::E14x12(){ note_ctor("E14x12", this);} // tgen

static void Test_E14x12()
{
  extern Class_Descriptor cd_E14x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E14x12, buf);
    E14x12 *dp, &lv = *(dp=new (buf) E14x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E14x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E14x12)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(20,16), "E14x12");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(24,20), "E14x12");
    check_base_class_offset(lv, (C14*), 0, "E14x12");
    check_base_class_offset(lv, (D0*), ABISELECT(12,8), "E14x12");
    check_field_offset(lv, fd, ABISELECT(16,12), "E14x12.fd");
    test_class_info(&lv, &cd_E14x12);
    dp->~E14x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE14x12(Test_E14x12, "E14x12", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E14x12C1Ev();
extern void _ZN6E14x12D1Ev();
Name_Map name_map_E14x12[] = {
  NSPAIR(_ZN6E14x12C1Ev),
  NSPAIR(_ZN6E14x12D1Ev),
  {0,0}
};
extern Class_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_E14x12[] = {
  // 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_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 _ZTI6E14x12[];
extern void _ZN6E14x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv)();
extern void ABISELECT(_ZThn24_N6E14x123fooEv,_ZThn20_N6E14x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E14x12[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x12[0]),
  (VTBL_ENTRY)&_ZN6E14x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E14x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv),
};
extern VTBL_ENTRY _ZTV6E14x12[];
static  VTBL_ENTRY _tg__ZTV3C14__6E14x12[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__6E14x12[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E14x12[] = {
  {&(_ZTV6E14x12[4]),  4,9},
  {&(_tg__ZTV3C14__6E14x12[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__6E14x12[3]),  3,4},
  {&(_ZTV6E14x12[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6E14x12[];
extern  VTBL_ENTRY _ZTV6E14x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x12[];
static VTBL_ENTRY alt_thunk_names53[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x123fooEv,_ZThn20_N6E14x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E14x12 = {  "E14x12", // class name
  bases_E14x12, 4,
  &(vtc_E14x12[0]), // expected_vtbl_contents
  &(vtt_E14x12[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E14x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E14x12),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E14x12),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  G14x12y0  : E14x12 , F1 {
  int ff;
  ~G14x12y0(); // tgen
  G14x12y0(); // tgen
};
//SIG(1 G14x12y0) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G14x12y0 ::~G14x12y0(){ note_dtor("G14x12y0", this);} // tgen
G14x12y0 ::G14x12y0(){ note_ctor("G14x12y0", this);} // tgen

static void Test_G14x12y0()
{
  extern Class_Descriptor cd_G14x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G14x12y0, buf);
    G14x12y0 *dp, &lv = *(dp=new (buf) G14x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G14x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x12y0)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x12*), ABISELECT(40,28), "G14x12y0");
    check_base_class_offset(lv, (B1*)(C14*)(E14x12*), ABISELECT(48,32), "G14x12y0");
    check_base_class_offset(lv, (C14*)(E14x12*), 0, "G14x12y0");
    check_base_class_offset(lv, (D0*)(E14x12*), ABISELECT(12,8), "G14x12y0");
    check_base_class_offset(lv, (E14x12*), 0, "G14x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G14x12y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G14x12y0.ff");
    test_class_info(&lv, &cd_G14x12y0);
    dp->~G14x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x12y0(Test_G14x12y0, "G14x12y0", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G14x12y0C1Ev();
extern void _ZN8G14x12y0D1Ev();
Name_Map name_map_G14x12y0[] = {
  NSPAIR(_ZN8G14x12y0C1Ev),
  NSPAIR(_ZN8G14x12y0D1Ev),
  {0,0}
};
extern Class_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_E14x12;
extern VTBL_ENTRY _ZTI6E14x12[];
extern  VTBL_ENTRY _ZTV6E14x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x12y0[] = {
  // 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_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_E14x12,    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 _ZTI8G14x12y0[];
extern void _ZN6E14x123fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv)();
extern void ABISELECT(_ZThn48_N6E14x123fooEv,_ZThn32_N6E14x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x12y0[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x12y0[0]),
  (VTBL_ENTRY)&_ZN6E14x123fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G14x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G14x12y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv),
};
extern VTBL_ENTRY _ZTV8G14x12y0[];
extern void _ZN6E14x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x12__8G14x12y0[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x12[0]),
  (VTBL_ENTRY)&_ZN6E14x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C146E14x12__8G14x12y0[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C146E14x12__8G14x12y0[] = {
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv)();
extern void ABISELECT(_ZThn48_N6E14x123fooEv,_ZThn32_N6E14x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x12__8G14x12y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6E14x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv),
};
static  VTT_ENTRY vtt_G14x12y0[] = {
  {&(_ZTV8G14x12y0[4]),  4,12},
  {&(_tg__ZTV6E14x12__8G14x12y0[4]),  4,5},
  {&(_tg__ZTV3C146E14x12__8G14x12y0[4]),  4,4},
  {&(_tg__ZTV2B1__3C146E14x12__8G14x12y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E14x12__8G14x12y0[3]),  3,4},
  {&(_ZTV8G14x12y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI8G14x12y0[];
extern  VTBL_ENTRY _ZTV8G14x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x12y0[];
static VTBL_ENTRY alt_thunk_names54[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E14x123fooEv,_ZThn32_N6E14x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E14x123fooEv,_ZThn32_N6E14x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x12y0 = {  "G14x12y0", // class name
  bases_G14x12y0, 6,
  &(vtc_G14x12y0[0]), // expected_vtbl_contents
  &(vtt_G14x12y0[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G14x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x12y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x12y0),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  G14x12y1  : virtual E14x12 , F1 {
  int ff;
  ~G14x12y1(); // tgen
  G14x12y1(); // tgen
};
//SIG(1 G14x12y1) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G14x12y1 ::~G14x12y1(){ note_dtor("G14x12y1", this);} // tgen
G14x12y1 ::G14x12y1(){ note_ctor("G14x12y1", this);} // tgen

static void Test_G14x12y1()
{
  extern Class_Descriptor cd_G14x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x12y1, buf);
    G14x12y1 *dp, &lv = *(dp=new (buf) G14x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x12y1)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x12*), ABISELECT(36,28), "G14x12y1");
    check_base_class_offset(lv, (B1*)(C14*)(E14x12*), ABISELECT(40,32), "G14x12y1");
    check_base_class_offset(lv, (C14*)(E14x12*), ABISELECT(16,12), "G14x12y1");
    check_base_class_offset(lv, (D0*)(E14x12*), ABISELECT(28,20), "G14x12y1");
    check_base_class_offset(lv, (E14x12*), ABISELECT(16,12), "G14x12y1");
    check_base_class_offset(lv, (F1*), 0, "G14x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x12y1.ff");
    test_class_info(&lv, &cd_G14x12y1);
    dp->~G14x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x12y1(Test_G14x12y1, "G14x12y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G14x12y1C1Ev();
extern void _ZN8G14x12y1D1Ev();
Name_Map name_map_G14x12y1[] = {
  NSPAIR(_ZN8G14x12y1C1Ev),
  NSPAIR(_ZN8G14x12y1D1Ev),
  {0,0}
};
extern Class_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_E14x12;
extern VTBL_ENTRY _ZTI6E14x12[];
extern  VTBL_ENTRY _ZTV6E14x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x12y1[] = {
  // 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_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_E14x12,    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 _ZTI8G14x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E14x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv)();
extern void ABISELECT(_ZThn24_N6E14x123fooEv,_ZThn20_N6E14x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G14x12y1[0]),
  (VTBL_ENTRY)&_ZN6E14x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G14x12y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv),
};
extern VTBL_ENTRY _ZTV8G14x12y1[];
extern void _ZN6E14x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x12__8G14x12y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x12[0]),
  (VTBL_ENTRY)&_ZN6E14x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C146E14x12__8G14x12y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C146E14x12__8G14x12y1[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv)();
extern void ABISELECT(_ZThn24_N6E14x123fooEv,_ZThn20_N6E14x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x12__8G14x12y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E14x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv),
};
static  VTT_ENTRY vtt_G14x12y1[] = {
  {&(_ZTV8G14x12y1[5]),  5,16},
  {&(_ZTV8G14x12y1[11]),  11,16},
  {&(_ZTV8G14x12y1[15]),  15,16},
  {&(_tg__ZTV6E14x12__8G14x12y1[4]),  4,5},
  {&(_tg__ZTV3C146E14x12__8G14x12y1[4]),  4,4},
  {&(_tg__ZTV2B1__3C146E14x12__8G14x12y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E14x12__8G14x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x12y1[];
extern  VTBL_ENTRY _ZTV8G14x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x12y1[];
static VTBL_ENTRY alt_thunk_names55[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x123fooEv,_ZThn20_N6E14x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x123fooEv,_ZThn20_N6E14x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x12y1 = {  "G14x12y1", // class name
  bases_G14x12y1, 6,
  &(vtc_G14x12y1[0]), // expected_vtbl_contents
  &(vtt_G14x12y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G14x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x12y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x12y1),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  G14x12y2  : E14x12 , virtual F1 {
  int ff;
  ~G14x12y2(); // tgen
  G14x12y2(); // tgen
};
//SIG(1 G14x12y2) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G14x12y2 ::~G14x12y2(){ note_dtor("G14x12y2", this);} // tgen
G14x12y2 ::G14x12y2(){ note_ctor("G14x12y2", this);} // tgen

static void Test_G14x12y2()
{
  extern Class_Descriptor cd_G14x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G14x12y2, buf);
    G14x12y2 *dp, &lv = *(dp=new (buf) G14x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G14x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x12y2)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x12*), ABISELECT(24,20), "G14x12y2");
    check_base_class_offset(lv, (B1*)(C14*)(E14x12*), ABISELECT(32,24), "G14x12y2");
    check_base_class_offset(lv, (C14*)(E14x12*), 0, "G14x12y2");
    check_base_class_offset(lv, (D0*)(E14x12*), ABISELECT(12,8), "G14x12y2");
    check_base_class_offset(lv, (E14x12*), 0, "G14x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G14x12y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G14x12y2.ff");
    test_class_info(&lv, &cd_G14x12y2);
    dp->~G14x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x12y2(Test_G14x12y2, "G14x12y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G14x12y2C1Ev();
extern void _ZN8G14x12y2D1Ev();
Name_Map name_map_G14x12y2[] = {
  NSPAIR(_ZN8G14x12y2C1Ev),
  NSPAIR(_ZN8G14x12y2D1Ev),
  {0,0}
};
extern Class_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_E14x12;
extern VTBL_ENTRY _ZTI6E14x12[];
extern  VTBL_ENTRY _ZTV6E14x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x12y2[] = {
  // 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_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_E14x12,    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 _ZTI8G14x12y2[];
extern void _ZN6E14x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv)();
extern void ABISELECT(_ZThn32_N6E14x123fooEv,_ZThn24_N6E14x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G14x12y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x12y2[0]),
  (VTBL_ENTRY)&_ZN6E14x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G14x12y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G14x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G14x12y2[];
extern void _ZN6E14x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x12__8G14x12y2[] = {
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x12[0]),
  (VTBL_ENTRY)&_ZN6E14x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C146E14x12__8G14x12y2[] = {
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C146E14x12__8G14x12y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv)();
extern void ABISELECT(_ZThn32_N6E14x123fooEv,_ZThn24_N6E14x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x12__8G14x12y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E14x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv),
};
static  VTT_ENTRY vtt_G14x12y2[] = {
  {&(_ZTV8G14x12y2[5]),  5,14},
  {&(_tg__ZTV6E14x12__8G14x12y2[4]),  4,5},
  {&(_tg__ZTV3C146E14x12__8G14x12y2[4]),  4,4},
  {&(_tg__ZTV2B1__3C146E14x12__8G14x12y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E14x12__8G14x12y2[3]),  3,4},
  {&(_ZTV8G14x12y2[9]),  9,14},
  {&(_ZTV8G14x12y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI8G14x12y2[];
extern  VTBL_ENTRY _ZTV8G14x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x12y2[];
static VTBL_ENTRY alt_thunk_names56[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x123fooEv,_ZThn24_N6E14x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x123fooEv,_ZThn24_N6E14x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x12y2 = {  "G14x12y2", // class name
  bases_G14x12y2, 6,
  &(vtc_G14x12y2[0]), // expected_vtbl_contents
  &(vtt_G14x12y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G14x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x12y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x12y2),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  G14x12y3  : virtual E14x12 , virtual F1 {
  int ff;
  ~G14x12y3(); // tgen
  G14x12y3(); // tgen
};
//SIG(1 G14x12y3) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G14x12y3 ::~G14x12y3(){ note_dtor("G14x12y3", this);} // tgen
G14x12y3 ::G14x12y3(){ note_ctor("G14x12y3", this);} // tgen

static void Test_G14x12y3()
{
  extern Class_Descriptor cd_G14x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G14x12y3, buf);
    G14x12y3 *dp, &lv = *(dp=new (buf) G14x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G14x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x12y3)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x12*), ABISELECT(36,24), "G14x12y3");
    check_base_class_offset(lv, (B1*)(C14*)(E14x12*), ABISELECT(40,28), "G14x12y3");
    check_base_class_offset(lv, (C14*)(E14x12*), ABISELECT(16,8), "G14x12y3");
    check_base_class_offset(lv, (D0*)(E14x12*), ABISELECT(28,16), "G14x12y3");
    check_base_class_offset(lv, (E14x12*), ABISELECT(16,8), "G14x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G14x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G14x12y3.ff");
    test_class_info(&lv, &cd_G14x12y3);
    dp->~G14x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x12y3(Test_G14x12y3, "G14x12y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G14x12y3C1Ev();
extern void _ZN8G14x12y3D1Ev();
Name_Map name_map_G14x12y3[] = {
  NSPAIR(_ZN8G14x12y3C1Ev),
  NSPAIR(_ZN8G14x12y3D1Ev),
  {0,0}
};
extern Class_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_E14x12;
extern VTBL_ENTRY _ZTI6E14x12[];
extern  VTBL_ENTRY _ZTV6E14x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x12y3[] = {
  // 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_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_E14x12,    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 _ZTI8G14x12y3[];
extern void _ZN6E14x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv)();
extern void ABISELECT(_ZThn24_N6E14x123fooEv,_ZThn20_N6E14x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G14x12y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G14x12y3[0]),
  (VTBL_ENTRY)&_ZN6E14x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G14x12y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G14x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G14x12y3[];
extern void _ZN6E14x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x12__8G14x12y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x12[0]),
  (VTBL_ENTRY)&_ZN6E14x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C146E14x12__8G14x12y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C146E14x12__8G14x12y3[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv)();
extern void ABISELECT(_ZThn24_N6E14x123fooEv,_ZThn20_N6E14x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x12__8G14x12y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E14x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv),
};
static  VTT_ENTRY vtt_G14x12y3[] = {
  {&(_ZTV8G14x12y3[6]),  6,20},
  {&(_ZTV8G14x12y3[11]),  11,20},
  {&(_ZTV8G14x12y3[15]),  15,20},
  {&(_ZTV8G14x12y3[19]),  19,20},
  {&(_tg__ZTV6E14x12__8G14x12y3[4]),  4,5},
  {&(_tg__ZTV3C146E14x12__8G14x12y3[4]),  4,4},
  {&(_tg__ZTV2B1__3C146E14x12__8G14x12y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E14x12__8G14x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x12y3[];
extern  VTBL_ENTRY _ZTV8G14x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x12y3[];
static VTBL_ENTRY alt_thunk_names57[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x123fooEv,_ZThn20_N6E14x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x123fooEv,_ZThn20_N6E14x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x12y3 = {  "G14x12y3", // class name
  bases_G14x12y3, 6,
  &(vtc_G14x12y3[0]), // expected_vtbl_contents
  &(vtt_G14x12y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G14x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x12y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x12y3),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  G14x12y4  : E14x12 , F0 {
  int ff;
  ~G14x12y4(); // tgen
  G14x12y4(); // tgen
};
//SIG(1 G14x12y4) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G14x12y4 ::~G14x12y4(){ note_dtor("G14x12y4", this);} // tgen
G14x12y4 ::G14x12y4(){ note_ctor("G14x12y4", this);} // tgen

static void Test_G14x12y4()
{
  extern Class_Descriptor cd_G14x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G14x12y4, buf);
    G14x12y4 *dp, &lv = *(dp=new (buf) G14x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G14x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x12y4)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x12*), ABISELECT(28,24), "G14x12y4");
    check_base_class_offset(lv, (B1*)(C14*)(E14x12*), ABISELECT(32,28), "G14x12y4");
    check_base_class_offset(lv, (C14*)(E14x12*), 0, "G14x12y4");
    check_base_class_offset(lv, (D0*)(E14x12*), ABISELECT(12,8), "G14x12y4");
    check_base_class_offset(lv, (E14x12*), 0, "G14x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G14x12y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G14x12y4.ff");
    test_class_info(&lv, &cd_G14x12y4);
    dp->~G14x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x12y4(Test_G14x12y4, "G14x12y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G14x12y4C1Ev();
extern void _ZN8G14x12y4D1Ev();
Name_Map name_map_G14x12y4[] = {
  NSPAIR(_ZN8G14x12y4C1Ev),
  NSPAIR(_ZN8G14x12y4D1Ev),
  {0,0}
};
extern Class_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_E14x12;
extern VTBL_ENTRY _ZTI6E14x12[];
extern  VTBL_ENTRY _ZTV6E14x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x12y4[] = {
  // 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_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_E14x12,    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 _ZTI8G14x12y4[];
extern void _ZN6E14x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv)();
extern void ABISELECT(_ZThn32_N6E14x123fooEv,_ZThn28_N6E14x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x12y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x12y4[0]),
  (VTBL_ENTRY)&_ZN6E14x123fooEv,
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G14x12y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv),
};
extern VTBL_ENTRY _ZTV8G14x12y4[];
extern void _ZN6E14x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x12__8G14x12y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x12[0]),
  (VTBL_ENTRY)&_ZN6E14x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C146E14x12__8G14x12y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C146E14x12__8G14x12y4[] = {
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv)();
extern void ABISELECT(_ZThn32_N6E14x123fooEv,_ZThn28_N6E14x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x12__8G14x12y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6E14x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv),
};
static  VTT_ENTRY vtt_G14x12y4[] = {
  {&(_ZTV8G14x12y4[4]),  4,9},
  {&(_tg__ZTV6E14x12__8G14x12y4[4]),  4,5},
  {&(_tg__ZTV3C146E14x12__8G14x12y4[4]),  4,4},
  {&(_tg__ZTV2B1__3C146E14x12__8G14x12y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E14x12__8G14x12y4[3]),  3,4},
  {&(_ZTV8G14x12y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G14x12y4[];
extern  VTBL_ENTRY _ZTV8G14x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x12y4[];
static VTBL_ENTRY alt_thunk_names58[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x123fooEv,_ZThn28_N6E14x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x123fooEv,_ZThn28_N6E14x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x12y4 = {  "G14x12y4", // class name
  bases_G14x12y4, 6,
  &(vtc_G14x12y4[0]), // expected_vtbl_contents
  &(vtt_G14x12y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G14x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x12y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x12y4),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  G14x12y5  : virtual E14x12 , F0 {
  int ff;
  ~G14x12y5(); // tgen
  G14x12y5(); // tgen
};
//SIG(1 G14x12y5) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G14x12y5 ::~G14x12y5(){ note_dtor("G14x12y5", this);} // tgen
G14x12y5 ::G14x12y5(){ note_ctor("G14x12y5", this);} // tgen

static void Test_G14x12y5()
{
  extern Class_Descriptor cd_G14x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x12y5, buf);
    G14x12y5 *dp, &lv = *(dp=new (buf) G14x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x12y5)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x12*), ABISELECT(36,28), "G14x12y5");
    check_base_class_offset(lv, (B1*)(C14*)(E14x12*), ABISELECT(40,32), "G14x12y5");
    check_base_class_offset(lv, (C14*)(E14x12*), ABISELECT(16,12), "G14x12y5");
    check_base_class_offset(lv, (D0*)(E14x12*), ABISELECT(28,20), "G14x12y5");
    check_base_class_offset(lv, (E14x12*), ABISELECT(16,12), "G14x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G14x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x12y5.ff");
    test_class_info(&lv, &cd_G14x12y5);
    dp->~G14x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x12y5(Test_G14x12y5, "G14x12y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G14x12y5C1Ev();
extern void _ZN8G14x12y5D1Ev();
Name_Map name_map_G14x12y5[] = {
  NSPAIR(_ZN8G14x12y5C1Ev),
  NSPAIR(_ZN8G14x12y5D1Ev),
  {0,0}
};
extern Class_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_E14x12;
extern VTBL_ENTRY _ZTI6E14x12[];
extern  VTBL_ENTRY _ZTV6E14x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x12y5[] = {
  // 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_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_E14x12,    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 _ZTI8G14x12y5[];
extern void _ZN6E14x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv)();
extern void ABISELECT(_ZThn24_N6E14x123fooEv,_ZThn20_N6E14x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G14x12y5[0]),
  (VTBL_ENTRY)&_ZN6E14x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G14x12y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv),
};
extern VTBL_ENTRY _ZTV8G14x12y5[];
extern void _ZN6E14x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x12__8G14x12y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x12[0]),
  (VTBL_ENTRY)&_ZN6E14x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C146E14x12__8G14x12y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C146E14x12__8G14x12y5[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv)();
extern void ABISELECT(_ZThn24_N6E14x123fooEv,_ZThn20_N6E14x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x12__8G14x12y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E14x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv),
};
static  VTT_ENTRY vtt_G14x12y5[] = {
  {&(_ZTV8G14x12y5[5]),  5,15},
  {&(_ZTV8G14x12y5[10]),  10,15},
  {&(_ZTV8G14x12y5[14]),  14,15},
  {&(_tg__ZTV6E14x12__8G14x12y5[4]),  4,5},
  {&(_tg__ZTV3C146E14x12__8G14x12y5[4]),  4,4},
  {&(_tg__ZTV2B1__3C146E14x12__8G14x12y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E14x12__8G14x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x12y5[];
extern  VTBL_ENTRY _ZTV8G14x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x12y5[];
static VTBL_ENTRY alt_thunk_names59[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x123fooEv,_ZThn20_N6E14x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x123fooEv,_ZThn20_N6E14x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x12y5 = {  "G14x12y5", // class name
  bases_G14x12y5, 6,
  &(vtc_G14x12y5[0]), // expected_vtbl_contents
  &(vtt_G14x12y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G14x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x12y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x12y5),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  G14x12y6  : E14x12 , virtual F0 {
  int ff;
  ~G14x12y6(); // tgen
  G14x12y6(); // tgen
};
//SIG(1 G14x12y6) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G14x12y6 ::~G14x12y6(){ note_dtor("G14x12y6", this);} // tgen
G14x12y6 ::G14x12y6(){ note_ctor("G14x12y6", this);} // tgen

static void Test_G14x12y6()
{
  extern Class_Descriptor cd_G14x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G14x12y6, buf);
    G14x12y6 *dp, &lv = *(dp=new (buf) G14x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G14x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x12y6)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x12*), ABISELECT(24,20), "G14x12y6");
    check_base_class_offset(lv, (B1*)(C14*)(E14x12*), ABISELECT(32,24), "G14x12y6");
    check_base_class_offset(lv, (C14*)(E14x12*), 0, "G14x12y6");
    check_base_class_offset(lv, (D0*)(E14x12*), ABISELECT(12,8), "G14x12y6");
    check_base_class_offset(lv, (E14x12*), 0, "G14x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G14x12y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G14x12y6.ff");
    test_class_info(&lv, &cd_G14x12y6);
    dp->~G14x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x12y6(Test_G14x12y6, "G14x12y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G14x12y6C1Ev();
extern void _ZN8G14x12y6D1Ev();
Name_Map name_map_G14x12y6[] = {
  NSPAIR(_ZN8G14x12y6C1Ev),
  NSPAIR(_ZN8G14x12y6D1Ev),
  {0,0}
};
extern Class_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_E14x12;
extern VTBL_ENTRY _ZTI6E14x12[];
extern  VTBL_ENTRY _ZTV6E14x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x12y6[] = {
  // 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_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_E14x12,    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 _ZTI8G14x12y6[];
extern void _ZN6E14x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv)();
extern void ABISELECT(_ZThn32_N6E14x123fooEv,_ZThn24_N6E14x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x12y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x12y6[0]),
  (VTBL_ENTRY)&_ZN6E14x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G14x12y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv),
};
extern VTBL_ENTRY _ZTV8G14x12y6[];
extern void _ZN6E14x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x12__8G14x12y6[] = {
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x12[0]),
  (VTBL_ENTRY)&_ZN6E14x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C146E14x12__8G14x12y6[] = {
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C146E14x12__8G14x12y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv)();
extern void ABISELECT(_ZThn32_N6E14x123fooEv,_ZThn24_N6E14x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x12__8G14x12y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E14x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv),
};
static  VTT_ENTRY vtt_G14x12y6[] = {
  {&(_ZTV8G14x12y6[5]),  5,10},
  {&(_tg__ZTV6E14x12__8G14x12y6[4]),  4,5},
  {&(_tg__ZTV3C146E14x12__8G14x12y6[4]),  4,4},
  {&(_tg__ZTV2B1__3C146E14x12__8G14x12y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E14x12__8G14x12y6[3]),  3,4},
  {&(_ZTV8G14x12y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G14x12y6[];
extern  VTBL_ENTRY _ZTV8G14x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x12y6[];
static VTBL_ENTRY alt_thunk_names60[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x123fooEv,_ZThn24_N6E14x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x123fooEv,_ZThn24_N6E14x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x12y6 = {  "G14x12y6", // class name
  bases_G14x12y6, 6,
  &(vtc_G14x12y6[0]), // expected_vtbl_contents
  &(vtt_G14x12y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G14x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x12y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x12y6),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  G14x12y7  : virtual E14x12 , virtual F0 {
  int ff;
  ~G14x12y7(); // tgen
  G14x12y7(); // tgen
};
//SIG(1 G14x12y7) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G14x12y7 ::~G14x12y7(){ note_dtor("G14x12y7", this);} // tgen
G14x12y7 ::G14x12y7(){ note_ctor("G14x12y7", this);} // tgen

static void Test_G14x12y7()
{
  extern Class_Descriptor cd_G14x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x12y7, buf);
    G14x12y7 *dp, &lv = *(dp=new (buf) G14x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x12y7)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x12*), ABISELECT(36,24), "G14x12y7");
    check_base_class_offset(lv, (B1*)(C14*)(E14x12*), ABISELECT(40,28), "G14x12y7");
    check_base_class_offset(lv, (C14*)(E14x12*), ABISELECT(16,8), "G14x12y7");
    check_base_class_offset(lv, (D0*)(E14x12*), ABISELECT(28,16), "G14x12y7");
    check_base_class_offset(lv, (E14x12*), ABISELECT(16,8), "G14x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G14x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G14x12y7.ff");
    test_class_info(&lv, &cd_G14x12y7);
    dp->~G14x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x12y7(Test_G14x12y7, "G14x12y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G14x12y7C1Ev();
extern void _ZN8G14x12y7D1Ev();
Name_Map name_map_G14x12y7[] = {
  NSPAIR(_ZN8G14x12y7C1Ev),
  NSPAIR(_ZN8G14x12y7D1Ev),
  {0,0}
};
extern Class_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_E14x12;
extern VTBL_ENTRY _ZTI6E14x12[];
extern  VTBL_ENTRY _ZTV6E14x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x12y7[] = {
  // 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_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_E14x12,    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 _ZTI8G14x12y7[];
extern void _ZN6E14x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv)();
extern void ABISELECT(_ZThn24_N6E14x123fooEv,_ZThn20_N6E14x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x12y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G14x12y7[0]),
  (VTBL_ENTRY)&_ZN6E14x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G14x12y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv),
};
extern VTBL_ENTRY _ZTV8G14x12y7[];
extern void _ZN6E14x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x12__8G14x12y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x12[0]),
  (VTBL_ENTRY)&_ZN6E14x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C146E14x12__8G14x12y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C146E14x12__8G14x12y7[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv)();
extern void ABISELECT(_ZThn24_N6E14x123fooEv,_ZThn20_N6E14x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x12__8G14x12y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E14x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv),
};
static  VTT_ENTRY vtt_G14x12y7[] = {
  {&(_ZTV8G14x12y7[6]),  6,16},
  {&(_ZTV8G14x12y7[11]),  11,16},
  {&(_ZTV8G14x12y7[15]),  15,16},
  {&(_tg__ZTV6E14x12__8G14x12y7[4]),  4,5},
  {&(_tg__ZTV3C146E14x12__8G14x12y7[4]),  4,4},
  {&(_tg__ZTV2B1__3C146E14x12__8G14x12y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E14x12__8G14x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x12y7[];
extern  VTBL_ENTRY _ZTV8G14x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x12y7[];
static VTBL_ENTRY alt_thunk_names61[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x123fooEv,_ZTv0_n12_N6E14x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x123fooEv,_ZThn20_N6E14x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x123fooEv,_ZThn20_N6E14x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x12y7 = {  "G14x12y7", // class name
  bases_G14x12y7, 6,
  &(vtc_G14x12y7[0]), // expected_vtbl_contents
  &(vtt_G14x12y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G14x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x12y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x12y7),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  E15x12  : C15 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E15x123fooEv
  ~E15x12(); // tgen
  E15x12(); // tgen
};
//SIG(-1 E15x12) C1{ BC2{ VBC3{ v1 Fi} VBC4{ v1 Fi} Fi} BC5{ Fi} v1 Fi}


void  E15x12 ::foo(){vfunc_called(this, "_ZN6E15x123fooEv");}
E15x12 ::~E15x12(){ note_dtor("E15x12", this);} // tgen
E15x12 ::E15x12(){ note_ctor("E15x12", this);} // tgen

static void Test_E15x12()
{
  extern Class_Descriptor cd_E15x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_E15x12, buf);
    E15x12 *dp, &lv = *(dp=new (buf) E15x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(E15x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E15x12)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(24,16), "E15x12");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(40,24), "E15x12");
    check_base_class_offset(lv, (C15*), 0, "E15x12");
    check_base_class_offset(lv, (D0*), ABISELECT(12,8), "E15x12");
    check_field_offset(lv, fd, ABISELECT(16,12), "E15x12.fd");
    test_class_info(&lv, &cd_E15x12);
    dp->~E15x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE15x12(Test_E15x12, "E15x12", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN6E15x12C1Ev();
extern void _ZN6E15x12D1Ev();
Name_Map name_map_E15x12[] = {
  NSPAIR(_ZN6E15x12C1Ev),
  NSPAIR(_ZN6E15x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x12[] = {
  // 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_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 _ZTI6E15x12[];
extern void _ZN6E15x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn16_N6E15x123fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn24_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E15x12[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&_ZN6E15x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
extern VTBL_ENTRY _ZTV6E15x12[];
static  VTBL_ENTRY _tg__ZTV3C15__6E15x12[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__6E15x12[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__6E15x12[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E15x12[] = {
  {&(_ZTV6E15x12[4]),  4,13},
  {&(_tg__ZTV3C15__6E15x12[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__6E15x12[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__6E15x12[3]),  3,4},
  {&(_ZTV6E15x12[8]),  8,13},
  {&(_ZTV6E15x12[12]),  12,13},
};
extern VTBL_ENTRY _ZTI6E15x12[];
extern  VTBL_ENTRY _ZTV6E15x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x12[];
static VTBL_ENTRY alt_thunk_names62[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn24_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn16_N6E15x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E15x12 = {  "E15x12", // class name
  bases_E15x12, 4,
  &(vtc_E15x12[0]), // expected_vtbl_contents
  &(vtt_E15x12[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI6E15x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E15x12),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E15x12),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  G15x12y0  : E15x12 , F1 {
  int ff;
  ~G15x12y0(); // tgen
  G15x12y0(); // tgen
};
//SIG(1 G15x12y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G15x12y0 ::~G15x12y0(){ note_dtor("G15x12y0", this);} // tgen
G15x12y0 ::G15x12y0(){ note_ctor("G15x12y0", this);} // tgen

static void Test_G15x12y0()
{
  extern Class_Descriptor cd_G15x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x12y0, buf);
    G15x12y0 *dp, &lv = *(dp=new (buf) G15x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x12y0)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x12*), ABISELECT(40,28), "G15x12y0");
    check_base_class_offset(lv, (B1*)(C15*)(E15x12*), ABISELECT(56,36), "G15x12y0");
    check_base_class_offset(lv, (C15*)(E15x12*), 0, "G15x12y0");
    check_base_class_offset(lv, (D0*)(E15x12*), ABISELECT(12,8), "G15x12y0");
    check_base_class_offset(lv, (E15x12*), 0, "G15x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G15x12y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G15x12y0.ff");
    test_class_info(&lv, &cd_G15x12y0);
    dp->~G15x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x12y0(Test_G15x12y0, "G15x12y0", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G15x12y0C1Ev();
extern void _ZN8G15x12y0D1Ev();
Name_Map name_map_G15x12y0[] = {
  NSPAIR(_ZN8G15x12y0C1Ev),
  NSPAIR(_ZN8G15x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x12;
extern VTBL_ENTRY _ZTI6E15x12[];
extern  VTBL_ENTRY _ZTV6E15x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x12y0[] = {
  // 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_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_E15x12,    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 _ZTI8G15x12y0[];
extern void _ZN6E15x123fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn28_N6E15x123fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn56_N6E15x123fooEv,_ZThn36_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x12y0[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x12y0[0]),
  (VTBL_ENTRY)&_ZN6E15x123fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G15x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G15x12y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
  ABISELECT(-56,-36),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G15x12y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
extern VTBL_ENTRY _ZTV8G15x12y0[];
extern void _ZN6E15x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x12__8G15x12y0[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&_ZN6E15x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C156E15x12__8G15x12y0[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C156E15x12__8G15x12y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C156E15x12__8G15x12y0[] = {
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn28_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x12__8G15x12y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn56_N6E15x123fooEv,_ZThn36_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x12__8G15x12y0[] = {
  ABISELECT(-56,-36),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
static  VTT_ENTRY vtt_G15x12y0[] = {
  {&(_ZTV8G15x12y0[4]),  4,16},
  {&(_tg__ZTV6E15x12__8G15x12y0[4]),  4,5},
  {&(_tg__ZTV3C156E15x12__8G15x12y0[4]),  4,4},
  {&(_tg__ZTV2A1__3C156E15x12__8G15x12y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C156E15x12__8G15x12y0[3]),  3,4},
  {&(_tg__ZTV2A1__6E15x12__8G15x12y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x12__8G15x12y0[3]),  3,4},
  {&(_ZTV8G15x12y0[11]),  11,16},
  {&(_ZTV8G15x12y0[15]),  15,16},
};
extern VTBL_ENTRY _ZTI8G15x12y0[];
extern  VTBL_ENTRY _ZTV8G15x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x12y0[];
static VTBL_ENTRY alt_thunk_names63[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E15x123fooEv,_ZThn36_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn28_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E15x123fooEv,_ZThn36_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn28_N6E15x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x12y0 = {  "G15x12y0", // class name
  bases_G15x12y0, 6,
  &(vtc_G15x12y0[0]), // expected_vtbl_contents
  &(vtt_G15x12y0[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G15x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x12y0),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x12y0),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  G15x12y1  : virtual E15x12 , F1 {
  int ff;
  ~G15x12y1(); // tgen
  G15x12y1(); // tgen
};
//SIG(1 G15x12y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G15x12y1 ::~G15x12y1(){ note_dtor("G15x12y1", this);} // tgen
G15x12y1 ::G15x12y1(){ note_ctor("G15x12y1", this);} // tgen

static void Test_G15x12y1()
{
  extern Class_Descriptor cd_G15x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x12y1, buf);
    G15x12y1 *dp, &lv = *(dp=new (buf) G15x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x12y1)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x12*), ABISELECT(40,28), "G15x12y1");
    check_base_class_offset(lv, (B1*)(C15*)(E15x12*), ABISELECT(56,36), "G15x12y1");
    check_base_class_offset(lv, (C15*)(E15x12*), ABISELECT(16,12), "G15x12y1");
    check_base_class_offset(lv, (D0*)(E15x12*), ABISELECT(28,20), "G15x12y1");
    check_base_class_offset(lv, (E15x12*), ABISELECT(16,12), "G15x12y1");
    check_base_class_offset(lv, (F1*), 0, "G15x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x12y1.ff");
    test_class_info(&lv, &cd_G15x12y1);
    dp->~G15x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x12y1(Test_G15x12y1, "G15x12y1", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G15x12y1C1Ev();
extern void _ZN8G15x12y1D1Ev();
Name_Map name_map_G15x12y1[] = {
  NSPAIR(_ZN8G15x12y1C1Ev),
  NSPAIR(_ZN8G15x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x12;
extern VTBL_ENTRY _ZTI6E15x12[];
extern  VTBL_ENTRY _ZTV6E15x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x12y1[] = {
  // 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_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_E15x12,    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 _ZTI8G15x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E15x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn16_N6E15x123fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn24_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x12y1[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(40,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G15x12y1[0]),
  (VTBL_ENTRY)&_ZN6E15x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G15x12y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G15x12y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
extern VTBL_ENTRY _ZTV8G15x12y1[];
extern void _ZN6E15x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x12__8G15x12y1[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&_ZN6E15x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C156E15x12__8G15x12y1[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C156E15x12__8G15x12y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C156E15x12__8G15x12y1[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn16_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x12__8G15x12y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn24_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x12__8G15x12y1[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
static  VTT_ENTRY vtt_G15x12y1[] = {
  {&(_ZTV8G15x12y1[5]),  5,20},
  {&(_ZTV8G15x12y1[11]),  11,20},
  {&(_ZTV8G15x12y1[15]),  15,20},
  {&(_ZTV8G15x12y1[19]),  19,20},
  {&(_tg__ZTV6E15x12__8G15x12y1[4]),  4,5},
  {&(_tg__ZTV3C156E15x12__8G15x12y1[4]),  4,4},
  {&(_tg__ZTV2A1__3C156E15x12__8G15x12y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C156E15x12__8G15x12y1[3]),  3,4},
  {&(_tg__ZTV2A1__6E15x12__8G15x12y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x12__8G15x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x12y1[];
extern  VTBL_ENTRY _ZTV8G15x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x12y1[];
static VTBL_ENTRY alt_thunk_names64[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn24_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn16_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn24_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn16_N6E15x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x12y1 = {  "G15x12y1", // class name
  bases_G15x12y1, 6,
  &(vtc_G15x12y1[0]), // expected_vtbl_contents
  &(vtt_G15x12y1[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G15x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x12y1),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x12y1),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  G15x12y2  : E15x12 , virtual F1 {
  int ff;
  ~G15x12y2(); // tgen
  G15x12y2(); // tgen
};
//SIG(1 G15x12y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G15x12y2 ::~G15x12y2(){ note_dtor("G15x12y2", this);} // tgen
G15x12y2 ::G15x12y2(){ note_ctor("G15x12y2", this);} // tgen

static void Test_G15x12y2()
{
  extern Class_Descriptor cd_G15x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x12y2, buf);
    G15x12y2 *dp, &lv = *(dp=new (buf) G15x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x12y2)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x12*), ABISELECT(24,20), "G15x12y2");
    check_base_class_offset(lv, (B1*)(C15*)(E15x12*), ABISELECT(40,28), "G15x12y2");
    check_base_class_offset(lv, (C15*)(E15x12*), 0, "G15x12y2");
    check_base_class_offset(lv, (D0*)(E15x12*), ABISELECT(12,8), "G15x12y2");
    check_base_class_offset(lv, (E15x12*), 0, "G15x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G15x12y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G15x12y2.ff");
    test_class_info(&lv, &cd_G15x12y2);
    dp->~G15x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x12y2(Test_G15x12y2, "G15x12y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G15x12y2C1Ev();
extern void _ZN8G15x12y2D1Ev();
Name_Map name_map_G15x12y2[] = {
  NSPAIR(_ZN8G15x12y2C1Ev),
  NSPAIR(_ZN8G15x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x12;
extern VTBL_ENTRY _ZTI6E15x12[];
extern  VTBL_ENTRY _ZTV6E15x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x12y2[] = {
  // 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_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_E15x12,    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 _ZTI8G15x12y2[];
extern void _ZN6E15x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn20_N6E15x123fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn28_N6E15x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G15x12y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x12y2[0]),
  (VTBL_ENTRY)&_ZN6E15x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G15x12y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G15x12y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G15x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G15x12y2[];
extern void _ZN6E15x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x12__8G15x12y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&_ZN6E15x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C156E15x12__8G15x12y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C156E15x12__8G15x12y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C156E15x12__8G15x12y2[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn20_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x12__8G15x12y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn28_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x12__8G15x12y2[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
static  VTT_ENTRY vtt_G15x12y2[] = {
  {&(_ZTV8G15x12y2[5]),  5,18},
  {&(_tg__ZTV6E15x12__8G15x12y2[4]),  4,5},
  {&(_tg__ZTV3C156E15x12__8G15x12y2[4]),  4,4},
  {&(_tg__ZTV2A1__3C156E15x12__8G15x12y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C156E15x12__8G15x12y2[3]),  3,4},
  {&(_tg__ZTV2A1__6E15x12__8G15x12y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x12__8G15x12y2[3]),  3,4},
  {&(_ZTV8G15x12y2[9]),  9,18},
  {&(_ZTV8G15x12y2[13]),  13,18},
  {&(_ZTV8G15x12y2[17]),  17,18},
};
extern VTBL_ENTRY _ZTI8G15x12y2[];
extern  VTBL_ENTRY _ZTV8G15x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x12y2[];
static VTBL_ENTRY alt_thunk_names65[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn28_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn20_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn28_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn20_N6E15x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x12y2 = {  "G15x12y2", // class name
  bases_G15x12y2, 6,
  &(vtc_G15x12y2[0]), // expected_vtbl_contents
  &(vtt_G15x12y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G15x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x12y2),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x12y2),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  G15x12y3  : virtual E15x12 , virtual F1 {
  int ff;
  ~G15x12y3(); // tgen
  G15x12y3(); // tgen
};
//SIG(1 G15x12y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G15x12y3 ::~G15x12y3(){ note_dtor("G15x12y3", this);} // tgen
G15x12y3 ::G15x12y3(){ note_ctor("G15x12y3", this);} // tgen

static void Test_G15x12y3()
{
  extern Class_Descriptor cd_G15x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G15x12y3, buf);
    G15x12y3 *dp, &lv = *(dp=new (buf) G15x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G15x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x12y3)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x12*), ABISELECT(40,24), "G15x12y3");
    check_base_class_offset(lv, (B1*)(C15*)(E15x12*), ABISELECT(56,32), "G15x12y3");
    check_base_class_offset(lv, (C15*)(E15x12*), ABISELECT(16,8), "G15x12y3");
    check_base_class_offset(lv, (D0*)(E15x12*), ABISELECT(28,16), "G15x12y3");
    check_base_class_offset(lv, (E15x12*), ABISELECT(16,8), "G15x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(72,40), "G15x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G15x12y3.ff");
    test_class_info(&lv, &cd_G15x12y3);
    dp->~G15x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x12y3(Test_G15x12y3, "G15x12y3", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN8G15x12y3C1Ev();
extern void _ZN8G15x12y3D1Ev();
Name_Map name_map_G15x12y3[] = {
  NSPAIR(_ZN8G15x12y3C1Ev),
  NSPAIR(_ZN8G15x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x12;
extern VTBL_ENTRY _ZTI6E15x12[];
extern  VTBL_ENTRY _ZTV6E15x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x12y3[] = {
  // 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_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_E15x12,    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 _ZTI8G15x12y3[];
extern void _ZN6E15x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn16_N6E15x123fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn24_N6E15x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G15x12y3[] = {
  ABISELECT(72,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x12y3[0]),
  0,
  ABISELECT(40,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G15x12y3[0]),
  (VTBL_ENTRY)&_ZN6E15x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G15x12y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI8G15x12y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
  0,
  ABISELECT(-72,-40),
  (VTBL_ENTRY)&(_ZTI8G15x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G15x12y3[];
extern void _ZN6E15x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x12__8G15x12y3[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&_ZN6E15x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C156E15x12__8G15x12y3[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C156E15x12__8G15x12y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C156E15x12__8G15x12y3[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn16_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x12__8G15x12y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn24_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x12__8G15x12y3[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
static  VTT_ENTRY vtt_G15x12y3[] = {
  {&(_ZTV8G15x12y3[6]),  6,24},
  {&(_ZTV8G15x12y3[11]),  11,24},
  {&(_ZTV8G15x12y3[15]),  15,24},
  {&(_ZTV8G15x12y3[19]),  19,24},
  {&(_ZTV8G15x12y3[23]),  23,24},
  {&(_tg__ZTV6E15x12__8G15x12y3[4]),  4,5},
  {&(_tg__ZTV3C156E15x12__8G15x12y3[4]),  4,4},
  {&(_tg__ZTV2A1__3C156E15x12__8G15x12y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C156E15x12__8G15x12y3[3]),  3,4},
  {&(_tg__ZTV2A1__6E15x12__8G15x12y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x12__8G15x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x12y3[];
extern  VTBL_ENTRY _ZTV8G15x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x12y3[];
static VTBL_ENTRY alt_thunk_names66[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn24_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn16_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn24_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn16_N6E15x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x12y3 = {  "G15x12y3", // class name
  bases_G15x12y3, 6,
  &(vtc_G15x12y3[0]), // expected_vtbl_contents
  &(vtt_G15x12y3[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI8G15x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x12y3),24, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x12y3),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  G15x12y4  : E15x12 , F0 {
  int ff;
  ~G15x12y4(); // tgen
  G15x12y4(); // tgen
};
//SIG(1 G15x12y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G15x12y4 ::~G15x12y4(){ note_dtor("G15x12y4", this);} // tgen
G15x12y4 ::G15x12y4(){ note_ctor("G15x12y4", this);} // tgen

static void Test_G15x12y4()
{
  extern Class_Descriptor cd_G15x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G15x12y4, buf);
    G15x12y4 *dp, &lv = *(dp=new (buf) G15x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G15x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x12y4)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x12*), ABISELECT(32,24), "G15x12y4");
    check_base_class_offset(lv, (B1*)(C15*)(E15x12*), ABISELECT(48,32), "G15x12y4");
    check_base_class_offset(lv, (C15*)(E15x12*), 0, "G15x12y4");
    check_base_class_offset(lv, (D0*)(E15x12*), ABISELECT(12,8), "G15x12y4");
    check_base_class_offset(lv, (E15x12*), 0, "G15x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G15x12y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G15x12y4.ff");
    test_class_info(&lv, &cd_G15x12y4);
    dp->~G15x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x12y4(Test_G15x12y4, "G15x12y4", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G15x12y4C1Ev();
extern void _ZN8G15x12y4D1Ev();
Name_Map name_map_G15x12y4[] = {
  NSPAIR(_ZN8G15x12y4C1Ev),
  NSPAIR(_ZN8G15x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x12;
extern VTBL_ENTRY _ZTI6E15x12[];
extern  VTBL_ENTRY _ZTV6E15x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x12y4[] = {
  // 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_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_E15x12,    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 _ZTI8G15x12y4[];
extern void _ZN6E15x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn32_N6E15x123fooEv,_ZThn24_N6E15x123fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn48_N6E15x123fooEv,_ZThn32_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x12y4[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x12y4[0]),
  (VTBL_ENTRY)&_ZN6E15x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G15x12y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G15x12y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
extern VTBL_ENTRY _ZTV8G15x12y4[];
extern void _ZN6E15x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x12__8G15x12y4[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&_ZN6E15x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C156E15x12__8G15x12y4[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C156E15x12__8G15x12y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C156E15x12__8G15x12y4[] = {
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn32_N6E15x123fooEv,_ZThn24_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x12__8G15x12y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn48_N6E15x123fooEv,_ZThn32_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x12__8G15x12y4[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
static  VTT_ENTRY vtt_G15x12y4[] = {
  {&(_ZTV8G15x12y4[4]),  4,13},
  {&(_tg__ZTV6E15x12__8G15x12y4[4]),  4,5},
  {&(_tg__ZTV3C156E15x12__8G15x12y4[4]),  4,4},
  {&(_tg__ZTV2A1__3C156E15x12__8G15x12y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C156E15x12__8G15x12y4[3]),  3,4},
  {&(_tg__ZTV2A1__6E15x12__8G15x12y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x12__8G15x12y4[3]),  3,4},
  {&(_ZTV8G15x12y4[8]),  8,13},
  {&(_ZTV8G15x12y4[12]),  12,13},
};
extern VTBL_ENTRY _ZTI8G15x12y4[];
extern  VTBL_ENTRY _ZTV8G15x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x12y4[];
static VTBL_ENTRY alt_thunk_names67[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x123fooEv,_ZThn32_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x123fooEv,_ZThn24_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x123fooEv,_ZThn32_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x123fooEv,_ZThn24_N6E15x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x12y4 = {  "G15x12y4", // class name
  bases_G15x12y4, 6,
  &(vtc_G15x12y4[0]), // expected_vtbl_contents
  &(vtt_G15x12y4[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G15x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x12y4),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x12y4),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  G15x12y5  : virtual E15x12 , F0 {
  int ff;
  ~G15x12y5(); // tgen
  G15x12y5(); // tgen
};
//SIG(1 G15x12y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G15x12y5 ::~G15x12y5(){ note_dtor("G15x12y5", this);} // tgen
G15x12y5 ::G15x12y5(){ note_ctor("G15x12y5", this);} // tgen

static void Test_G15x12y5()
{
  extern Class_Descriptor cd_G15x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x12y5, buf);
    G15x12y5 *dp, &lv = *(dp=new (buf) G15x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x12y5)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x12*), ABISELECT(40,28), "G15x12y5");
    check_base_class_offset(lv, (B1*)(C15*)(E15x12*), ABISELECT(56,36), "G15x12y5");
    check_base_class_offset(lv, (C15*)(E15x12*), ABISELECT(16,12), "G15x12y5");
    check_base_class_offset(lv, (D0*)(E15x12*), ABISELECT(28,20), "G15x12y5");
    check_base_class_offset(lv, (E15x12*), ABISELECT(16,12), "G15x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G15x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x12y5.ff");
    test_class_info(&lv, &cd_G15x12y5);
    dp->~G15x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x12y5(Test_G15x12y5, "G15x12y5", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G15x12y5C1Ev();
extern void _ZN8G15x12y5D1Ev();
Name_Map name_map_G15x12y5[] = {
  NSPAIR(_ZN8G15x12y5C1Ev),
  NSPAIR(_ZN8G15x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x12;
extern VTBL_ENTRY _ZTI6E15x12[];
extern  VTBL_ENTRY _ZTV6E15x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x12y5[] = {
  // 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_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_E15x12,    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 _ZTI8G15x12y5[];
extern void _ZN6E15x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn16_N6E15x123fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn24_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x12y5[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x12y5[0]),
  0,
  ABISELECT(40,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G15x12y5[0]),
  (VTBL_ENTRY)&_ZN6E15x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G15x12y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G15x12y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
extern VTBL_ENTRY _ZTV8G15x12y5[];
extern void _ZN6E15x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x12__8G15x12y5[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&_ZN6E15x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C156E15x12__8G15x12y5[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C156E15x12__8G15x12y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C156E15x12__8G15x12y5[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn16_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x12__8G15x12y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn24_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x12__8G15x12y5[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
static  VTT_ENTRY vtt_G15x12y5[] = {
  {&(_ZTV8G15x12y5[5]),  5,19},
  {&(_ZTV8G15x12y5[10]),  10,19},
  {&(_ZTV8G15x12y5[14]),  14,19},
  {&(_ZTV8G15x12y5[18]),  18,19},
  {&(_tg__ZTV6E15x12__8G15x12y5[4]),  4,5},
  {&(_tg__ZTV3C156E15x12__8G15x12y5[4]),  4,4},
  {&(_tg__ZTV2A1__3C156E15x12__8G15x12y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C156E15x12__8G15x12y5[3]),  3,4},
  {&(_tg__ZTV2A1__6E15x12__8G15x12y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x12__8G15x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x12y5[];
extern  VTBL_ENTRY _ZTV8G15x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x12y5[];
static VTBL_ENTRY alt_thunk_names68[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn24_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn16_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn24_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn16_N6E15x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x12y5 = {  "G15x12y5", // class name
  bases_G15x12y5, 6,
  &(vtc_G15x12y5[0]), // expected_vtbl_contents
  &(vtt_G15x12y5[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G15x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x12y5),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x12y5),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  G15x12y6  : E15x12 , virtual F0 {
  int ff;
  ~G15x12y6(); // tgen
  G15x12y6(); // tgen
};
//SIG(1 G15x12y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G15x12y6 ::~G15x12y6(){ note_dtor("G15x12y6", this);} // tgen
G15x12y6 ::G15x12y6(){ note_ctor("G15x12y6", this);} // tgen

static void Test_G15x12y6()
{
  extern Class_Descriptor cd_G15x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G15x12y6, buf);
    G15x12y6 *dp, &lv = *(dp=new (buf) G15x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G15x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x12y6)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x12*), ABISELECT(24,20), "G15x12y6");
    check_base_class_offset(lv, (B1*)(C15*)(E15x12*), ABISELECT(40,28), "G15x12y6");
    check_base_class_offset(lv, (C15*)(E15x12*), 0, "G15x12y6");
    check_base_class_offset(lv, (D0*)(E15x12*), ABISELECT(12,8), "G15x12y6");
    check_base_class_offset(lv, (E15x12*), 0, "G15x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G15x12y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G15x12y6.ff");
    test_class_info(&lv, &cd_G15x12y6);
    dp->~G15x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x12y6(Test_G15x12y6, "G15x12y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G15x12y6C1Ev();
extern void _ZN8G15x12y6D1Ev();
Name_Map name_map_G15x12y6[] = {
  NSPAIR(_ZN8G15x12y6C1Ev),
  NSPAIR(_ZN8G15x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x12;
extern VTBL_ENTRY _ZTI6E15x12[];
extern  VTBL_ENTRY _ZTV6E15x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x12y6[] = {
  // 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_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_E15x12,    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 _ZTI8G15x12y6[];
extern void _ZN6E15x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn20_N6E15x123fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn28_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x12y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x12y6[0]),
  (VTBL_ENTRY)&_ZN6E15x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G15x12y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G15x12y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
extern VTBL_ENTRY _ZTV8G15x12y6[];
extern void _ZN6E15x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x12__8G15x12y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&_ZN6E15x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C156E15x12__8G15x12y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C156E15x12__8G15x12y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C156E15x12__8G15x12y6[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn20_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x12__8G15x12y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn28_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x12__8G15x12y6[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
static  VTT_ENTRY vtt_G15x12y6[] = {
  {&(_ZTV8G15x12y6[5]),  5,14},
  {&(_tg__ZTV6E15x12__8G15x12y6[4]),  4,5},
  {&(_tg__ZTV3C156E15x12__8G15x12y6[4]),  4,4},
  {&(_tg__ZTV2A1__3C156E15x12__8G15x12y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C156E15x12__8G15x12y6[3]),  3,4},
  {&(_tg__ZTV2A1__6E15x12__8G15x12y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x12__8G15x12y6[3]),  3,4},
  {&(_ZTV8G15x12y6[9]),  9,14},
  {&(_ZTV8G15x12y6[13]),  13,14},
};
extern VTBL_ENTRY _ZTI8G15x12y6[];
extern  VTBL_ENTRY _ZTV8G15x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x12y6[];
static VTBL_ENTRY alt_thunk_names69[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn28_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn20_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn28_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn20_N6E15x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x12y6 = {  "G15x12y6", // class name
  bases_G15x12y6, 6,
  &(vtc_G15x12y6[0]), // expected_vtbl_contents
  &(vtt_G15x12y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G15x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x12y6),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x12y6),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  G15x12y7  : virtual E15x12 , virtual F0 {
  int ff;
  ~G15x12y7(); // tgen
  G15x12y7(); // tgen
};
//SIG(1 G15x12y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G15x12y7 ::~G15x12y7(){ note_dtor("G15x12y7", this);} // tgen
G15x12y7 ::G15x12y7(){ note_ctor("G15x12y7", this);} // tgen

static void Test_G15x12y7()
{
  extern Class_Descriptor cd_G15x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x12y7, buf);
    G15x12y7 *dp, &lv = *(dp=new (buf) G15x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x12y7)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x12*), ABISELECT(40,24), "G15x12y7");
    check_base_class_offset(lv, (B1*)(C15*)(E15x12*), ABISELECT(56,32), "G15x12y7");
    check_base_class_offset(lv, (C15*)(E15x12*), ABISELECT(16,8), "G15x12y7");
    check_base_class_offset(lv, (D0*)(E15x12*), ABISELECT(28,16), "G15x12y7");
    check_base_class_offset(lv, (E15x12*), ABISELECT(16,8), "G15x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(68,40), "G15x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G15x12y7.ff");
    test_class_info(&lv, &cd_G15x12y7);
    dp->~G15x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x12y7(Test_G15x12y7, "G15x12y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G15x12y7C1Ev();
extern void _ZN8G15x12y7D1Ev();
Name_Map name_map_G15x12y7[] = {
  NSPAIR(_ZN8G15x12y7C1Ev),
  NSPAIR(_ZN8G15x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x12;
extern VTBL_ENTRY _ZTI6E15x12[];
extern  VTBL_ENTRY _ZTV6E15x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x12y7[] = {
  // 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_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_E15x12,    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 _ZTI8G15x12y7[];
extern void _ZN6E15x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn16_N6E15x123fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn24_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x12y7[] = {
  ABISELECT(68,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x12y7[0]),
  0,
  ABISELECT(40,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G15x12y7[0]),
  (VTBL_ENTRY)&_ZN6E15x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G15x12y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI8G15x12y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
extern VTBL_ENTRY _ZTV8G15x12y7[];
extern void _ZN6E15x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x12__8G15x12y7[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&_ZN6E15x123fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C156E15x12__8G15x12y7[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C156E15x12__8G15x12y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C156E15x12__8G15x12y7[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn16_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x12__8G15x12y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv)();
extern void ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn24_N6E15x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x12__8G15x12y7[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E15x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv),
};
static  VTT_ENTRY vtt_G15x12y7[] = {
  {&(_ZTV8G15x12y7[6]),  6,20},
  {&(_ZTV8G15x12y7[11]),  11,20},
  {&(_ZTV8G15x12y7[15]),  15,20},
  {&(_ZTV8G15x12y7[19]),  19,20},
  {&(_tg__ZTV6E15x12__8G15x12y7[4]),  4,5},
  {&(_tg__ZTV3C156E15x12__8G15x12y7[4]),  4,4},
  {&(_tg__ZTV2A1__3C156E15x12__8G15x12y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C156E15x12__8G15x12y7[3]),  3,4},
  {&(_tg__ZTV2A1__6E15x12__8G15x12y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x12__8G15x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x12y7[];
extern  VTBL_ENTRY _ZTV8G15x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x12y7[];
static VTBL_ENTRY alt_thunk_names70[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x123fooEv,_ZTv0_n12_N6E15x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn24_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn16_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x123fooEv,_ZThn24_N6E15x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E15x123fooEv,_ZThn16_N6E15x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x12y7 = {  "G15x12y7", // class name
  bases_G15x12y7, 6,
  &(vtc_G15x12y7[0]), // expected_vtbl_contents
  &(vtt_G15x12y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G15x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x12y7),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x12y7),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  E16x12  : C16 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E16x123fooEv
  ~E16x12(); // tgen
  E16x12(); // tgen
};
//SIG(-1 E16x12) C1{ BC2{ BC3{ Fi} BC4{ Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E16x12 ::foo(){vfunc_called(this, "_ZN6E16x123fooEv");}
E16x12 ::~E16x12(){ note_dtor("E16x12", this);} // tgen
E16x12 ::E16x12(){ note_ctor("E16x12", this);} // tgen

static void Test_E16x12()
{
  extern Class_Descriptor cd_E16x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E16x12, buf);
    E16x12 *dp, &lv = *(dp=new (buf) E16x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E16x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E16x12)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(8,4), "E16x12");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(12,8), "E16x12");
    check_base_class_offset(lv, (C16*), 0, "E16x12");
    check_base_class_offset(lv, (D0*), ABISELECT(20,16), "E16x12");
    check_field_offset(lv, fd, ABISELECT(24,20), "E16x12.fd");
    test_class_info(&lv, &cd_E16x12);
    dp->~E16x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE16x12(Test_E16x12, "E16x12", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6E16x12C1Ev();
extern void _ZN6E16x12D1Ev();
Name_Map name_map_E16x12[] = {
  NSPAIR(_ZN6E16x12C1Ev),
  NSPAIR(_ZN6E16x12D1Ev),
  {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_E16x12[] = {
  // 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(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 _ZTI6E16x12[];
extern void _ZN6E16x123fooEv();
static  VTBL_ENTRY vtc_E16x12[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6E16x12[0]),
  (VTBL_ENTRY)&_ZN6E16x123fooEv,
};
extern VTBL_ENTRY _ZTI6E16x12[];
extern  VTBL_ENTRY _ZTV6E16x12[];
Class_Descriptor cd_E16x12 = {  "E16x12", // class name
  bases_E16x12, 4,
  &(vtc_E16x12[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6E16x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E16x12),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  G16x12y0  : E16x12 , F1 {
  int ff;
  ~G16x12y0(); // tgen
  G16x12y0(); // tgen
};
//SIG(1 G16x12y0) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G16x12y0 ::~G16x12y0(){ note_dtor("G16x12y0", this);} // tgen
G16x12y0 ::G16x12y0(){ note_ctor("G16x12y0", this);} // tgen

static void Test_G16x12y0()
{
  extern Class_Descriptor cd_G16x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x12y0, buf);
    G16x12y0 *dp, &lv = *(dp=new (buf) G16x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x12y0)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x12*), ABISELECT(8,4), "G16x12y0");
    check_base_class_offset(lv, (B0*)(C16*)(E16x12*), ABISELECT(12,8), "G16x12y0");
    check_base_class_offset(lv, (C16*)(E16x12*), 0, "G16x12y0");
    check_base_class_offset(lv, (D0*)(E16x12*), ABISELECT(20,16), "G16x12y0");
    check_base_class_offset(lv, (E16x12*), 0, "G16x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(32,24), "G16x12y0");
    check_field_offset(lv, ff, ABISELECT(44,32), "G16x12y0.ff");
    test_class_info(&lv, &cd_G16x12y0);
    dp->~G16x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x12y0(Test_G16x12y0, "G16x12y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G16x12y0C1Ev();
extern void _ZN8G16x12y0D1Ev();
Name_Map name_map_G16x12y0[] = {
  NSPAIR(_ZN8G16x12y0C1Ev),
  NSPAIR(_ZN8G16x12y0D1Ev),
  {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_E16x12;
extern VTBL_ENTRY _ZTI6E16x12[];
extern  VTBL_ENTRY _ZTV6E16x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x12y0[] = {
  // 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_E16x12,    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_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 _ZTI8G16x12y0[];
extern void _ZN6E16x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x12y0[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8G16x12y0[0]),
  (VTBL_ENTRY)&_ZN6E16x123fooEv,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G16x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTI8G16x12y0[];
extern  VTBL_ENTRY _ZTV8G16x12y0[];
Class_Descriptor cd_G16x12y0 = {  "G16x12y0", // class name
  bases_G16x12y0, 6,
  &(vtc_G16x12y0[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G16x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x12y0),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  G16x12y1  : virtual E16x12 , F1 {
  int ff;
  ~G16x12y1(); // tgen
  G16x12y1(); // tgen
};
//SIG(1 G16x12y1) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G16x12y1 ::~G16x12y1(){ note_dtor("G16x12y1", this);} // tgen
G16x12y1 ::G16x12y1(){ note_ctor("G16x12y1", this);} // tgen

static void Test_G16x12y1()
{
  extern Class_Descriptor cd_G16x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x12y1, buf);
    G16x12y1 *dp, &lv = *(dp=new (buf) G16x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x12y1)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x12*), ABISELECT(24,16), "G16x12y1");
    check_base_class_offset(lv, (B0*)(C16*)(E16x12*), ABISELECT(28,20), "G16x12y1");
    check_base_class_offset(lv, (C16*)(E16x12*), ABISELECT(16,12), "G16x12y1");
    check_base_class_offset(lv, (D0*)(E16x12*), ABISELECT(36,28), "G16x12y1");
    check_base_class_offset(lv, (E16x12*), ABISELECT(16,12), "G16x12y1");
    check_base_class_offset(lv, (F1*), 0, "G16x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x12y1.ff");
    test_class_info(&lv, &cd_G16x12y1);
    dp->~G16x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x12y1(Test_G16x12y1, "G16x12y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G16x12y1C1Ev();
extern void _ZN8G16x12y1D1Ev();
Name_Map name_map_G16x12y1[] = {
  NSPAIR(_ZN8G16x12y1C1Ev),
  NSPAIR(_ZN8G16x12y1D1Ev),
  {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_E16x12;
extern VTBL_ENTRY _ZTI6E16x12[];
extern  VTBL_ENTRY _ZTV6E16x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x12y1[] = {
  // 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(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_E16x12,    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
    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 _ZTI8G16x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E16x123fooEv();
static  VTBL_ENTRY vtc_G16x12y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G16x12y1[0]),
  (VTBL_ENTRY)&_ZN6E16x123fooEv,
};
extern VTBL_ENTRY _ZTV8G16x12y1[];
static  VTT_ENTRY vtt_G16x12y1[] = {
  {&(_ZTV8G16x12y1[3]),  3,8},
  {&(_ZTV8G16x12y1[7]),  7,8},
};
extern VTBL_ENTRY _ZTI8G16x12y1[];
extern  VTBL_ENTRY _ZTV8G16x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x12y1[];
Class_Descriptor cd_G16x12y1 = {  "G16x12y1", // class name
  bases_G16x12y1, 6,
  &(vtc_G16x12y1[0]), // expected_vtbl_contents
  &(vtt_G16x12y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G16x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x12y1),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x12y1),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  G16x12y2  : E16x12 , virtual F1 {
  int ff;
  ~G16x12y2(); // tgen
  G16x12y2(); // tgen
};
//SIG(1 G16x12y2) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G16x12y2 ::~G16x12y2(){ note_dtor("G16x12y2", this);} // tgen
G16x12y2 ::G16x12y2(){ note_ctor("G16x12y2", this);} // tgen

static void Test_G16x12y2()
{
  extern Class_Descriptor cd_G16x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x12y2, buf);
    G16x12y2 *dp, &lv = *(dp=new (buf) G16x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x12y2)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x12*), ABISELECT(8,4), "G16x12y2");
    check_base_class_offset(lv, (B0*)(C16*)(E16x12*), ABISELECT(12,8), "G16x12y2");
    check_base_class_offset(lv, (C16*)(E16x12*), 0, "G16x12y2");
    check_base_class_offset(lv, (D0*)(E16x12*), ABISELECT(20,16), "G16x12y2");
    check_base_class_offset(lv, (E16x12*), 0, "G16x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G16x12y2");
    check_field_offset(lv, ff, ABISELECT(28,24), "G16x12y2.ff");
    test_class_info(&lv, &cd_G16x12y2);
    dp->~G16x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x12y2(Test_G16x12y2, "G16x12y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G16x12y2C1Ev();
extern void _ZN8G16x12y2D1Ev();
Name_Map name_map_G16x12y2[] = {
  NSPAIR(_ZN8G16x12y2C1Ev),
  NSPAIR(_ZN8G16x12y2D1Ev),
  {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_E16x12;
extern VTBL_ENTRY _ZTI6E16x12[];
extern  VTBL_ENTRY _ZTV6E16x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x12y2[] = {
  // 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_E16x12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI8G16x12y2[];
extern void _ZN6E16x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x12y2[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x12y2[0]),
  (VTBL_ENTRY)&_ZN6E16x123fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G16x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G16x12y2[];
static  VTT_ENTRY vtt_G16x12y2[] = {
  {&(_ZTV8G16x12y2[3]),  3,8},
  {&(_ZTV8G16x12y2[7]),  7,8},
};
extern VTBL_ENTRY _ZTI8G16x12y2[];
extern  VTBL_ENTRY _ZTV8G16x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x12y2[];
Class_Descriptor cd_G16x12y2 = {  "G16x12y2", // class name
  bases_G16x12y2, 6,
  &(vtc_G16x12y2[0]), // expected_vtbl_contents
  &(vtt_G16x12y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G16x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x12y2),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x12y2),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  G16x12y3  : virtual E16x12 , virtual F1 {
  int ff;
  ~G16x12y3(); // tgen
  G16x12y3(); // tgen
};
//SIG(1 G16x12y3) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G16x12y3 ::~G16x12y3(){ note_dtor("G16x12y3", this);} // tgen
G16x12y3 ::G16x12y3(){ note_ctor("G16x12y3", this);} // tgen

static void Test_G16x12y3()
{
  extern Class_Descriptor cd_G16x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G16x12y3, buf);
    G16x12y3 *dp, &lv = *(dp=new (buf) G16x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G16x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x12y3)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x12*), ABISELECT(24,12), "G16x12y3");
    check_base_class_offset(lv, (B0*)(C16*)(E16x12*), ABISELECT(28,16), "G16x12y3");
    check_base_class_offset(lv, (C16*)(E16x12*), ABISELECT(16,8), "G16x12y3");
    check_base_class_offset(lv, (D0*)(E16x12*), ABISELECT(36,24), "G16x12y3");
    check_base_class_offset(lv, (E16x12*), ABISELECT(16,8), "G16x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G16x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G16x12y3.ff");
    test_class_info(&lv, &cd_G16x12y3);
    dp->~G16x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x12y3(Test_G16x12y3, "G16x12y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G16x12y3C1Ev();
extern void _ZN8G16x12y3D1Ev();
Name_Map name_map_G16x12y3[] = {
  NSPAIR(_ZN8G16x12y3C1Ev),
  NSPAIR(_ZN8G16x12y3D1Ev),
  {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_E16x12;
extern VTBL_ENTRY _ZTI6E16x12[];
extern  VTBL_ENTRY _ZTV6E16x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x12y3[] = {
  // 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(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_E16x12,    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_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 _ZTI8G16x12y3[];
extern void _ZN6E16x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x12y3[] = {
  ABISELECT(48,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x12y3[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G16x12y3[0]),
  (VTBL_ENTRY)&_ZN6E16x123fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G16x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G16x12y3[];
static  VTT_ENTRY vtt_G16x12y3[] = {
  {&(_ZTV8G16x12y3[4]),  4,12},
  {&(_ZTV8G16x12y3[7]),  7,12},
  {&(_ZTV8G16x12y3[11]),  11,12},
};
extern VTBL_ENTRY _ZTI8G16x12y3[];
extern  VTBL_ENTRY _ZTV8G16x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x12y3[];
Class_Descriptor cd_G16x12y3 = {  "G16x12y3", // class name
  bases_G16x12y3, 6,
  &(vtc_G16x12y3[0]), // expected_vtbl_contents
  &(vtt_G16x12y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G16x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x12y3),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x12y3),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  G16x12y4  : E16x12 , F0 {
  int ff;
  ~G16x12y4(); // tgen
  G16x12y4(); // tgen
};
//SIG(1 G16x12y4) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G16x12y4 ::~G16x12y4(){ note_dtor("G16x12y4", this);} // tgen
G16x12y4 ::G16x12y4(){ note_ctor("G16x12y4", this);} // tgen

static void Test_G16x12y4()
{
  extern Class_Descriptor cd_G16x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G16x12y4, buf);
    G16x12y4 *dp, &lv = *(dp=new (buf) G16x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G16x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x12y4)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x12*), ABISELECT(8,4), "G16x12y4");
    check_base_class_offset(lv, (B0*)(C16*)(E16x12*), ABISELECT(12,8), "G16x12y4");
    check_base_class_offset(lv, (C16*)(E16x12*), 0, "G16x12y4");
    check_base_class_offset(lv, (D0*)(E16x12*), ABISELECT(20,16), "G16x12y4");
    check_base_class_offset(lv, (E16x12*), 0, "G16x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(28,24), "G16x12y4");
    check_field_offset(lv, ff, ABISELECT(32,28), "G16x12y4.ff");
    test_class_info(&lv, &cd_G16x12y4);
    dp->~G16x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x12y4(Test_G16x12y4, "G16x12y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G16x12y4C1Ev();
extern void _ZN8G16x12y4D1Ev();
Name_Map name_map_G16x12y4[] = {
  NSPAIR(_ZN8G16x12y4C1Ev),
  NSPAIR(_ZN8G16x12y4D1Ev),
  {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_E16x12;
extern VTBL_ENTRY _ZTI6E16x12[];
extern  VTBL_ENTRY _ZTV6E16x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x12y4[] = {
  // 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_E16x12,    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_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 _ZTI8G16x12y4[];
extern void _ZN6E16x123fooEv();
static  VTBL_ENTRY vtc_G16x12y4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8G16x12y4[0]),
  (VTBL_ENTRY)&_ZN6E16x123fooEv,
};
extern VTBL_ENTRY _ZTI8G16x12y4[];
extern  VTBL_ENTRY _ZTV8G16x12y4[];
Class_Descriptor cd_G16x12y4 = {  "G16x12y4", // class name
  bases_G16x12y4, 6,
  &(vtc_G16x12y4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G16x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x12y4),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  G16x12y5  : virtual E16x12 , F0 {
  int ff;
  ~G16x12y5(); // tgen
  G16x12y5(); // tgen
};
//SIG(1 G16x12y5) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G16x12y5 ::~G16x12y5(){ note_dtor("G16x12y5", this);} // tgen
G16x12y5 ::G16x12y5(){ note_ctor("G16x12y5", this);} // tgen

static void Test_G16x12y5()
{
  extern Class_Descriptor cd_G16x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x12y5, buf);
    G16x12y5 *dp, &lv = *(dp=new (buf) G16x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x12y5)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x12*), ABISELECT(24,16), "G16x12y5");
    check_base_class_offset(lv, (B0*)(C16*)(E16x12*), ABISELECT(28,20), "G16x12y5");
    check_base_class_offset(lv, (C16*)(E16x12*), ABISELECT(16,12), "G16x12y5");
    check_base_class_offset(lv, (D0*)(E16x12*), ABISELECT(36,28), "G16x12y5");
    check_base_class_offset(lv, (E16x12*), ABISELECT(16,12), "G16x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G16x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x12y5.ff");
    test_class_info(&lv, &cd_G16x12y5);
    dp->~G16x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x12y5(Test_G16x12y5, "G16x12y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G16x12y5C1Ev();
extern void _ZN8G16x12y5D1Ev();
Name_Map name_map_G16x12y5[] = {
  NSPAIR(_ZN8G16x12y5C1Ev),
  NSPAIR(_ZN8G16x12y5D1Ev),
  {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_E16x12;
extern VTBL_ENTRY _ZTI6E16x12[];
extern  VTBL_ENTRY _ZTV6E16x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x12y5[] = {
  // 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(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_E16x12,    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_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 _ZTI8G16x12y5[];
extern void _ZN6E16x123fooEv();
static  VTBL_ENTRY vtc_G16x12y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x12y5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G16x12y5[0]),
  (VTBL_ENTRY)&_ZN6E16x123fooEv,
};
extern VTBL_ENTRY _ZTV8G16x12y5[];
static  VTT_ENTRY vtt_G16x12y5[] = {
  {&(_ZTV8G16x12y5[3]),  3,7},
  {&(_ZTV8G16x12y5[6]),  6,7},
};
extern VTBL_ENTRY _ZTI8G16x12y5[];
extern  VTBL_ENTRY _ZTV8G16x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x12y5[];
Class_Descriptor cd_G16x12y5 = {  "G16x12y5", // class name
  bases_G16x12y5, 6,
  &(vtc_G16x12y5[0]), // expected_vtbl_contents
  &(vtt_G16x12y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G16x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x12y5),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x12y5),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  G16x12y6  : E16x12 , virtual F0 {
  int ff;
  ~G16x12y6(); // tgen
  G16x12y6(); // tgen
};
//SIG(1 G16x12y6) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G16x12y6 ::~G16x12y6(){ note_dtor("G16x12y6", this);} // tgen
G16x12y6 ::G16x12y6(){ note_ctor("G16x12y6", this);} // tgen

static void Test_G16x12y6()
{
  extern Class_Descriptor cd_G16x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G16x12y6, buf);
    G16x12y6 *dp, &lv = *(dp=new (buf) G16x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G16x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x12y6)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x12*), ABISELECT(8,4), "G16x12y6");
    check_base_class_offset(lv, (B0*)(C16*)(E16x12*), ABISELECT(12,8), "G16x12y6");
    check_base_class_offset(lv, (C16*)(E16x12*), 0, "G16x12y6");
    check_base_class_offset(lv, (D0*)(E16x12*), ABISELECT(20,16), "G16x12y6");
    check_base_class_offset(lv, (E16x12*), 0, "G16x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G16x12y6");
    check_field_offset(lv, ff, ABISELECT(28,24), "G16x12y6.ff");
    test_class_info(&lv, &cd_G16x12y6);
    dp->~G16x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x12y6(Test_G16x12y6, "G16x12y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G16x12y6C1Ev();
extern void _ZN8G16x12y6D1Ev();
Name_Map name_map_G16x12y6[] = {
  NSPAIR(_ZN8G16x12y6C1Ev),
  NSPAIR(_ZN8G16x12y6D1Ev),
  {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_E16x12;
extern VTBL_ENTRY _ZTI6E16x12[];
extern  VTBL_ENTRY _ZTV6E16x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x12y6[] = {
  // 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_E16x12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI8G16x12y6[];
extern void _ZN6E16x123fooEv();
static  VTBL_ENTRY vtc_G16x12y6[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x12y6[0]),
  (VTBL_ENTRY)&_ZN6E16x123fooEv,
};
extern VTBL_ENTRY _ZTV8G16x12y6[];
static  VTT_ENTRY vtt_G16x12y6[] = {
  {&(_ZTV8G16x12y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G16x12y6[];
extern  VTBL_ENTRY _ZTV8G16x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x12y6[];
Class_Descriptor cd_G16x12y6 = {  "G16x12y6", // class name
  bases_G16x12y6, 6,
  &(vtc_G16x12y6[0]), // expected_vtbl_contents
  &(vtt_G16x12y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G16x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x12y6),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x12y6),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  G16x12y7  : virtual E16x12 , virtual F0 {
  int ff;
  ~G16x12y7(); // tgen
  G16x12y7(); // tgen
};
//SIG(1 G16x12y7) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G16x12y7 ::~G16x12y7(){ note_dtor("G16x12y7", this);} // tgen
G16x12y7 ::G16x12y7(){ note_ctor("G16x12y7", this);} // tgen

static void Test_G16x12y7()
{
  extern Class_Descriptor cd_G16x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x12y7, buf);
    G16x12y7 *dp, &lv = *(dp=new (buf) G16x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x12y7)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x12*), ABISELECT(24,12), "G16x12y7");
    check_base_class_offset(lv, (B0*)(C16*)(E16x12*), ABISELECT(28,16), "G16x12y7");
    check_base_class_offset(lv, (C16*)(E16x12*), ABISELECT(16,8), "G16x12y7");
    check_base_class_offset(lv, (D0*)(E16x12*), ABISELECT(36,24), "G16x12y7");
    check_base_class_offset(lv, (E16x12*), ABISELECT(16,8), "G16x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G16x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G16x12y7.ff");
    test_class_info(&lv, &cd_G16x12y7);
    dp->~G16x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x12y7(Test_G16x12y7, "G16x12y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G16x12y7C1Ev();
extern void _ZN8G16x12y7D1Ev();
Name_Map name_map_G16x12y7[] = {
  NSPAIR(_ZN8G16x12y7C1Ev),
  NSPAIR(_ZN8G16x12y7D1Ev),
  {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_E16x12;
extern VTBL_ENTRY _ZTI6E16x12[];
extern  VTBL_ENTRY _ZTV6E16x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x12y7[] = {
  // 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(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_E16x12,    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_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 _ZTI8G16x12y7[];
extern void _ZN6E16x123fooEv();
static  VTBL_ENTRY vtc_G16x12y7[] = {
  ABISELECT(44,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x12y7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G16x12y7[0]),
  (VTBL_ENTRY)&_ZN6E16x123fooEv,
};
extern VTBL_ENTRY _ZTV8G16x12y7[];
static  VTT_ENTRY vtt_G16x12y7[] = {
  {&(_ZTV8G16x12y7[4]),  4,8},
  {&(_ZTV8G16x12y7[7]),  7,8},
};
extern VTBL_ENTRY _ZTI8G16x12y7[];
extern  VTBL_ENTRY _ZTV8G16x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x12y7[];
Class_Descriptor cd_G16x12y7 = {  "G16x12y7", // class name
  bases_G16x12y7, 6,
  &(vtc_G16x12y7[0]), // expected_vtbl_contents
  &(vtt_G16x12y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G16x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x12y7),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x12y7),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  E17x12  : C17 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E17x123fooEv
  ~E17x12(); // tgen
  E17x12(); // tgen
};
//SIG(-1 E17x12) C1{ BC2{ BC3{ v1 Fi} BC4{ Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E17x12 ::foo(){vfunc_called(this, "_ZN6E17x123fooEv");}
E17x12 ::~E17x12(){ note_dtor("E17x12", this);} // tgen
E17x12 ::E17x12(){ note_ctor("E17x12", this);} // tgen

static void Test_E17x12()
{
  extern Class_Descriptor cd_E17x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E17x12, buf);
    E17x12 *dp, &lv = *(dp=new (buf) E17x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E17x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E17x12)");
    check_base_class_offset(lv, (A1*)(C17*), 0, "E17x12");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(12,8), "E17x12");
    check_base_class_offset(lv, (C17*), 0, "E17x12");
    check_base_class_offset(lv, (D0*), ABISELECT(20,16), "E17x12");
    check_field_offset(lv, fd, ABISELECT(24,20), "E17x12.fd");
    test_class_info(&lv, &cd_E17x12);
    dp->~E17x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE17x12(Test_E17x12, "E17x12", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6E17x12C1Ev();
extern void _ZN6E17x12D1Ev();
Name_Map name_map_E17x12[] = {
  NSPAIR(_ZN6E17x12C1Ev),
  NSPAIR(_ZN6E17x12D1Ev),
  {0,0}
};
extern Class_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_E17x12[] = {
  // 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(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 _ZTI6E17x12[];
extern void _ZN6E17x123fooEv();
static  VTBL_ENTRY vtc_E17x12[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6E17x12[0]),
  (VTBL_ENTRY)&_ZN6E17x123fooEv,
};
extern VTBL_ENTRY _ZTI6E17x12[];
extern  VTBL_ENTRY _ZTV6E17x12[];
Class_Descriptor cd_E17x12 = {  "E17x12", // class name
  bases_E17x12, 4,
  &(vtc_E17x12[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6E17x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E17x12),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  G17x12y0  : E17x12 , F1 {
  int ff;
  ~G17x12y0(); // tgen
  G17x12y0(); // tgen
};
//SIG(1 G17x12y0) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G17x12y0 ::~G17x12y0(){ note_dtor("G17x12y0", this);} // tgen
G17x12y0 ::G17x12y0(){ note_ctor("G17x12y0", this);} // tgen

static void Test_G17x12y0()
{
  extern Class_Descriptor cd_G17x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x12y0, buf);
    G17x12y0 *dp, &lv = *(dp=new (buf) G17x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x12y0)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x12*), 0, "G17x12y0");
    check_base_class_offset(lv, (B0*)(C17*)(E17x12*), ABISELECT(12,8), "G17x12y0");
    check_base_class_offset(lv, (C17*)(E17x12*), 0, "G17x12y0");
    check_base_class_offset(lv, (D0*)(E17x12*), ABISELECT(20,16), "G17x12y0");
    check_base_class_offset(lv, (E17x12*), 0, "G17x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(32,24), "G17x12y0");
    check_field_offset(lv, ff, ABISELECT(44,32), "G17x12y0.ff");
    test_class_info(&lv, &cd_G17x12y0);
    dp->~G17x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x12y0(Test_G17x12y0, "G17x12y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G17x12y0C1Ev();
extern void _ZN8G17x12y0D1Ev();
Name_Map name_map_G17x12y0[] = {
  NSPAIR(_ZN8G17x12y0C1Ev),
  NSPAIR(_ZN8G17x12y0D1Ev),
  {0,0}
};
extern Class_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_E17x12;
extern VTBL_ENTRY _ZTI6E17x12[];
extern  VTBL_ENTRY _ZTV6E17x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x12y0[] = {
  // 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_E17x12,    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_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 _ZTI8G17x12y0[];
extern void _ZN6E17x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x12y0[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8G17x12y0[0]),
  (VTBL_ENTRY)&_ZN6E17x123fooEv,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G17x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTI8G17x12y0[];
extern  VTBL_ENTRY _ZTV8G17x12y0[];
Class_Descriptor cd_G17x12y0 = {  "G17x12y0", // class name
  bases_G17x12y0, 6,
  &(vtc_G17x12y0[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G17x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x12y0),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  G17x12y1  : virtual E17x12 , F1 {
  int ff;
  ~G17x12y1(); // tgen
  G17x12y1(); // tgen
};
//SIG(1 G17x12y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G17x12y1 ::~G17x12y1(){ note_dtor("G17x12y1", this);} // tgen
G17x12y1 ::G17x12y1(){ note_ctor("G17x12y1", this);} // tgen

static void Test_G17x12y1()
{
  extern Class_Descriptor cd_G17x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x12y1, buf);
    G17x12y1 *dp, &lv = *(dp=new (buf) G17x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x12y1)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x12*), ABISELECT(16,12), "G17x12y1");
    check_base_class_offset(lv, (B0*)(C17*)(E17x12*), ABISELECT(28,20), "G17x12y1");
    check_base_class_offset(lv, (C17*)(E17x12*), ABISELECT(16,12), "G17x12y1");
    check_base_class_offset(lv, (D0*)(E17x12*), ABISELECT(36,28), "G17x12y1");
    check_base_class_offset(lv, (E17x12*), ABISELECT(16,12), "G17x12y1");
    check_base_class_offset(lv, (F1*), 0, "G17x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x12y1.ff");
    test_class_info(&lv, &cd_G17x12y1);
    dp->~G17x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x12y1(Test_G17x12y1, "G17x12y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G17x12y1C1Ev();
extern void _ZN8G17x12y1D1Ev();
Name_Map name_map_G17x12y1[] = {
  NSPAIR(_ZN8G17x12y1C1Ev),
  NSPAIR(_ZN8G17x12y1D1Ev),
  {0,0}
};
extern Class_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_E17x12;
extern VTBL_ENTRY _ZTI6E17x12[];
extern  VTBL_ENTRY _ZTV6E17x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x12y1[] = {
  // 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(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_E17x12,    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
    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 _ZTI8G17x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E17x123fooEv();
static  VTBL_ENTRY vtc_G17x12y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G17x12y1[0]),
  (VTBL_ENTRY)&_ZN6E17x123fooEv,
};
extern VTBL_ENTRY _ZTV8G17x12y1[];
static  VTT_ENTRY vtt_G17x12y1[] = {
  {&(_ZTV8G17x12y1[3]),  3,8},
  {&(_ZTV8G17x12y1[7]),  7,8},
};
extern VTBL_ENTRY _ZTI8G17x12y1[];
extern  VTBL_ENTRY _ZTV8G17x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x12y1[];
Class_Descriptor cd_G17x12y1 = {  "G17x12y1", // class name
  bases_G17x12y1, 6,
  &(vtc_G17x12y1[0]), // expected_vtbl_contents
  &(vtt_G17x12y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G17x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x12y1),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x12y1),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  G17x12y2  : E17x12 , virtual F1 {
  int ff;
  ~G17x12y2(); // tgen
  G17x12y2(); // tgen
};
//SIG(1 G17x12y2) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G17x12y2 ::~G17x12y2(){ note_dtor("G17x12y2", this);} // tgen
G17x12y2 ::G17x12y2(){ note_ctor("G17x12y2", this);} // tgen

static void Test_G17x12y2()
{
  extern Class_Descriptor cd_G17x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x12y2, buf);
    G17x12y2 *dp, &lv = *(dp=new (buf) G17x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x12y2)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x12*), 0, "G17x12y2");
    check_base_class_offset(lv, (B0*)(C17*)(E17x12*), ABISELECT(12,8), "G17x12y2");
    check_base_class_offset(lv, (C17*)(E17x12*), 0, "G17x12y2");
    check_base_class_offset(lv, (D0*)(E17x12*), ABISELECT(20,16), "G17x12y2");
    check_base_class_offset(lv, (E17x12*), 0, "G17x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G17x12y2");
    check_field_offset(lv, ff, ABISELECT(28,24), "G17x12y2.ff");
    test_class_info(&lv, &cd_G17x12y2);
    dp->~G17x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x12y2(Test_G17x12y2, "G17x12y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G17x12y2C1Ev();
extern void _ZN8G17x12y2D1Ev();
Name_Map name_map_G17x12y2[] = {
  NSPAIR(_ZN8G17x12y2C1Ev),
  NSPAIR(_ZN8G17x12y2D1Ev),
  {0,0}
};
extern Class_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_E17x12;
extern VTBL_ENTRY _ZTI6E17x12[];
extern  VTBL_ENTRY _ZTV6E17x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x12y2[] = {
  // 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_E17x12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI8G17x12y2[];
extern void _ZN6E17x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x12y2[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x12y2[0]),
  (VTBL_ENTRY)&_ZN6E17x123fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G17x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G17x12y2[];
static  VTT_ENTRY vtt_G17x12y2[] = {
  {&(_ZTV8G17x12y2[3]),  3,8},
  {&(_ZTV8G17x12y2[7]),  7,8},
};
extern VTBL_ENTRY _ZTI8G17x12y2[];
extern  VTBL_ENTRY _ZTV8G17x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x12y2[];
Class_Descriptor cd_G17x12y2 = {  "G17x12y2", // class name
  bases_G17x12y2, 6,
  &(vtc_G17x12y2[0]), // expected_vtbl_contents
  &(vtt_G17x12y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G17x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x12y2),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x12y2),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  G17x12y3  : virtual E17x12 , virtual F1 {
  int ff;
  ~G17x12y3(); // tgen
  G17x12y3(); // tgen
};
//SIG(1 G17x12y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G17x12y3 ::~G17x12y3(){ note_dtor("G17x12y3", this);} // tgen
G17x12y3 ::G17x12y3(){ note_ctor("G17x12y3", this);} // tgen

static void Test_G17x12y3()
{
  extern Class_Descriptor cd_G17x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G17x12y3, buf);
    G17x12y3 *dp, &lv = *(dp=new (buf) G17x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G17x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x12y3)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x12*), ABISELECT(16,8), "G17x12y3");
    check_base_class_offset(lv, (B0*)(C17*)(E17x12*), ABISELECT(28,16), "G17x12y3");
    check_base_class_offset(lv, (C17*)(E17x12*), ABISELECT(16,8), "G17x12y3");
    check_base_class_offset(lv, (D0*)(E17x12*), ABISELECT(36,24), "G17x12y3");
    check_base_class_offset(lv, (E17x12*), ABISELECT(16,8), "G17x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G17x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G17x12y3.ff");
    test_class_info(&lv, &cd_G17x12y3);
    dp->~G17x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x12y3(Test_G17x12y3, "G17x12y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G17x12y3C1Ev();
extern void _ZN8G17x12y3D1Ev();
Name_Map name_map_G17x12y3[] = {
  NSPAIR(_ZN8G17x12y3C1Ev),
  NSPAIR(_ZN8G17x12y3D1Ev),
  {0,0}
};
extern Class_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_E17x12;
extern VTBL_ENTRY _ZTI6E17x12[];
extern  VTBL_ENTRY _ZTV6E17x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x12y3[] = {
  // 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(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_E17x12,    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_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 _ZTI8G17x12y3[];
extern void _ZN6E17x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x12y3[] = {
  ABISELECT(48,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x12y3[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G17x12y3[0]),
  (VTBL_ENTRY)&_ZN6E17x123fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G17x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G17x12y3[];
static  VTT_ENTRY vtt_G17x12y3[] = {
  {&(_ZTV8G17x12y3[4]),  4,12},
  {&(_ZTV8G17x12y3[7]),  7,12},
  {&(_ZTV8G17x12y3[11]),  11,12},
};
extern VTBL_ENTRY _ZTI8G17x12y3[];
extern  VTBL_ENTRY _ZTV8G17x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x12y3[];
Class_Descriptor cd_G17x12y3 = {  "G17x12y3", // class name
  bases_G17x12y3, 6,
  &(vtc_G17x12y3[0]), // expected_vtbl_contents
  &(vtt_G17x12y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G17x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x12y3),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x12y3),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  G17x12y4  : E17x12 , F0 {
  int ff;
  ~G17x12y4(); // tgen
  G17x12y4(); // tgen
};
//SIG(1 G17x12y4) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G17x12y4 ::~G17x12y4(){ note_dtor("G17x12y4", this);} // tgen
G17x12y4 ::G17x12y4(){ note_ctor("G17x12y4", this);} // tgen

static void Test_G17x12y4()
{
  extern Class_Descriptor cd_G17x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G17x12y4, buf);
    G17x12y4 *dp, &lv = *(dp=new (buf) G17x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G17x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x12y4)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x12*), 0, "G17x12y4");
    check_base_class_offset(lv, (B0*)(C17*)(E17x12*), ABISELECT(12,8), "G17x12y4");
    check_base_class_offset(lv, (C17*)(E17x12*), 0, "G17x12y4");
    check_base_class_offset(lv, (D0*)(E17x12*), ABISELECT(20,16), "G17x12y4");
    check_base_class_offset(lv, (E17x12*), 0, "G17x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(28,24), "G17x12y4");
    check_field_offset(lv, ff, ABISELECT(32,28), "G17x12y4.ff");
    test_class_info(&lv, &cd_G17x12y4);
    dp->~G17x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x12y4(Test_G17x12y4, "G17x12y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G17x12y4C1Ev();
extern void _ZN8G17x12y4D1Ev();
Name_Map name_map_G17x12y4[] = {
  NSPAIR(_ZN8G17x12y4C1Ev),
  NSPAIR(_ZN8G17x12y4D1Ev),
  {0,0}
};
extern Class_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_E17x12;
extern VTBL_ENTRY _ZTI6E17x12[];
extern  VTBL_ENTRY _ZTV6E17x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x12y4[] = {
  // 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_E17x12,    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_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 _ZTI8G17x12y4[];
extern void _ZN6E17x123fooEv();
static  VTBL_ENTRY vtc_G17x12y4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8G17x12y4[0]),
  (VTBL_ENTRY)&_ZN6E17x123fooEv,
};
extern VTBL_ENTRY _ZTI8G17x12y4[];
extern  VTBL_ENTRY _ZTV8G17x12y4[];
Class_Descriptor cd_G17x12y4 = {  "G17x12y4", // class name
  bases_G17x12y4, 6,
  &(vtc_G17x12y4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G17x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x12y4),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  G17x12y5  : virtual E17x12 , F0 {
  int ff;
  ~G17x12y5(); // tgen
  G17x12y5(); // tgen
};
//SIG(1 G17x12y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G17x12y5 ::~G17x12y5(){ note_dtor("G17x12y5", this);} // tgen
G17x12y5 ::G17x12y5(){ note_ctor("G17x12y5", this);} // tgen

static void Test_G17x12y5()
{
  extern Class_Descriptor cd_G17x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x12y5, buf);
    G17x12y5 *dp, &lv = *(dp=new (buf) G17x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x12y5)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x12*), ABISELECT(16,12), "G17x12y5");
    check_base_class_offset(lv, (B0*)(C17*)(E17x12*), ABISELECT(28,20), "G17x12y5");
    check_base_class_offset(lv, (C17*)(E17x12*), ABISELECT(16,12), "G17x12y5");
    check_base_class_offset(lv, (D0*)(E17x12*), ABISELECT(36,28), "G17x12y5");
    check_base_class_offset(lv, (E17x12*), ABISELECT(16,12), "G17x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G17x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x12y5.ff");
    test_class_info(&lv, &cd_G17x12y5);
    dp->~G17x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x12y5(Test_G17x12y5, "G17x12y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G17x12y5C1Ev();
extern void _ZN8G17x12y5D1Ev();
Name_Map name_map_G17x12y5[] = {
  NSPAIR(_ZN8G17x12y5C1Ev),
  NSPAIR(_ZN8G17x12y5D1Ev),
  {0,0}
};
extern Class_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_E17x12;
extern VTBL_ENTRY _ZTI6E17x12[];
extern  VTBL_ENTRY _ZTV6E17x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x12y5[] = {
  // 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(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_E17x12,    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_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 _ZTI8G17x12y5[];
extern void _ZN6E17x123fooEv();
static  VTBL_ENTRY vtc_G17x12y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x12y5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G17x12y5[0]),
  (VTBL_ENTRY)&_ZN6E17x123fooEv,
};
extern VTBL_ENTRY _ZTV8G17x12y5[];
static  VTT_ENTRY vtt_G17x12y5[] = {
  {&(_ZTV8G17x12y5[3]),  3,7},
  {&(_ZTV8G17x12y5[6]),  6,7},
};
extern VTBL_ENTRY _ZTI8G17x12y5[];
extern  VTBL_ENTRY _ZTV8G17x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x12y5[];
Class_Descriptor cd_G17x12y5 = {  "G17x12y5", // class name
  bases_G17x12y5, 6,
  &(vtc_G17x12y5[0]), // expected_vtbl_contents
  &(vtt_G17x12y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G17x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x12y5),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x12y5),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  G17x12y6  : E17x12 , virtual F0 {
  int ff;
  ~G17x12y6(); // tgen
  G17x12y6(); // tgen
};
//SIG(1 G17x12y6) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G17x12y6 ::~G17x12y6(){ note_dtor("G17x12y6", this);} // tgen
G17x12y6 ::G17x12y6(){ note_ctor("G17x12y6", this);} // tgen

static void Test_G17x12y6()
{
  extern Class_Descriptor cd_G17x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G17x12y6, buf);
    G17x12y6 *dp, &lv = *(dp=new (buf) G17x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G17x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x12y6)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x12*), 0, "G17x12y6");
    check_base_class_offset(lv, (B0*)(C17*)(E17x12*), ABISELECT(12,8), "G17x12y6");
    check_base_class_offset(lv, (C17*)(E17x12*), 0, "G17x12y6");
    check_base_class_offset(lv, (D0*)(E17x12*), ABISELECT(20,16), "G17x12y6");
    check_base_class_offset(lv, (E17x12*), 0, "G17x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G17x12y6");
    check_field_offset(lv, ff, ABISELECT(28,24), "G17x12y6.ff");
    test_class_info(&lv, &cd_G17x12y6);
    dp->~G17x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x12y6(Test_G17x12y6, "G17x12y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G17x12y6C1Ev();
extern void _ZN8G17x12y6D1Ev();
Name_Map name_map_G17x12y6[] = {
  NSPAIR(_ZN8G17x12y6C1Ev),
  NSPAIR(_ZN8G17x12y6D1Ev),
  {0,0}
};
extern Class_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_E17x12;
extern VTBL_ENTRY _ZTI6E17x12[];
extern  VTBL_ENTRY _ZTV6E17x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x12y6[] = {
  // 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_E17x12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI8G17x12y6[];
extern void _ZN6E17x123fooEv();
static  VTBL_ENTRY vtc_G17x12y6[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x12y6[0]),
  (VTBL_ENTRY)&_ZN6E17x123fooEv,
};
extern VTBL_ENTRY _ZTV8G17x12y6[];
static  VTT_ENTRY vtt_G17x12y6[] = {
  {&(_ZTV8G17x12y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G17x12y6[];
extern  VTBL_ENTRY _ZTV8G17x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x12y6[];
Class_Descriptor cd_G17x12y6 = {  "G17x12y6", // class name
  bases_G17x12y6, 6,
  &(vtc_G17x12y6[0]), // expected_vtbl_contents
  &(vtt_G17x12y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G17x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x12y6),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x12y6),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  G17x12y7  : virtual E17x12 , virtual F0 {
  int ff;
  ~G17x12y7(); // tgen
  G17x12y7(); // tgen
};
//SIG(1 G17x12y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G17x12y7 ::~G17x12y7(){ note_dtor("G17x12y7", this);} // tgen
G17x12y7 ::G17x12y7(){ note_ctor("G17x12y7", this);} // tgen

static void Test_G17x12y7()
{
  extern Class_Descriptor cd_G17x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x12y7, buf);
    G17x12y7 *dp, &lv = *(dp=new (buf) G17x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x12y7)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x12*), ABISELECT(16,8), "G17x12y7");
    check_base_class_offset(lv, (B0*)(C17*)(E17x12*), ABISELECT(28,16), "G17x12y7");
    check_base_class_offset(lv, (C17*)(E17x12*), ABISELECT(16,8), "G17x12y7");
    check_base_class_offset(lv, (D0*)(E17x12*), ABISELECT(36,24), "G17x12y7");
    check_base_class_offset(lv, (E17x12*), ABISELECT(16,8), "G17x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G17x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G17x12y7.ff");
    test_class_info(&lv, &cd_G17x12y7);
    dp->~G17x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x12y7(Test_G17x12y7, "G17x12y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G17x12y7C1Ev();
extern void _ZN8G17x12y7D1Ev();
Name_Map name_map_G17x12y7[] = {
  NSPAIR(_ZN8G17x12y7C1Ev),
  NSPAIR(_ZN8G17x12y7D1Ev),
  {0,0}
};
extern Class_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_E17x12;
extern VTBL_ENTRY _ZTI6E17x12[];
extern  VTBL_ENTRY _ZTV6E17x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x12y7[] = {
  // 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(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_E17x12,    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_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 _ZTI8G17x12y7[];
extern void _ZN6E17x123fooEv();
static  VTBL_ENTRY vtc_G17x12y7[] = {
  ABISELECT(44,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x12y7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G17x12y7[0]),
  (VTBL_ENTRY)&_ZN6E17x123fooEv,
};
extern VTBL_ENTRY _ZTV8G17x12y7[];
static  VTT_ENTRY vtt_G17x12y7[] = {
  {&(_ZTV8G17x12y7[4]),  4,8},
  {&(_ZTV8G17x12y7[7]),  7,8},
};
extern VTBL_ENTRY _ZTI8G17x12y7[];
extern  VTBL_ENTRY _ZTV8G17x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x12y7[];
Class_Descriptor cd_G17x12y7 = {  "G17x12y7", // class name
  bases_G17x12y7, 6,
  &(vtc_G17x12y7[0]), // expected_vtbl_contents
  &(vtt_G17x12y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G17x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x12y7),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x12y7),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  E18x12  : C18 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E18x123fooEv
  ~E18x12(); // tgen
  E18x12(); // tgen
};
//SIG(-1 E18x12) C1{ BC2{ VBC3{ Fi} BC4{ Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E18x12 ::foo(){vfunc_called(this, "_ZN6E18x123fooEv");}
E18x12 ::~E18x12(){ note_dtor("E18x12", this);} // tgen
E18x12 ::E18x12(){ note_ctor("E18x12", this);} // tgen

static void Test_E18x12()
{
  extern Class_Descriptor cd_E18x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E18x12, buf);
    E18x12 *dp, &lv = *(dp=new (buf) E18x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E18x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E18x12)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(24,20), "E18x12");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(8,4), "E18x12");
    check_base_class_offset(lv, (C18*), 0, "E18x12");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E18x12");
    check_field_offset(lv, fd, ABISELECT(20,16), "E18x12.fd");
    test_class_info(&lv, &cd_E18x12);
    dp->~E18x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE18x12(Test_E18x12, "E18x12", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6E18x12C1Ev();
extern void _ZN6E18x12D1Ev();
Name_Map name_map_E18x12[] = {
  NSPAIR(_ZN6E18x12C1Ev),
  NSPAIR(_ZN6E18x12D1Ev),
  {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_E18x12[] = {
  // 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 _ZTI6E18x12[];
extern void _ZN6E18x123fooEv();
static  VTBL_ENTRY vtc_E18x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x12[0]),
  (VTBL_ENTRY)&_ZN6E18x123fooEv,
};
extern VTBL_ENTRY _ZTV6E18x12[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__6E18x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_E18x12[] = {
  {&(_ZTV6E18x12[3]),  3,4},
  {&(_tg__ZTV3C18__6E18x12[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E18x12[];
extern  VTBL_ENTRY _ZTV6E18x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x12[];
Class_Descriptor cd_E18x12 = {  "E18x12", // class name
  bases_E18x12, 4,
  &(vtc_E18x12[0]), // expected_vtbl_contents
  &(vtt_E18x12[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6E18x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E18x12),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E18x12),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  G18x12y0  : E18x12 , F1 {
  int ff;
  ~G18x12y0(); // tgen
  G18x12y0(); // tgen
};
//SIG(1 G18x12y0) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G18x12y0 ::~G18x12y0(){ note_dtor("G18x12y0", this);} // tgen
G18x12y0 ::G18x12y0(){ note_ctor("G18x12y0", this);} // tgen

static void Test_G18x12y0()
{
  extern Class_Descriptor cd_G18x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x12y0, buf);
    G18x12y0 *dp, &lv = *(dp=new (buf) G18x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x12y0)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x12*), ABISELECT(40,32), "G18x12y0");
    check_base_class_offset(lv, (B0*)(C18*)(E18x12*), ABISELECT(8,4), "G18x12y0");
    check_base_class_offset(lv, (C18*)(E18x12*), 0, "G18x12y0");
    check_base_class_offset(lv, (D0*)(E18x12*), ABISELECT(16,12), "G18x12y0");
    check_base_class_offset(lv, (E18x12*), 0, "G18x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G18x12y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G18x12y0.ff");
    test_class_info(&lv, &cd_G18x12y0);
    dp->~G18x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x12y0(Test_G18x12y0, "G18x12y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G18x12y0C1Ev();
extern void _ZN8G18x12y0D1Ev();
Name_Map name_map_G18x12y0[] = {
  NSPAIR(_ZN8G18x12y0C1Ev),
  NSPAIR(_ZN8G18x12y0D1Ev),
  {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_E18x12;
extern VTBL_ENTRY _ZTI6E18x12[];
extern  VTBL_ENTRY _ZTV6E18x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x12y0[] = {
  // 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_E18x12,    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 _ZTI8G18x12y0[];
extern void _ZN6E18x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x12y0[0]),
  (VTBL_ENTRY)&_ZN6E18x123fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G18x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G18x12y0[];
extern void _ZN6E18x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x12__8G18x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x12[0]),
  (VTBL_ENTRY)&_ZN6E18x123fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C186E18x12__8G18x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x12y0[] = {
  {&(_ZTV8G18x12y0[3]),  3,7},
  {&(_tg__ZTV6E18x12__8G18x12y0[3]),  3,4},
  {&(_tg__ZTV3C186E18x12__8G18x12y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x12y0[];
extern  VTBL_ENTRY _ZTV8G18x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x12y0[];
Class_Descriptor cd_G18x12y0 = {  "G18x12y0", // class name
  bases_G18x12y0, 6,
  &(vtc_G18x12y0[0]), // expected_vtbl_contents
  &(vtt_G18x12y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G18x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x12y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x12y0),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  G18x12y1  : virtual E18x12 , F1 {
  int ff;
  ~G18x12y1(); // tgen
  G18x12y1(); // tgen
};
//SIG(1 G18x12y1) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G18x12y1 ::~G18x12y1(){ note_dtor("G18x12y1", this);} // tgen
G18x12y1 ::G18x12y1(){ note_ctor("G18x12y1", this);} // tgen

static void Test_G18x12y1()
{
  extern Class_Descriptor cd_G18x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x12y1, buf);
    G18x12y1 *dp, &lv = *(dp=new (buf) G18x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x12y1)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x12*), ABISELECT(40,32), "G18x12y1");
    check_base_class_offset(lv, (B0*)(C18*)(E18x12*), ABISELECT(24,16), "G18x12y1");
    check_base_class_offset(lv, (C18*)(E18x12*), ABISELECT(16,12), "G18x12y1");
    check_base_class_offset(lv, (D0*)(E18x12*), ABISELECT(32,24), "G18x12y1");
    check_base_class_offset(lv, (E18x12*), ABISELECT(16,12), "G18x12y1");
    check_base_class_offset(lv, (F1*), 0, "G18x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x12y1.ff");
    test_class_info(&lv, &cd_G18x12y1);
    dp->~G18x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x12y1(Test_G18x12y1, "G18x12y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G18x12y1C1Ev();
extern void _ZN8G18x12y1D1Ev();
Name_Map name_map_G18x12y1[] = {
  NSPAIR(_ZN8G18x12y1C1Ev),
  NSPAIR(_ZN8G18x12y1D1Ev),
  {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_E18x12;
extern VTBL_ENTRY _ZTI6E18x12[];
extern  VTBL_ENTRY _ZTV6E18x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x12y1[] = {
  // 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_E18x12,    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 _ZTI8G18x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E18x123fooEv();
static  VTBL_ENTRY vtc_G18x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G18x12y1[0]),
  (VTBL_ENTRY)&_ZN6E18x123fooEv,
};
extern VTBL_ENTRY _ZTV8G18x12y1[];
extern void _ZN6E18x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x12__8G18x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x12[0]),
  (VTBL_ENTRY)&_ZN6E18x123fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C186E18x12__8G18x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x12y1[] = {
  {&(_ZTV8G18x12y1[4]),  4,10},
  {&(_ZTV8G18x12y1[9]),  9,10},
  {&(_tg__ZTV6E18x12__8G18x12y1[3]),  3,4},
  {&(_tg__ZTV3C186E18x12__8G18x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x12y1[];
extern  VTBL_ENTRY _ZTV8G18x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x12y1[];
Class_Descriptor cd_G18x12y1 = {  "G18x12y1", // class name
  bases_G18x12y1, 6,
  &(vtc_G18x12y1[0]), // expected_vtbl_contents
  &(vtt_G18x12y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G18x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x12y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x12y1),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  G18x12y2  : E18x12 , virtual F1 {
  int ff;
  ~G18x12y2(); // tgen
  G18x12y2(); // tgen
};
//SIG(1 G18x12y2) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G18x12y2 ::~G18x12y2(){ note_dtor("G18x12y2", this);} // tgen
G18x12y2 ::G18x12y2(){ note_ctor("G18x12y2", this);} // tgen

static void Test_G18x12y2()
{
  extern Class_Descriptor cd_G18x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x12y2, buf);
    G18x12y2 *dp, &lv = *(dp=new (buf) G18x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x12y2)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x12*), ABISELECT(28,24), "G18x12y2");
    check_base_class_offset(lv, (B0*)(C18*)(E18x12*), ABISELECT(8,4), "G18x12y2");
    check_base_class_offset(lv, (C18*)(E18x12*), 0, "G18x12y2");
    check_base_class_offset(lv, (D0*)(E18x12*), ABISELECT(16,12), "G18x12y2");
    check_base_class_offset(lv, (E18x12*), 0, "G18x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G18x12y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G18x12y2.ff");
    test_class_info(&lv, &cd_G18x12y2);
    dp->~G18x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x12y2(Test_G18x12y2, "G18x12y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G18x12y2C1Ev();
extern void _ZN8G18x12y2D1Ev();
Name_Map name_map_G18x12y2[] = {
  NSPAIR(_ZN8G18x12y2C1Ev),
  NSPAIR(_ZN8G18x12y2D1Ev),
  {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_E18x12;
extern VTBL_ENTRY _ZTI6E18x12[];
extern  VTBL_ENTRY _ZTV6E18x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x12y2[] = {
  // 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_E18x12,    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 _ZTI8G18x12y2[];
extern void _ZN6E18x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x12y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x12y2[0]),
  (VTBL_ENTRY)&_ZN6E18x123fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G18x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G18x12y2[];
extern void _ZN6E18x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x12__8G18x12y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x12[0]),
  (VTBL_ENTRY)&_ZN6E18x123fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C186E18x12__8G18x12y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x12y2[] = {
  {&(_ZTV8G18x12y2[4]),  4,9},
  {&(_tg__ZTV6E18x12__8G18x12y2[3]),  3,4},
  {&(_tg__ZTV3C186E18x12__8G18x12y2[3]),  3,4},
  {&(_ZTV8G18x12y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G18x12y2[];
extern  VTBL_ENTRY _ZTV8G18x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x12y2[];
Class_Descriptor cd_G18x12y2 = {  "G18x12y2", // class name
  bases_G18x12y2, 6,
  &(vtc_G18x12y2[0]), // expected_vtbl_contents
  &(vtt_G18x12y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G18x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x12y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x12y2),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  G18x12y3  : virtual E18x12 , virtual F1 {
  int ff;
  ~G18x12y3(); // tgen
  G18x12y3(); // tgen
};
//SIG(1 G18x12y3) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G18x12y3 ::~G18x12y3(){ note_dtor("G18x12y3", this);} // tgen
G18x12y3 ::G18x12y3(){ note_ctor("G18x12y3", this);} // tgen

static void Test_G18x12y3()
{
  extern Class_Descriptor cd_G18x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G18x12y3, buf);
    G18x12y3 *dp, &lv = *(dp=new (buf) G18x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G18x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x12y3)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x12*), ABISELECT(40,28), "G18x12y3");
    check_base_class_offset(lv, (B0*)(C18*)(E18x12*), ABISELECT(24,12), "G18x12y3");
    check_base_class_offset(lv, (C18*)(E18x12*), ABISELECT(16,8), "G18x12y3");
    check_base_class_offset(lv, (D0*)(E18x12*), ABISELECT(32,20), "G18x12y3");
    check_base_class_offset(lv, (E18x12*), ABISELECT(16,8), "G18x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G18x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G18x12y3.ff");
    test_class_info(&lv, &cd_G18x12y3);
    dp->~G18x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x12y3(Test_G18x12y3, "G18x12y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G18x12y3C1Ev();
extern void _ZN8G18x12y3D1Ev();
Name_Map name_map_G18x12y3[] = {
  NSPAIR(_ZN8G18x12y3C1Ev),
  NSPAIR(_ZN8G18x12y3D1Ev),
  {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_E18x12;
extern VTBL_ENTRY _ZTI6E18x12[];
extern  VTBL_ENTRY _ZTV6E18x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x12y3[] = {
  // 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_E18x12,    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 _ZTI8G18x12y3[];
extern void _ZN6E18x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x12y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G18x12y3[0]),
  (VTBL_ENTRY)&_ZN6E18x123fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G18x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G18x12y3[];
extern void _ZN6E18x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x12__8G18x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x12[0]),
  (VTBL_ENTRY)&_ZN6E18x123fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C186E18x12__8G18x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x12y3[] = {
  {&(_ZTV8G18x12y3[5]),  5,14},
  {&(_ZTV8G18x12y3[9]),  9,14},
  {&(_ZTV8G18x12y3[13]),  13,14},
  {&(_tg__ZTV6E18x12__8G18x12y3[3]),  3,4},
  {&(_tg__ZTV3C186E18x12__8G18x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x12y3[];
extern  VTBL_ENTRY _ZTV8G18x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x12y3[];
Class_Descriptor cd_G18x12y3 = {  "G18x12y3", // class name
  bases_G18x12y3, 6,
  &(vtc_G18x12y3[0]), // expected_vtbl_contents
  &(vtt_G18x12y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G18x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x12y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x12y3),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  G18x12y4  : E18x12 , F0 {
  int ff;
  ~G18x12y4(); // tgen
  G18x12y4(); // tgen
};
//SIG(1 G18x12y4) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G18x12y4 ::~G18x12y4(){ note_dtor("G18x12y4", this);} // tgen
G18x12y4 ::G18x12y4(){ note_ctor("G18x12y4", this);} // tgen

static void Test_G18x12y4()
{
  extern Class_Descriptor cd_G18x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G18x12y4, buf);
    G18x12y4 *dp, &lv = *(dp=new (buf) G18x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G18x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x12y4)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x12*), ABISELECT(32,28), "G18x12y4");
    check_base_class_offset(lv, (B0*)(C18*)(E18x12*), ABISELECT(8,4), "G18x12y4");
    check_base_class_offset(lv, (C18*)(E18x12*), 0, "G18x12y4");
    check_base_class_offset(lv, (D0*)(E18x12*), ABISELECT(16,12), "G18x12y4");
    check_base_class_offset(lv, (E18x12*), 0, "G18x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G18x12y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G18x12y4.ff");
    test_class_info(&lv, &cd_G18x12y4);
    dp->~G18x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x12y4(Test_G18x12y4, "G18x12y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G18x12y4C1Ev();
extern void _ZN8G18x12y4D1Ev();
Name_Map name_map_G18x12y4[] = {
  NSPAIR(_ZN8G18x12y4C1Ev),
  NSPAIR(_ZN8G18x12y4D1Ev),
  {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_E18x12;
extern VTBL_ENTRY _ZTI6E18x12[];
extern  VTBL_ENTRY _ZTV6E18x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x12y4[] = {
  // 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_E18x12,    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 _ZTI8G18x12y4[];
extern void _ZN6E18x123fooEv();
static  VTBL_ENTRY vtc_G18x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x12y4[0]),
  (VTBL_ENTRY)&_ZN6E18x123fooEv,
};
extern VTBL_ENTRY _ZTV8G18x12y4[];
extern void _ZN6E18x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x12__8G18x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x12[0]),
  (VTBL_ENTRY)&_ZN6E18x123fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C186E18x12__8G18x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x12y4[] = {
  {&(_ZTV8G18x12y4[3]),  3,4},
  {&(_tg__ZTV6E18x12__8G18x12y4[3]),  3,4},
  {&(_tg__ZTV3C186E18x12__8G18x12y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x12y4[];
extern  VTBL_ENTRY _ZTV8G18x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x12y4[];
Class_Descriptor cd_G18x12y4 = {  "G18x12y4", // class name
  bases_G18x12y4, 6,
  &(vtc_G18x12y4[0]), // expected_vtbl_contents
  &(vtt_G18x12y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G18x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x12y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x12y4),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  G18x12y5  : virtual E18x12 , F0 {
  int ff;
  ~G18x12y5(); // tgen
  G18x12y5(); // tgen
};
//SIG(1 G18x12y5) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G18x12y5 ::~G18x12y5(){ note_dtor("G18x12y5", this);} // tgen
G18x12y5 ::G18x12y5(){ note_ctor("G18x12y5", this);} // tgen

static void Test_G18x12y5()
{
  extern Class_Descriptor cd_G18x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x12y5, buf);
    G18x12y5 *dp, &lv = *(dp=new (buf) G18x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x12y5)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x12*), ABISELECT(40,32), "G18x12y5");
    check_base_class_offset(lv, (B0*)(C18*)(E18x12*), ABISELECT(24,16), "G18x12y5");
    check_base_class_offset(lv, (C18*)(E18x12*), ABISELECT(16,12), "G18x12y5");
    check_base_class_offset(lv, (D0*)(E18x12*), ABISELECT(32,24), "G18x12y5");
    check_base_class_offset(lv, (E18x12*), ABISELECT(16,12), "G18x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G18x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x12y5.ff");
    test_class_info(&lv, &cd_G18x12y5);
    dp->~G18x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x12y5(Test_G18x12y5, "G18x12y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G18x12y5C1Ev();
extern void _ZN8G18x12y5D1Ev();
Name_Map name_map_G18x12y5[] = {
  NSPAIR(_ZN8G18x12y5C1Ev),
  NSPAIR(_ZN8G18x12y5D1Ev),
  {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_E18x12;
extern VTBL_ENTRY _ZTI6E18x12[];
extern  VTBL_ENTRY _ZTV6E18x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x12y5[] = {
  // 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_E18x12,    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 _ZTI8G18x12y5[];
extern void _ZN6E18x123fooEv();
static  VTBL_ENTRY vtc_G18x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G18x12y5[0]),
  (VTBL_ENTRY)&_ZN6E18x123fooEv,
};
extern VTBL_ENTRY _ZTV8G18x12y5[];
extern void _ZN6E18x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x12__8G18x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x12[0]),
  (VTBL_ENTRY)&_ZN6E18x123fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C186E18x12__8G18x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x12y5[] = {
  {&(_ZTV8G18x12y5[4]),  4,9},
  {&(_ZTV8G18x12y5[8]),  8,9},
  {&(_tg__ZTV6E18x12__8G18x12y5[3]),  3,4},
  {&(_tg__ZTV3C186E18x12__8G18x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x12y5[];
extern  VTBL_ENTRY _ZTV8G18x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x12y5[];
Class_Descriptor cd_G18x12y5 = {  "G18x12y5", // class name
  bases_G18x12y5, 6,
  &(vtc_G18x12y5[0]), // expected_vtbl_contents
  &(vtt_G18x12y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G18x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x12y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x12y5),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  G18x12y6  : E18x12 , virtual F0 {
  int ff;
  ~G18x12y6(); // tgen
  G18x12y6(); // tgen
};
//SIG(1 G18x12y6) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G18x12y6 ::~G18x12y6(){ note_dtor("G18x12y6", this);} // tgen
G18x12y6 ::G18x12y6(){ note_ctor("G18x12y6", this);} // tgen

static void Test_G18x12y6()
{
  extern Class_Descriptor cd_G18x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G18x12y6, buf);
    G18x12y6 *dp, &lv = *(dp=new (buf) G18x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G18x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x12y6)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x12*), ABISELECT(28,24), "G18x12y6");
    check_base_class_offset(lv, (B0*)(C18*)(E18x12*), ABISELECT(8,4), "G18x12y6");
    check_base_class_offset(lv, (C18*)(E18x12*), 0, "G18x12y6");
    check_base_class_offset(lv, (D0*)(E18x12*), ABISELECT(16,12), "G18x12y6");
    check_base_class_offset(lv, (E18x12*), 0, "G18x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G18x12y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G18x12y6.ff");
    test_class_info(&lv, &cd_G18x12y6);
    dp->~G18x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x12y6(Test_G18x12y6, "G18x12y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G18x12y6C1Ev();
extern void _ZN8G18x12y6D1Ev();
Name_Map name_map_G18x12y6[] = {
  NSPAIR(_ZN8G18x12y6C1Ev),
  NSPAIR(_ZN8G18x12y6D1Ev),
  {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_E18x12;
extern VTBL_ENTRY _ZTI6E18x12[];
extern  VTBL_ENTRY _ZTV6E18x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x12y6[] = {
  // 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_E18x12,    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 _ZTI8G18x12y6[];
extern void _ZN6E18x123fooEv();
static  VTBL_ENTRY vtc_G18x12y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x12y6[0]),
  (VTBL_ENTRY)&_ZN6E18x123fooEv,
};
extern VTBL_ENTRY _ZTV8G18x12y6[];
extern void _ZN6E18x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x12__8G18x12y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x12[0]),
  (VTBL_ENTRY)&_ZN6E18x123fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C186E18x12__8G18x12y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x12y6[] = {
  {&(_ZTV8G18x12y6[4]),  4,5},
  {&(_tg__ZTV6E18x12__8G18x12y6[3]),  3,4},
  {&(_tg__ZTV3C186E18x12__8G18x12y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x12y6[];
extern  VTBL_ENTRY _ZTV8G18x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x12y6[];
Class_Descriptor cd_G18x12y6 = {  "G18x12y6", // class name
  bases_G18x12y6, 6,
  &(vtc_G18x12y6[0]), // expected_vtbl_contents
  &(vtt_G18x12y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G18x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x12y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x12y6),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  G18x12y7  : virtual E18x12 , virtual F0 {
  int ff;
  ~G18x12y7(); // tgen
  G18x12y7(); // tgen
};
//SIG(1 G18x12y7) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G18x12y7 ::~G18x12y7(){ note_dtor("G18x12y7", this);} // tgen
G18x12y7 ::G18x12y7(){ note_ctor("G18x12y7", this);} // tgen

static void Test_G18x12y7()
{
  extern Class_Descriptor cd_G18x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x12y7, buf);
    G18x12y7 *dp, &lv = *(dp=new (buf) G18x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x12y7)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x12*), ABISELECT(40,28), "G18x12y7");
    check_base_class_offset(lv, (B0*)(C18*)(E18x12*), ABISELECT(24,12), "G18x12y7");
    check_base_class_offset(lv, (C18*)(E18x12*), ABISELECT(16,8), "G18x12y7");
    check_base_class_offset(lv, (D0*)(E18x12*), ABISELECT(32,20), "G18x12y7");
    check_base_class_offset(lv, (E18x12*), ABISELECT(16,8), "G18x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G18x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G18x12y7.ff");
    test_class_info(&lv, &cd_G18x12y7);
    dp->~G18x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x12y7(Test_G18x12y7, "G18x12y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G18x12y7C1Ev();
extern void _ZN8G18x12y7D1Ev();
Name_Map name_map_G18x12y7[] = {
  NSPAIR(_ZN8G18x12y7C1Ev),
  NSPAIR(_ZN8G18x12y7D1Ev),
  {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_E18x12;
extern VTBL_ENTRY _ZTI6E18x12[];
extern  VTBL_ENTRY _ZTV6E18x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x12y7[] = {
  // 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_E18x12,    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 _ZTI8G18x12y7[];
extern void _ZN6E18x123fooEv();
static  VTBL_ENTRY vtc_G18x12y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G18x12y7[0]),
  (VTBL_ENTRY)&_ZN6E18x123fooEv,
};
extern VTBL_ENTRY _ZTV8G18x12y7[];
extern void _ZN6E18x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x12__8G18x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x12[0]),
  (VTBL_ENTRY)&_ZN6E18x123fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C186E18x12__8G18x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x12y7[] = {
  {&(_ZTV8G18x12y7[5]),  5,10},
  {&(_ZTV8G18x12y7[9]),  9,10},
  {&(_tg__ZTV6E18x12__8G18x12y7[3]),  3,4},
  {&(_tg__ZTV3C186E18x12__8G18x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x12y7[];
extern  VTBL_ENTRY _ZTV8G18x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x12y7[];
Class_Descriptor cd_G18x12y7 = {  "G18x12y7", // class name
  bases_G18x12y7, 6,
  &(vtc_G18x12y7[0]), // expected_vtbl_contents
  &(vtt_G18x12y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G18x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x12y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x12y7),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  E19x12  : C19 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E19x123fooEv
  ~E19x12(); // tgen
  E19x12(); // tgen
};
//SIG(-1 E19x12) C1{ BC2{ VBC3{ v1 Fi} BC4{ Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E19x12 ::foo(){vfunc_called(this, "_ZN6E19x123fooEv");}
E19x12 ::~E19x12(){ note_dtor("E19x12", this);} // tgen
E19x12 ::E19x12(){ note_ctor("E19x12", this);} // tgen

static void Test_E19x12()
{
  extern Class_Descriptor cd_E19x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E19x12, buf);
    E19x12 *dp, &lv = *(dp=new (buf) E19x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E19x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E19x12)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(24,20), "E19x12");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(8,4), "E19x12");
    check_base_class_offset(lv, (C19*), 0, "E19x12");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E19x12");
    check_field_offset(lv, fd, ABISELECT(20,16), "E19x12.fd");
    test_class_info(&lv, &cd_E19x12);
    dp->~E19x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE19x12(Test_E19x12, "E19x12", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E19x12C1Ev();
extern void _ZN6E19x12D1Ev();
Name_Map name_map_E19x12[] = {
  NSPAIR(_ZN6E19x12C1Ev),
  NSPAIR(_ZN6E19x12D1Ev),
  {0,0}
};
extern Class_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_E19x12[] = {
  // 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 _ZTI6E19x12[];
extern void _ZN6E19x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv)();
extern void ABISELECT(_ZThn24_N6E19x123fooEv,_ZThn20_N6E19x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E19x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x12[0]),
  (VTBL_ENTRY)&_ZN6E19x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E19x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv),
};
extern VTBL_ENTRY _ZTV6E19x12[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__6E19x12[] = {
  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__6E19x12[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_E19x12[] = {
  {&(_ZTV6E19x12[3]),  3,8},
  {&(_tg__ZTV3C19__6E19x12[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__6E19x12[3]),  3,4},
  {&(_ZTV6E19x12[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6E19x12[];
extern  VTBL_ENTRY _ZTV6E19x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x12[];
static VTBL_ENTRY alt_thunk_names71[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x123fooEv,_ZThn20_N6E19x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E19x12 = {  "E19x12", // class name
  bases_E19x12, 4,
  &(vtc_E19x12[0]), // expected_vtbl_contents
  &(vtt_E19x12[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E19x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E19x12),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E19x12),4, //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  G19x12y0  : E19x12 , F1 {
  int ff;
  ~G19x12y0(); // tgen
  G19x12y0(); // tgen
};
//SIG(1 G19x12y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G19x12y0 ::~G19x12y0(){ note_dtor("G19x12y0", this);} // tgen
G19x12y0 ::G19x12y0(){ note_ctor("G19x12y0", this);} // tgen

static void Test_G19x12y0()
{
  extern Class_Descriptor cd_G19x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x12y0, buf);
    G19x12y0 *dp, &lv = *(dp=new (buf) G19x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x12y0)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x12*), ABISELECT(40,32), "G19x12y0");
    check_base_class_offset(lv, (B0*)(C19*)(E19x12*), ABISELECT(8,4), "G19x12y0");
    check_base_class_offset(lv, (C19*)(E19x12*), 0, "G19x12y0");
    check_base_class_offset(lv, (D0*)(E19x12*), ABISELECT(16,12), "G19x12y0");
    check_base_class_offset(lv, (E19x12*), 0, "G19x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G19x12y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G19x12y0.ff");
    test_class_info(&lv, &cd_G19x12y0);
    dp->~G19x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x12y0(Test_G19x12y0, "G19x12y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G19x12y0C1Ev();
extern void _ZN8G19x12y0D1Ev();
Name_Map name_map_G19x12y0[] = {
  NSPAIR(_ZN8G19x12y0C1Ev),
  NSPAIR(_ZN8G19x12y0D1Ev),
  {0,0}
};
extern Class_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_E19x12;
extern VTBL_ENTRY _ZTI6E19x12[];
extern  VTBL_ENTRY _ZTV6E19x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x12y0[] = {
  // 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_E19x12,    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 _ZTI8G19x12y0[];
extern void _ZN6E19x123fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv)();
extern void ABISELECT(_ZThn40_N6E19x123fooEv,_ZThn32_N6E19x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x12y0[0]),
  (VTBL_ENTRY)&_ZN6E19x123fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G19x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G19x12y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv),
};
extern VTBL_ENTRY _ZTV8G19x12y0[];
extern void _ZN6E19x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x12__8G19x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x12[0]),
  (VTBL_ENTRY)&_ZN6E19x123fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C196E19x12__8G19x12y0[] = {
  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__3C196E19x12__8G19x12y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv)();
extern void ABISELECT(_ZThn40_N6E19x123fooEv,_ZThn32_N6E19x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x12__8G19x12y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6E19x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv),
};
static  VTT_ENTRY vtt_G19x12y0[] = {
  {&(_ZTV8G19x12y0[3]),  3,11},
  {&(_tg__ZTV6E19x12__8G19x12y0[3]),  3,4},
  {&(_tg__ZTV3C196E19x12__8G19x12y0[3]),  3,4},
  {&(_tg__ZTV2A1__3C196E19x12__8G19x12y0[3]),  3,4},
  {&(_tg__ZTV2A1__6E19x12__8G19x12y0[3]),  3,4},
  {&(_ZTV8G19x12y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI8G19x12y0[];
extern  VTBL_ENTRY _ZTV8G19x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x12y0[];
static VTBL_ENTRY alt_thunk_names72[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C193fooEv,_ZThn32_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E19x123fooEv,_ZThn32_N6E19x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E19x123fooEv,_ZThn32_N6E19x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x12y0 = {  "G19x12y0", // class name
  bases_G19x12y0, 6,
  &(vtc_G19x12y0[0]), // expected_vtbl_contents
  &(vtt_G19x12y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G19x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x12y0),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x12y0),6, //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  G19x12y1  : virtual E19x12 , F1 {
  int ff;
  ~G19x12y1(); // tgen
  G19x12y1(); // tgen
};
//SIG(1 G19x12y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G19x12y1 ::~G19x12y1(){ note_dtor("G19x12y1", this);} // tgen
G19x12y1 ::G19x12y1(){ note_ctor("G19x12y1", this);} // tgen

static void Test_G19x12y1()
{
  extern Class_Descriptor cd_G19x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x12y1, buf);
    G19x12y1 *dp, &lv = *(dp=new (buf) G19x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x12y1)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x12*), ABISELECT(40,32), "G19x12y1");
    check_base_class_offset(lv, (B0*)(C19*)(E19x12*), ABISELECT(24,16), "G19x12y1");
    check_base_class_offset(lv, (C19*)(E19x12*), ABISELECT(16,12), "G19x12y1");
    check_base_class_offset(lv, (D0*)(E19x12*), ABISELECT(32,24), "G19x12y1");
    check_base_class_offset(lv, (E19x12*), ABISELECT(16,12), "G19x12y1");
    check_base_class_offset(lv, (F1*), 0, "G19x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x12y1.ff");
    test_class_info(&lv, &cd_G19x12y1);
    dp->~G19x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x12y1(Test_G19x12y1, "G19x12y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G19x12y1C1Ev();
extern void _ZN8G19x12y1D1Ev();
Name_Map name_map_G19x12y1[] = {
  NSPAIR(_ZN8G19x12y1C1Ev),
  NSPAIR(_ZN8G19x12y1D1Ev),
  {0,0}
};
extern Class_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_E19x12;
extern VTBL_ENTRY _ZTI6E19x12[];
extern  VTBL_ENTRY _ZTV6E19x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x12y1[] = {
  // 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_E19x12,    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 _ZTI8G19x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E19x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv)();
extern void ABISELECT(_ZThn24_N6E19x123fooEv,_ZThn20_N6E19x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G19x12y1[0]),
  (VTBL_ENTRY)&_ZN6E19x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G19x12y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv),
};
extern VTBL_ENTRY _ZTV8G19x12y1[];
extern void _ZN6E19x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x12__8G19x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x12[0]),
  (VTBL_ENTRY)&_ZN6E19x123fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C196E19x12__8G19x12y1[] = {
  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__3C196E19x12__8G19x12y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv)();
extern void ABISELECT(_ZThn24_N6E19x123fooEv,_ZThn20_N6E19x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x12__8G19x12y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E19x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv),
};
static  VTT_ENTRY vtt_G19x12y1[] = {
  {&(_ZTV8G19x12y1[4]),  4,14},
  {&(_ZTV8G19x12y1[9]),  9,14},
  {&(_ZTV8G19x12y1[13]),  13,14},
  {&(_tg__ZTV6E19x12__8G19x12y1[3]),  3,4},
  {&(_tg__ZTV3C196E19x12__8G19x12y1[3]),  3,4},
  {&(_tg__ZTV2A1__3C196E19x12__8G19x12y1[3]),  3,4},
  {&(_tg__ZTV2A1__6E19x12__8G19x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x12y1[];
extern  VTBL_ENTRY _ZTV8G19x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x12y1[];
static VTBL_ENTRY alt_thunk_names73[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x123fooEv,_ZThn20_N6E19x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x123fooEv,_ZThn20_N6E19x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x12y1 = {  "G19x12y1", // class name
  bases_G19x12y1, 6,
  &(vtc_G19x12y1[0]), // expected_vtbl_contents
  &(vtt_G19x12y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G19x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x12y1),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x12y1),7, //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  G19x12y2  : E19x12 , virtual F1 {
  int ff;
  ~G19x12y2(); // tgen
  G19x12y2(); // tgen
};
//SIG(1 G19x12y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G19x12y2 ::~G19x12y2(){ note_dtor("G19x12y2", this);} // tgen
G19x12y2 ::G19x12y2(){ note_ctor("G19x12y2", this);} // tgen

static void Test_G19x12y2()
{
  extern Class_Descriptor cd_G19x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G19x12y2, buf);
    G19x12y2 *dp, &lv = *(dp=new (buf) G19x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G19x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x12y2)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x12*), ABISELECT(32,24), "G19x12y2");
    check_base_class_offset(lv, (B0*)(C19*)(E19x12*), ABISELECT(8,4), "G19x12y2");
    check_base_class_offset(lv, (C19*)(E19x12*), 0, "G19x12y2");
    check_base_class_offset(lv, (D0*)(E19x12*), ABISELECT(16,12), "G19x12y2");
    check_base_class_offset(lv, (E19x12*), 0, "G19x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G19x12y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G19x12y2.ff");
    test_class_info(&lv, &cd_G19x12y2);
    dp->~G19x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x12y2(Test_G19x12y2, "G19x12y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G19x12y2C1Ev();
extern void _ZN8G19x12y2D1Ev();
Name_Map name_map_G19x12y2[] = {
  NSPAIR(_ZN8G19x12y2C1Ev),
  NSPAIR(_ZN8G19x12y2D1Ev),
  {0,0}
};
extern Class_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_E19x12;
extern VTBL_ENTRY _ZTI6E19x12[];
extern  VTBL_ENTRY _ZTV6E19x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x12y2[] = {
  // 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_E19x12,    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 _ZTI8G19x12y2[];
extern void _ZN6E19x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv)();
extern void ABISELECT(_ZThn32_N6E19x123fooEv,_ZThn24_N6E19x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G19x12y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x12y2[0]),
  (VTBL_ENTRY)&_ZN6E19x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G19x12y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G19x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G19x12y2[];
extern void _ZN6E19x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x12__8G19x12y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x12[0]),
  (VTBL_ENTRY)&_ZN6E19x123fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C196E19x12__8G19x12y2[] = {
  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__3C196E19x12__8G19x12y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv)();
extern void ABISELECT(_ZThn32_N6E19x123fooEv,_ZThn24_N6E19x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x12__8G19x12y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E19x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv),
};
static  VTT_ENTRY vtt_G19x12y2[] = {
  {&(_ZTV8G19x12y2[4]),  4,13},
  {&(_tg__ZTV6E19x12__8G19x12y2[3]),  3,4},
  {&(_tg__ZTV3C196E19x12__8G19x12y2[3]),  3,4},
  {&(_tg__ZTV2A1__3C196E19x12__8G19x12y2[3]),  3,4},
  {&(_tg__ZTV2A1__6E19x12__8G19x12y2[3]),  3,4},
  {&(_ZTV8G19x12y2[8]),  8,13},
  {&(_ZTV8G19x12y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI8G19x12y2[];
extern  VTBL_ENTRY _ZTV8G19x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x12y2[];
static VTBL_ENTRY alt_thunk_names74[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x123fooEv,_ZThn24_N6E19x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x123fooEv,_ZThn24_N6E19x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x12y2 = {  "G19x12y2", // class name
  bases_G19x12y2, 6,
  &(vtc_G19x12y2[0]), // expected_vtbl_contents
  &(vtt_G19x12y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G19x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x12y2),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x12y2),7, //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  G19x12y3  : virtual E19x12 , virtual F1 {
  int ff;
  ~G19x12y3(); // tgen
  G19x12y3(); // tgen
};
//SIG(1 G19x12y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G19x12y3 ::~G19x12y3(){ note_dtor("G19x12y3", this);} // tgen
G19x12y3 ::G19x12y3(){ note_ctor("G19x12y3", this);} // tgen

static void Test_G19x12y3()
{
  extern Class_Descriptor cd_G19x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G19x12y3, buf);
    G19x12y3 *dp, &lv = *(dp=new (buf) G19x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G19x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x12y3)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x12*), ABISELECT(40,28), "G19x12y3");
    check_base_class_offset(lv, (B0*)(C19*)(E19x12*), ABISELECT(24,12), "G19x12y3");
    check_base_class_offset(lv, (C19*)(E19x12*), ABISELECT(16,8), "G19x12y3");
    check_base_class_offset(lv, (D0*)(E19x12*), ABISELECT(32,20), "G19x12y3");
    check_base_class_offset(lv, (E19x12*), ABISELECT(16,8), "G19x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G19x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G19x12y3.ff");
    test_class_info(&lv, &cd_G19x12y3);
    dp->~G19x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x12y3(Test_G19x12y3, "G19x12y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G19x12y3C1Ev();
extern void _ZN8G19x12y3D1Ev();
Name_Map name_map_G19x12y3[] = {
  NSPAIR(_ZN8G19x12y3C1Ev),
  NSPAIR(_ZN8G19x12y3D1Ev),
  {0,0}
};
extern Class_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_E19x12;
extern VTBL_ENTRY _ZTI6E19x12[];
extern  VTBL_ENTRY _ZTV6E19x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x12y3[] = {
  // 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_E19x12,    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 _ZTI8G19x12y3[];
extern void _ZN6E19x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv)();
extern void ABISELECT(_ZThn24_N6E19x123fooEv,_ZThn20_N6E19x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G19x12y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G19x12y3[0]),
  (VTBL_ENTRY)&_ZN6E19x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G19x12y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G19x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G19x12y3[];
extern void _ZN6E19x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x12__8G19x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x12[0]),
  (VTBL_ENTRY)&_ZN6E19x123fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C196E19x12__8G19x12y3[] = {
  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__3C196E19x12__8G19x12y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv)();
extern void ABISELECT(_ZThn24_N6E19x123fooEv,_ZThn20_N6E19x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x12__8G19x12y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E19x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv),
};
static  VTT_ENTRY vtt_G19x12y3[] = {
  {&(_ZTV8G19x12y3[5]),  5,18},
  {&(_ZTV8G19x12y3[9]),  9,18},
  {&(_ZTV8G19x12y3[13]),  13,18},
  {&(_ZTV8G19x12y3[17]),  17,18},
  {&(_tg__ZTV6E19x12__8G19x12y3[3]),  3,4},
  {&(_tg__ZTV3C196E19x12__8G19x12y3[3]),  3,4},
  {&(_tg__ZTV2A1__3C196E19x12__8G19x12y3[3]),  3,4},
  {&(_tg__ZTV2A1__6E19x12__8G19x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x12y3[];
extern  VTBL_ENTRY _ZTV8G19x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x12y3[];
static VTBL_ENTRY alt_thunk_names75[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x123fooEv,_ZThn20_N6E19x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x123fooEv,_ZThn20_N6E19x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x12y3 = {  "G19x12y3", // class name
  bases_G19x12y3, 6,
  &(vtc_G19x12y3[0]), // expected_vtbl_contents
  &(vtt_G19x12y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G19x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x12y3),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x12y3),8, //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  G19x12y4  : E19x12 , F0 {
  int ff;
  ~G19x12y4(); // tgen
  G19x12y4(); // tgen
};
//SIG(1 G19x12y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G19x12y4 ::~G19x12y4(){ note_dtor("G19x12y4", this);} // tgen
G19x12y4 ::G19x12y4(){ note_ctor("G19x12y4", this);} // tgen

static void Test_G19x12y4()
{
  extern Class_Descriptor cd_G19x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G19x12y4, buf);
    G19x12y4 *dp, &lv = *(dp=new (buf) G19x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G19x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x12y4)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x12*), ABISELECT(32,28), "G19x12y4");
    check_base_class_offset(lv, (B0*)(C19*)(E19x12*), ABISELECT(8,4), "G19x12y4");
    check_base_class_offset(lv, (C19*)(E19x12*), 0, "G19x12y4");
    check_base_class_offset(lv, (D0*)(E19x12*), ABISELECT(16,12), "G19x12y4");
    check_base_class_offset(lv, (E19x12*), 0, "G19x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G19x12y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G19x12y4.ff");
    test_class_info(&lv, &cd_G19x12y4);
    dp->~G19x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x12y4(Test_G19x12y4, "G19x12y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G19x12y4C1Ev();
extern void _ZN8G19x12y4D1Ev();
Name_Map name_map_G19x12y4[] = {
  NSPAIR(_ZN8G19x12y4C1Ev),
  NSPAIR(_ZN8G19x12y4D1Ev),
  {0,0}
};
extern Class_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_E19x12;
extern VTBL_ENTRY _ZTI6E19x12[];
extern  VTBL_ENTRY _ZTV6E19x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x12y4[] = {
  // 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_E19x12,    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 _ZTI8G19x12y4[];
extern void _ZN6E19x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv)();
extern void ABISELECT(_ZThn32_N6E19x123fooEv,_ZThn28_N6E19x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x12y4[0]),
  (VTBL_ENTRY)&_ZN6E19x123fooEv,
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G19x12y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv),
};
extern VTBL_ENTRY _ZTV8G19x12y4[];
extern void _ZN6E19x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x12__8G19x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x12[0]),
  (VTBL_ENTRY)&_ZN6E19x123fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C196E19x12__8G19x12y4[] = {
  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__3C196E19x12__8G19x12y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv)();
extern void ABISELECT(_ZThn32_N6E19x123fooEv,_ZThn28_N6E19x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x12__8G19x12y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6E19x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv),
};
static  VTT_ENTRY vtt_G19x12y4[] = {
  {&(_ZTV8G19x12y4[3]),  3,8},
  {&(_tg__ZTV6E19x12__8G19x12y4[3]),  3,4},
  {&(_tg__ZTV3C196E19x12__8G19x12y4[3]),  3,4},
  {&(_tg__ZTV2A1__3C196E19x12__8G19x12y4[3]),  3,4},
  {&(_tg__ZTV2A1__6E19x12__8G19x12y4[3]),  3,4},
  {&(_ZTV8G19x12y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI8G19x12y4[];
extern  VTBL_ENTRY _ZTV8G19x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x12y4[];
static VTBL_ENTRY alt_thunk_names76[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C193fooEv,_ZThn28_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x123fooEv,_ZThn28_N6E19x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x123fooEv,_ZThn28_N6E19x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x12y4 = {  "G19x12y4", // class name
  bases_G19x12y4, 6,
  &(vtc_G19x12y4[0]), // expected_vtbl_contents
  &(vtt_G19x12y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G19x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x12y4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x12y4),6, //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  G19x12y5  : virtual E19x12 , F0 {
  int ff;
  ~G19x12y5(); // tgen
  G19x12y5(); // tgen
};
//SIG(1 G19x12y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G19x12y5 ::~G19x12y5(){ note_dtor("G19x12y5", this);} // tgen
G19x12y5 ::G19x12y5(){ note_ctor("G19x12y5", this);} // tgen

static void Test_G19x12y5()
{
  extern Class_Descriptor cd_G19x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x12y5, buf);
    G19x12y5 *dp, &lv = *(dp=new (buf) G19x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x12y5)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x12*), ABISELECT(40,32), "G19x12y5");
    check_base_class_offset(lv, (B0*)(C19*)(E19x12*), ABISELECT(24,16), "G19x12y5");
    check_base_class_offset(lv, (C19*)(E19x12*), ABISELECT(16,12), "G19x12y5");
    check_base_class_offset(lv, (D0*)(E19x12*), ABISELECT(32,24), "G19x12y5");
    check_base_class_offset(lv, (E19x12*), ABISELECT(16,12), "G19x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G19x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x12y5.ff");
    test_class_info(&lv, &cd_G19x12y5);
    dp->~G19x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x12y5(Test_G19x12y5, "G19x12y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G19x12y5C1Ev();
extern void _ZN8G19x12y5D1Ev();
Name_Map name_map_G19x12y5[] = {
  NSPAIR(_ZN8G19x12y5C1Ev),
  NSPAIR(_ZN8G19x12y5D1Ev),
  {0,0}
};
extern Class_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_E19x12;
extern VTBL_ENTRY _ZTI6E19x12[];
extern  VTBL_ENTRY _ZTV6E19x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x12y5[] = {
  // 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_E19x12,    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 _ZTI8G19x12y5[];
extern void _ZN6E19x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv)();
extern void ABISELECT(_ZThn24_N6E19x123fooEv,_ZThn20_N6E19x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G19x12y5[0]),
  (VTBL_ENTRY)&_ZN6E19x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G19x12y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv),
};
extern VTBL_ENTRY _ZTV8G19x12y5[];
extern void _ZN6E19x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x12__8G19x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x12[0]),
  (VTBL_ENTRY)&_ZN6E19x123fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C196E19x12__8G19x12y5[] = {
  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__3C196E19x12__8G19x12y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv)();
extern void ABISELECT(_ZThn24_N6E19x123fooEv,_ZThn20_N6E19x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x12__8G19x12y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E19x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv),
};
static  VTT_ENTRY vtt_G19x12y5[] = {
  {&(_ZTV8G19x12y5[4]),  4,13},
  {&(_ZTV8G19x12y5[8]),  8,13},
  {&(_ZTV8G19x12y5[12]),  12,13},
  {&(_tg__ZTV6E19x12__8G19x12y5[3]),  3,4},
  {&(_tg__ZTV3C196E19x12__8G19x12y5[3]),  3,4},
  {&(_tg__ZTV2A1__3C196E19x12__8G19x12y5[3]),  3,4},
  {&(_tg__ZTV2A1__6E19x12__8G19x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x12y5[];
extern  VTBL_ENTRY _ZTV8G19x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x12y5[];
static VTBL_ENTRY alt_thunk_names77[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x123fooEv,_ZThn20_N6E19x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x123fooEv,_ZThn20_N6E19x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x12y5 = {  "G19x12y5", // class name
  bases_G19x12y5, 6,
  &(vtc_G19x12y5[0]), // expected_vtbl_contents
  &(vtt_G19x12y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G19x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x12y5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x12y5),7, //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  G19x12y6  : E19x12 , virtual F0 {
  int ff;
  ~G19x12y6(); // tgen
  G19x12y6(); // tgen
};
//SIG(1 G19x12y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G19x12y6 ::~G19x12y6(){ note_dtor("G19x12y6", this);} // tgen
G19x12y6 ::G19x12y6(){ note_ctor("G19x12y6", this);} // tgen

static void Test_G19x12y6()
{
  extern Class_Descriptor cd_G19x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G19x12y6, buf);
    G19x12y6 *dp, &lv = *(dp=new (buf) G19x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G19x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x12y6)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x12*), ABISELECT(32,24), "G19x12y6");
    check_base_class_offset(lv, (B0*)(C19*)(E19x12*), ABISELECT(8,4), "G19x12y6");
    check_base_class_offset(lv, (C19*)(E19x12*), 0, "G19x12y6");
    check_base_class_offset(lv, (D0*)(E19x12*), ABISELECT(16,12), "G19x12y6");
    check_base_class_offset(lv, (E19x12*), 0, "G19x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G19x12y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G19x12y6.ff");
    test_class_info(&lv, &cd_G19x12y6);
    dp->~G19x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x12y6(Test_G19x12y6, "G19x12y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G19x12y6C1Ev();
extern void _ZN8G19x12y6D1Ev();
Name_Map name_map_G19x12y6[] = {
  NSPAIR(_ZN8G19x12y6C1Ev),
  NSPAIR(_ZN8G19x12y6D1Ev),
  {0,0}
};
extern Class_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_E19x12;
extern VTBL_ENTRY _ZTI6E19x12[];
extern  VTBL_ENTRY _ZTV6E19x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x12y6[] = {
  // 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_E19x12,    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 _ZTI8G19x12y6[];
extern void _ZN6E19x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv)();
extern void ABISELECT(_ZThn32_N6E19x123fooEv,_ZThn24_N6E19x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x12y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x12y6[0]),
  (VTBL_ENTRY)&_ZN6E19x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G19x12y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv),
};
extern VTBL_ENTRY _ZTV8G19x12y6[];
extern void _ZN6E19x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x12__8G19x12y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x12[0]),
  (VTBL_ENTRY)&_ZN6E19x123fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C196E19x12__8G19x12y6[] = {
  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__3C196E19x12__8G19x12y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv)();
extern void ABISELECT(_ZThn32_N6E19x123fooEv,_ZThn24_N6E19x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x12__8G19x12y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E19x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv),
};
static  VTT_ENTRY vtt_G19x12y6[] = {
  {&(_ZTV8G19x12y6[4]),  4,9},
  {&(_tg__ZTV6E19x12__8G19x12y6[3]),  3,4},
  {&(_tg__ZTV3C196E19x12__8G19x12y6[3]),  3,4},
  {&(_tg__ZTV2A1__3C196E19x12__8G19x12y6[3]),  3,4},
  {&(_tg__ZTV2A1__6E19x12__8G19x12y6[3]),  3,4},
  {&(_ZTV8G19x12y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G19x12y6[];
extern  VTBL_ENTRY _ZTV8G19x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x12y6[];
static VTBL_ENTRY alt_thunk_names78[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x123fooEv,_ZThn24_N6E19x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x123fooEv,_ZThn24_N6E19x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x12y6 = {  "G19x12y6", // class name
  bases_G19x12y6, 6,
  &(vtc_G19x12y6[0]), // expected_vtbl_contents
  &(vtt_G19x12y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G19x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x12y6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x12y6),6, //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  G19x12y7  : virtual E19x12 , virtual F0 {
  int ff;
  ~G19x12y7(); // tgen
  G19x12y7(); // tgen
};
//SIG(1 G19x12y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G19x12y7 ::~G19x12y7(){ note_dtor("G19x12y7", this);} // tgen
G19x12y7 ::G19x12y7(){ note_ctor("G19x12y7", this);} // tgen

static void Test_G19x12y7()
{
  extern Class_Descriptor cd_G19x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x12y7, buf);
    G19x12y7 *dp, &lv = *(dp=new (buf) G19x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x12y7)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x12*), ABISELECT(40,28), "G19x12y7");
    check_base_class_offset(lv, (B0*)(C19*)(E19x12*), ABISELECT(24,12), "G19x12y7");
    check_base_class_offset(lv, (C19*)(E19x12*), ABISELECT(16,8), "G19x12y7");
    check_base_class_offset(lv, (D0*)(E19x12*), ABISELECT(32,20), "G19x12y7");
    check_base_class_offset(lv, (E19x12*), ABISELECT(16,8), "G19x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G19x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G19x12y7.ff");
    test_class_info(&lv, &cd_G19x12y7);
    dp->~G19x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x12y7(Test_G19x12y7, "G19x12y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G19x12y7C1Ev();
extern void _ZN8G19x12y7D1Ev();
Name_Map name_map_G19x12y7[] = {
  NSPAIR(_ZN8G19x12y7C1Ev),
  NSPAIR(_ZN8G19x12y7D1Ev),
  {0,0}
};
extern Class_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_E19x12;
extern VTBL_ENTRY _ZTI6E19x12[];
extern  VTBL_ENTRY _ZTV6E19x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x12y7[] = {
  // 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_E19x12,    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 _ZTI8G19x12y7[];
extern void _ZN6E19x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv)();
extern void ABISELECT(_ZThn24_N6E19x123fooEv,_ZThn20_N6E19x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x12y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G19x12y7[0]),
  (VTBL_ENTRY)&_ZN6E19x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G19x12y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv),
};
extern VTBL_ENTRY _ZTV8G19x12y7[];
extern void _ZN6E19x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x12__8G19x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x12[0]),
  (VTBL_ENTRY)&_ZN6E19x123fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C196E19x12__8G19x12y7[] = {
  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__3C196E19x12__8G19x12y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv)();
extern void ABISELECT(_ZThn24_N6E19x123fooEv,_ZThn20_N6E19x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x12__8G19x12y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E19x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv),
};
static  VTT_ENTRY vtt_G19x12y7[] = {
  {&(_ZTV8G19x12y7[5]),  5,14},
  {&(_ZTV8G19x12y7[9]),  9,14},
  {&(_ZTV8G19x12y7[13]),  13,14},
  {&(_tg__ZTV6E19x12__8G19x12y7[3]),  3,4},
  {&(_tg__ZTV3C196E19x12__8G19x12y7[3]),  3,4},
  {&(_tg__ZTV2A1__3C196E19x12__8G19x12y7[3]),  3,4},
  {&(_tg__ZTV2A1__6E19x12__8G19x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x12y7[];
extern  VTBL_ENTRY _ZTV8G19x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x12y7[];
static VTBL_ENTRY alt_thunk_names79[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x123fooEv,_ZTv0_n12_N6E19x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x123fooEv,_ZThn20_N6E19x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x123fooEv,_ZThn20_N6E19x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x12y7 = {  "G19x12y7", // class name
  bases_G19x12y7, 6,
  &(vtc_G19x12y7[0]), // expected_vtbl_contents
  &(vtt_G19x12y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G19x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x12y7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x12y7),7, //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  E20x12  : C20 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E20x123fooEv
  ~E20x12(); // tgen
  E20x12(); // tgen
};
//SIG(-1 E20x12) C1{ BC2{ BC3{ Fi} BC4{ v1 Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E20x12 ::foo(){vfunc_called(this, "_ZN6E20x123fooEv");}
E20x12 ::~E20x12(){ note_dtor("E20x12", this);} // tgen
E20x12 ::E20x12(){ note_ctor("E20x12", this);} // tgen

static void Test_E20x12()
{
  extern Class_Descriptor cd_E20x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E20x12, buf);
    E20x12 *dp, &lv = *(dp=new (buf) E20x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E20x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E20x12)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(12,8), "E20x12");
    check_base_class_offset(lv, (B1*)(C20*), 0, "E20x12");
    check_base_class_offset(lv, (C20*), 0, "E20x12");
    check_base_class_offset(lv, (D0*), ABISELECT(20,16), "E20x12");
    check_field_offset(lv, fd, ABISELECT(24,20), "E20x12.fd");
    test_class_info(&lv, &cd_E20x12);
    dp->~E20x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE20x12(Test_E20x12, "E20x12", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6E20x12C1Ev();
extern void _ZN6E20x12D1Ev();
Name_Map name_map_E20x12[] = {
  NSPAIR(_ZN6E20x12C1Ev),
  NSPAIR(_ZN6E20x12D1Ev),
  {0,0}
};
extern Class_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_E20x12[] = {
  // 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(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 _ZTI6E20x12[];
extern void _ZN6E20x123fooEv();
static  VTBL_ENTRY vtc_E20x12[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6E20x12[0]),
  (VTBL_ENTRY)&_ZN6E20x123fooEv,
};
extern VTBL_ENTRY _ZTI6E20x12[];
extern  VTBL_ENTRY _ZTV6E20x12[];
Class_Descriptor cd_E20x12 = {  "E20x12", // class name
  bases_E20x12, 4,
  &(vtc_E20x12[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6E20x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E20x12),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  G20x12y0  : E20x12 , F1 {
  int ff;
  ~G20x12y0(); // tgen
  G20x12y0(); // tgen
};
//SIG(1 G20x12y0) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G20x12y0 ::~G20x12y0(){ note_dtor("G20x12y0", this);} // tgen
G20x12y0 ::G20x12y0(){ note_ctor("G20x12y0", this);} // tgen

static void Test_G20x12y0()
{
  extern Class_Descriptor cd_G20x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x12y0, buf);
    G20x12y0 *dp, &lv = *(dp=new (buf) G20x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x12y0)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x12*), ABISELECT(12,8), "G20x12y0");
    check_base_class_offset(lv, (B1*)(C20*)(E20x12*), 0, "G20x12y0");
    check_base_class_offset(lv, (C20*)(E20x12*), 0, "G20x12y0");
    check_base_class_offset(lv, (D0*)(E20x12*), ABISELECT(20,16), "G20x12y0");
    check_base_class_offset(lv, (E20x12*), 0, "G20x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(32,24), "G20x12y0");
    check_field_offset(lv, ff, ABISELECT(44,32), "G20x12y0.ff");
    test_class_info(&lv, &cd_G20x12y0);
    dp->~G20x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x12y0(Test_G20x12y0, "G20x12y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G20x12y0C1Ev();
extern void _ZN8G20x12y0D1Ev();
Name_Map name_map_G20x12y0[] = {
  NSPAIR(_ZN8G20x12y0C1Ev),
  NSPAIR(_ZN8G20x12y0D1Ev),
  {0,0}
};
extern Class_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_E20x12;
extern VTBL_ENTRY _ZTI6E20x12[];
extern  VTBL_ENTRY _ZTV6E20x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x12y0[] = {
  // 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_E20x12,    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_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 _ZTI8G20x12y0[];
extern void _ZN6E20x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x12y0[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8G20x12y0[0]),
  (VTBL_ENTRY)&_ZN6E20x123fooEv,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G20x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTI8G20x12y0[];
extern  VTBL_ENTRY _ZTV8G20x12y0[];
Class_Descriptor cd_G20x12y0 = {  "G20x12y0", // class name
  bases_G20x12y0, 6,
  &(vtc_G20x12y0[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G20x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x12y0),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  G20x12y1  : virtual E20x12 , F1 {
  int ff;
  ~G20x12y1(); // tgen
  G20x12y1(); // tgen
};
//SIG(1 G20x12y1) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G20x12y1 ::~G20x12y1(){ note_dtor("G20x12y1", this);} // tgen
G20x12y1 ::G20x12y1(){ note_ctor("G20x12y1", this);} // tgen

static void Test_G20x12y1()
{
  extern Class_Descriptor cd_G20x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x12y1, buf);
    G20x12y1 *dp, &lv = *(dp=new (buf) G20x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x12y1)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x12*), ABISELECT(28,20), "G20x12y1");
    check_base_class_offset(lv, (B1*)(C20*)(E20x12*), ABISELECT(16,12), "G20x12y1");
    check_base_class_offset(lv, (C20*)(E20x12*), ABISELECT(16,12), "G20x12y1");
    check_base_class_offset(lv, (D0*)(E20x12*), ABISELECT(36,28), "G20x12y1");
    check_base_class_offset(lv, (E20x12*), ABISELECT(16,12), "G20x12y1");
    check_base_class_offset(lv, (F1*), 0, "G20x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x12y1.ff");
    test_class_info(&lv, &cd_G20x12y1);
    dp->~G20x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x12y1(Test_G20x12y1, "G20x12y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G20x12y1C1Ev();
extern void _ZN8G20x12y1D1Ev();
Name_Map name_map_G20x12y1[] = {
  NSPAIR(_ZN8G20x12y1C1Ev),
  NSPAIR(_ZN8G20x12y1D1Ev),
  {0,0}
};
extern Class_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_E20x12;
extern VTBL_ENTRY _ZTI6E20x12[];
extern  VTBL_ENTRY _ZTV6E20x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x12y1[] = {
  // 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(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_E20x12,    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
    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 _ZTI8G20x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E20x123fooEv();
static  VTBL_ENTRY vtc_G20x12y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G20x12y1[0]),
  (VTBL_ENTRY)&_ZN6E20x123fooEv,
};
extern VTBL_ENTRY _ZTV8G20x12y1[];
static  VTT_ENTRY vtt_G20x12y1[] = {
  {&(_ZTV8G20x12y1[3]),  3,8},
  {&(_ZTV8G20x12y1[7]),  7,8},
};
extern VTBL_ENTRY _ZTI8G20x12y1[];
extern  VTBL_ENTRY _ZTV8G20x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x12y1[];
Class_Descriptor cd_G20x12y1 = {  "G20x12y1", // class name
  bases_G20x12y1, 6,
  &(vtc_G20x12y1[0]), // expected_vtbl_contents
  &(vtt_G20x12y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G20x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x12y1),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x12y1),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  G20x12y2  : E20x12 , virtual F1 {
  int ff;
  ~G20x12y2(); // tgen
  G20x12y2(); // tgen
};
//SIG(1 G20x12y2) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G20x12y2 ::~G20x12y2(){ note_dtor("G20x12y2", this);} // tgen
G20x12y2 ::G20x12y2(){ note_ctor("G20x12y2", this);} // tgen

static void Test_G20x12y2()
{
  extern Class_Descriptor cd_G20x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x12y2, buf);
    G20x12y2 *dp, &lv = *(dp=new (buf) G20x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x12y2)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x12*), ABISELECT(12,8), "G20x12y2");
    check_base_class_offset(lv, (B1*)(C20*)(E20x12*), 0, "G20x12y2");
    check_base_class_offset(lv, (C20*)(E20x12*), 0, "G20x12y2");
    check_base_class_offset(lv, (D0*)(E20x12*), ABISELECT(20,16), "G20x12y2");
    check_base_class_offset(lv, (E20x12*), 0, "G20x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G20x12y2");
    check_field_offset(lv, ff, ABISELECT(28,24), "G20x12y2.ff");
    test_class_info(&lv, &cd_G20x12y2);
    dp->~G20x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x12y2(Test_G20x12y2, "G20x12y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G20x12y2C1Ev();
extern void _ZN8G20x12y2D1Ev();
Name_Map name_map_G20x12y2[] = {
  NSPAIR(_ZN8G20x12y2C1Ev),
  NSPAIR(_ZN8G20x12y2D1Ev),
  {0,0}
};
extern Class_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_E20x12;
extern VTBL_ENTRY _ZTI6E20x12[];
extern  VTBL_ENTRY _ZTV6E20x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x12y2[] = {
  // 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_E20x12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI8G20x12y2[];
extern void _ZN6E20x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x12y2[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x12y2[0]),
  (VTBL_ENTRY)&_ZN6E20x123fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G20x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G20x12y2[];
static  VTT_ENTRY vtt_G20x12y2[] = {
  {&(_ZTV8G20x12y2[3]),  3,8},
  {&(_ZTV8G20x12y2[7]),  7,8},
};
extern VTBL_ENTRY _ZTI8G20x12y2[];
extern  VTBL_ENTRY _ZTV8G20x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x12y2[];
Class_Descriptor cd_G20x12y2 = {  "G20x12y2", // class name
  bases_G20x12y2, 6,
  &(vtc_G20x12y2[0]), // expected_vtbl_contents
  &(vtt_G20x12y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G20x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x12y2),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x12y2),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  G20x12y3  : virtual E20x12 , virtual F1 {
  int ff;
  ~G20x12y3(); // tgen
  G20x12y3(); // tgen
};
//SIG(1 G20x12y3) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G20x12y3 ::~G20x12y3(){ note_dtor("G20x12y3", this);} // tgen
G20x12y3 ::G20x12y3(){ note_ctor("G20x12y3", this);} // tgen

static void Test_G20x12y3()
{
  extern Class_Descriptor cd_G20x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G20x12y3, buf);
    G20x12y3 *dp, &lv = *(dp=new (buf) G20x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G20x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x12y3)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x12*), ABISELECT(28,16), "G20x12y3");
    check_base_class_offset(lv, (B1*)(C20*)(E20x12*), ABISELECT(16,8), "G20x12y3");
    check_base_class_offset(lv, (C20*)(E20x12*), ABISELECT(16,8), "G20x12y3");
    check_base_class_offset(lv, (D0*)(E20x12*), ABISELECT(36,24), "G20x12y3");
    check_base_class_offset(lv, (E20x12*), ABISELECT(16,8), "G20x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G20x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G20x12y3.ff");
    test_class_info(&lv, &cd_G20x12y3);
    dp->~G20x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x12y3(Test_G20x12y3, "G20x12y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G20x12y3C1Ev();
extern void _ZN8G20x12y3D1Ev();
Name_Map name_map_G20x12y3[] = {
  NSPAIR(_ZN8G20x12y3C1Ev),
  NSPAIR(_ZN8G20x12y3D1Ev),
  {0,0}
};
extern Class_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_E20x12;
extern VTBL_ENTRY _ZTI6E20x12[];
extern  VTBL_ENTRY _ZTV6E20x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x12y3[] = {
  // 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(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_E20x12,    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_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 _ZTI8G20x12y3[];
extern void _ZN6E20x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x12y3[] = {
  ABISELECT(48,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x12y3[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G20x12y3[0]),
  (VTBL_ENTRY)&_ZN6E20x123fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G20x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G20x12y3[];
static  VTT_ENTRY vtt_G20x12y3[] = {
  {&(_ZTV8G20x12y3[4]),  4,12},
  {&(_ZTV8G20x12y3[7]),  7,12},
  {&(_ZTV8G20x12y3[11]),  11,12},
};
extern VTBL_ENTRY _ZTI8G20x12y3[];
extern  VTBL_ENTRY _ZTV8G20x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x12y3[];
Class_Descriptor cd_G20x12y3 = {  "G20x12y3", // class name
  bases_G20x12y3, 6,
  &(vtc_G20x12y3[0]), // expected_vtbl_contents
  &(vtt_G20x12y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G20x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x12y3),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x12y3),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  G20x12y4  : E20x12 , F0 {
  int ff;
  ~G20x12y4(); // tgen
  G20x12y4(); // tgen
};
//SIG(1 G20x12y4) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G20x12y4 ::~G20x12y4(){ note_dtor("G20x12y4", this);} // tgen
G20x12y4 ::G20x12y4(){ note_ctor("G20x12y4", this);} // tgen

static void Test_G20x12y4()
{
  extern Class_Descriptor cd_G20x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G20x12y4, buf);
    G20x12y4 *dp, &lv = *(dp=new (buf) G20x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G20x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x12y4)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x12*), ABISELECT(12,8), "G20x12y4");
    check_base_class_offset(lv, (B1*)(C20*)(E20x12*), 0, "G20x12y4");
    check_base_class_offset(lv, (C20*)(E20x12*), 0, "G20x12y4");
    check_base_class_offset(lv, (D0*)(E20x12*), ABISELECT(20,16), "G20x12y4");
    check_base_class_offset(lv, (E20x12*), 0, "G20x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(28,24), "G20x12y4");
    check_field_offset(lv, ff, ABISELECT(32,28), "G20x12y4.ff");
    test_class_info(&lv, &cd_G20x12y4);
    dp->~G20x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x12y4(Test_G20x12y4, "G20x12y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G20x12y4C1Ev();
extern void _ZN8G20x12y4D1Ev();
Name_Map name_map_G20x12y4[] = {
  NSPAIR(_ZN8G20x12y4C1Ev),
  NSPAIR(_ZN8G20x12y4D1Ev),
  {0,0}
};
extern Class_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_E20x12;
extern VTBL_ENTRY _ZTI6E20x12[];
extern  VTBL_ENTRY _ZTV6E20x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x12y4[] = {
  // 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_E20x12,    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_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 _ZTI8G20x12y4[];
extern void _ZN6E20x123fooEv();
static  VTBL_ENTRY vtc_G20x12y4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8G20x12y4[0]),
  (VTBL_ENTRY)&_ZN6E20x123fooEv,
};
extern VTBL_ENTRY _ZTI8G20x12y4[];
extern  VTBL_ENTRY _ZTV8G20x12y4[];
Class_Descriptor cd_G20x12y4 = {  "G20x12y4", // class name
  bases_G20x12y4, 6,
  &(vtc_G20x12y4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G20x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x12y4),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  G20x12y5  : virtual E20x12 , F0 {
  int ff;
  ~G20x12y5(); // tgen
  G20x12y5(); // tgen
};
//SIG(1 G20x12y5) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G20x12y5 ::~G20x12y5(){ note_dtor("G20x12y5", this);} // tgen
G20x12y5 ::G20x12y5(){ note_ctor("G20x12y5", this);} // tgen

static void Test_G20x12y5()
{
  extern Class_Descriptor cd_G20x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x12y5, buf);
    G20x12y5 *dp, &lv = *(dp=new (buf) G20x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x12y5)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x12*), ABISELECT(28,20), "G20x12y5");
    check_base_class_offset(lv, (B1*)(C20*)(E20x12*), ABISELECT(16,12), "G20x12y5");
    check_base_class_offset(lv, (C20*)(E20x12*), ABISELECT(16,12), "G20x12y5");
    check_base_class_offset(lv, (D0*)(E20x12*), ABISELECT(36,28), "G20x12y5");
    check_base_class_offset(lv, (E20x12*), ABISELECT(16,12), "G20x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G20x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x12y5.ff");
    test_class_info(&lv, &cd_G20x12y5);
    dp->~G20x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x12y5(Test_G20x12y5, "G20x12y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G20x12y5C1Ev();
extern void _ZN8G20x12y5D1Ev();
Name_Map name_map_G20x12y5[] = {
  NSPAIR(_ZN8G20x12y5C1Ev),
  NSPAIR(_ZN8G20x12y5D1Ev),
  {0,0}
};
extern Class_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_E20x12;
extern VTBL_ENTRY _ZTI6E20x12[];
extern  VTBL_ENTRY _ZTV6E20x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x12y5[] = {
  // 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(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_E20x12,    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_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 _ZTI8G20x12y5[];
extern void _ZN6E20x123fooEv();
static  VTBL_ENTRY vtc_G20x12y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x12y5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G20x12y5[0]),
  (VTBL_ENTRY)&_ZN6E20x123fooEv,
};
extern VTBL_ENTRY _ZTV8G20x12y5[];
static  VTT_ENTRY vtt_G20x12y5[] = {
  {&(_ZTV8G20x12y5[3]),  3,7},
  {&(_ZTV8G20x12y5[6]),  6,7},
};
extern VTBL_ENTRY _ZTI8G20x12y5[];
extern  VTBL_ENTRY _ZTV8G20x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x12y5[];
Class_Descriptor cd_G20x12y5 = {  "G20x12y5", // class name
  bases_G20x12y5, 6,
  &(vtc_G20x12y5[0]), // expected_vtbl_contents
  &(vtt_G20x12y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G20x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x12y5),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x12y5),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  G20x12y6  : E20x12 , virtual F0 {
  int ff;
  ~G20x12y6(); // tgen
  G20x12y6(); // tgen
};
//SIG(1 G20x12y6) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G20x12y6 ::~G20x12y6(){ note_dtor("G20x12y6", this);} // tgen
G20x12y6 ::G20x12y6(){ note_ctor("G20x12y6", this);} // tgen

static void Test_G20x12y6()
{
  extern Class_Descriptor cd_G20x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G20x12y6, buf);
    G20x12y6 *dp, &lv = *(dp=new (buf) G20x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G20x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x12y6)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x12*), ABISELECT(12,8), "G20x12y6");
    check_base_class_offset(lv, (B1*)(C20*)(E20x12*), 0, "G20x12y6");
    check_base_class_offset(lv, (C20*)(E20x12*), 0, "G20x12y6");
    check_base_class_offset(lv, (D0*)(E20x12*), ABISELECT(20,16), "G20x12y6");
    check_base_class_offset(lv, (E20x12*), 0, "G20x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G20x12y6");
    check_field_offset(lv, ff, ABISELECT(28,24), "G20x12y6.ff");
    test_class_info(&lv, &cd_G20x12y6);
    dp->~G20x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x12y6(Test_G20x12y6, "G20x12y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G20x12y6C1Ev();
extern void _ZN8G20x12y6D1Ev();
Name_Map name_map_G20x12y6[] = {
  NSPAIR(_ZN8G20x12y6C1Ev),
  NSPAIR(_ZN8G20x12y6D1Ev),
  {0,0}
};
extern Class_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_E20x12;
extern VTBL_ENTRY _ZTI6E20x12[];
extern  VTBL_ENTRY _ZTV6E20x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x12y6[] = {
  // 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_E20x12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI8G20x12y6[];
extern void _ZN6E20x123fooEv();
static  VTBL_ENTRY vtc_G20x12y6[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x12y6[0]),
  (VTBL_ENTRY)&_ZN6E20x123fooEv,
};
extern VTBL_ENTRY _ZTV8G20x12y6[];
static  VTT_ENTRY vtt_G20x12y6[] = {
  {&(_ZTV8G20x12y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G20x12y6[];
extern  VTBL_ENTRY _ZTV8G20x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x12y6[];
Class_Descriptor cd_G20x12y6 = {  "G20x12y6", // class name
  bases_G20x12y6, 6,
  &(vtc_G20x12y6[0]), // expected_vtbl_contents
  &(vtt_G20x12y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G20x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x12y6),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x12y6),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  G20x12y7  : virtual E20x12 , virtual F0 {
  int ff;
  ~G20x12y7(); // tgen
  G20x12y7(); // tgen
};
//SIG(1 G20x12y7) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G20x12y7 ::~G20x12y7(){ note_dtor("G20x12y7", this);} // tgen
G20x12y7 ::G20x12y7(){ note_ctor("G20x12y7", this);} // tgen

static void Test_G20x12y7()
{
  extern Class_Descriptor cd_G20x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x12y7, buf);
    G20x12y7 *dp, &lv = *(dp=new (buf) G20x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x12y7)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x12*), ABISELECT(28,16), "G20x12y7");
    check_base_class_offset(lv, (B1*)(C20*)(E20x12*), ABISELECT(16,8), "G20x12y7");
    check_base_class_offset(lv, (C20*)(E20x12*), ABISELECT(16,8), "G20x12y7");
    check_base_class_offset(lv, (D0*)(E20x12*), ABISELECT(36,24), "G20x12y7");
    check_base_class_offset(lv, (E20x12*), ABISELECT(16,8), "G20x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G20x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G20x12y7.ff");
    test_class_info(&lv, &cd_G20x12y7);
    dp->~G20x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x12y7(Test_G20x12y7, "G20x12y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G20x12y7C1Ev();
extern void _ZN8G20x12y7D1Ev();
Name_Map name_map_G20x12y7[] = {
  NSPAIR(_ZN8G20x12y7C1Ev),
  NSPAIR(_ZN8G20x12y7D1Ev),
  {0,0}
};
extern Class_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_E20x12;
extern VTBL_ENTRY _ZTI6E20x12[];
extern  VTBL_ENTRY _ZTV6E20x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x12y7[] = {
  // 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(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_E20x12,    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_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 _ZTI8G20x12y7[];
extern void _ZN6E20x123fooEv();
static  VTBL_ENTRY vtc_G20x12y7[] = {
  ABISELECT(44,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x12y7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G20x12y7[0]),
  (VTBL_ENTRY)&_ZN6E20x123fooEv,
};
extern VTBL_ENTRY _ZTV8G20x12y7[];
static  VTT_ENTRY vtt_G20x12y7[] = {
  {&(_ZTV8G20x12y7[4]),  4,8},
  {&(_ZTV8G20x12y7[7]),  7,8},
};
extern VTBL_ENTRY _ZTI8G20x12y7[];
extern  VTBL_ENTRY _ZTV8G20x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x12y7[];
Class_Descriptor cd_G20x12y7 = {  "G20x12y7", // class name
  bases_G20x12y7, 6,
  &(vtc_G20x12y7[0]), // expected_vtbl_contents
  &(vtt_G20x12y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G20x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x12y7),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x12y7),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  E21x12  : C21 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E21x123fooEv
  ~E21x12(); // tgen
  E21x12(); // tgen
};
//SIG(-1 E21x12) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E21x12 ::foo(){vfunc_called(this, "_ZN6E21x123fooEv");}
E21x12 ::~E21x12(){ note_dtor("E21x12", this);} // tgen
E21x12 ::E21x12(){ note_ctor("E21x12", this);} // tgen

static void Test_E21x12()
{
  extern Class_Descriptor cd_E21x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E21x12, buf);
    E21x12 *dp, &lv = *(dp=new (buf) E21x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E21x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E21x12)");
    check_base_class_offset(lv, (A1*)(C21*), 0, "E21x12");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(16,8), "E21x12");
    check_base_class_offset(lv, (C21*), 0, "E21x12");
    check_base_class_offset(lv, (D0*), ABISELECT(32,20), "E21x12");
    check_field_offset(lv, fd, ABISELECT(36,24), "E21x12.fd");
    test_class_info(&lv, &cd_E21x12);
    dp->~E21x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE21x12(Test_E21x12, "E21x12", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E21x12C1Ev();
extern void _ZN6E21x12D1Ev();
Name_Map name_map_E21x12[] = {
  NSPAIR(_ZN6E21x12C1Ev),
  NSPAIR(_ZN6E21x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x12[] = {
  // 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
    -1, //bcp->virtual_function_table_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 _ZTI6E21x12[];
extern void _ZN6E21x123fooEv();
extern void ABISELECT(_ZThn16_N6E21x123fooEv,_ZThn8_N6E21x123fooEv)();
static  VTBL_ENTRY vtc_E21x12[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6E21x12[0]),
  (VTBL_ENTRY)&_ZN6E21x123fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E21x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N6E21x123fooEv,_ZThn8_N6E21x123fooEv),
};
extern VTBL_ENTRY _ZTI6E21x12[];
extern  VTBL_ENTRY _ZTV6E21x12[];
Class_Descriptor cd_E21x12 = {  "E21x12", // class name
  bases_E21x12, 4,
  &(vtc_E21x12[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E21x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E21x12),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  G21x12y0  : E21x12 , F1 {
  int ff;
  ~G21x12y0(); // tgen
  G21x12y0(); // tgen
};
//SIG(1 G21x12y0) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G21x12y0 ::~G21x12y0(){ note_dtor("G21x12y0", this);} // tgen
G21x12y0 ::G21x12y0(){ note_ctor("G21x12y0", this);} // tgen

static void Test_G21x12y0()
{
  extern Class_Descriptor cd_G21x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G21x12y0, buf);
    G21x12y0 *dp, &lv = *(dp=new (buf) G21x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G21x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x12y0)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x12*), 0, "G21x12y0");
    check_base_class_offset(lv, (B1*)(C21*)(E21x12*), ABISELECT(16,8), "G21x12y0");
    check_base_class_offset(lv, (C21*)(E21x12*), 0, "G21x12y0");
    check_base_class_offset(lv, (D0*)(E21x12*), ABISELECT(32,20), "G21x12y0");
    check_base_class_offset(lv, (E21x12*), 0, "G21x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(40,28), "G21x12y0");
    check_field_offset(lv, ff, ABISELECT(52,36), "G21x12y0.ff");
    test_class_info(&lv, &cd_G21x12y0);
    dp->~G21x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x12y0(Test_G21x12y0, "G21x12y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G21x12y0C1Ev();
extern void _ZN8G21x12y0D1Ev();
Name_Map name_map_G21x12y0[] = {
  NSPAIR(_ZN8G21x12y0C1Ev),
  NSPAIR(_ZN8G21x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x12;
extern VTBL_ENTRY _ZTI6E21x12[];
extern  VTBL_ENTRY _ZTV6E21x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x12y0[] = {
  // 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
    -1, //bcp->virtual_function_table_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_E21x12,    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
    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 _ZTI8G21x12y0[];
extern void _ZN6E21x123fooEv();
extern void ABISELECT(_ZThn16_N6E21x123fooEv,_ZThn8_N6E21x123fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x12y0[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8G21x12y0[0]),
  (VTBL_ENTRY)&_ZN6E21x123fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G21x12y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N6E21x123fooEv,_ZThn8_N6E21x123fooEv),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G21x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTI8G21x12y0[];
extern  VTBL_ENTRY _ZTV8G21x12y0[];
Class_Descriptor cd_G21x12y0 = {  "G21x12y0", // class name
  bases_G21x12y0, 6,
  &(vtc_G21x12y0[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G21x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x12y0),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  G21x12y1  : virtual E21x12 , F1 {
  int ff;
  ~G21x12y1(); // tgen
  G21x12y1(); // tgen
};
//SIG(1 G21x12y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G21x12y1 ::~G21x12y1(){ note_dtor("G21x12y1", this);} // tgen
G21x12y1 ::G21x12y1(){ note_ctor("G21x12y1", this);} // tgen

static void Test_G21x12y1()
{
  extern Class_Descriptor cd_G21x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G21x12y1, buf);
    G21x12y1 *dp, &lv = *(dp=new (buf) G21x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G21x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x12y1)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x12*), ABISELECT(16,12), "G21x12y1");
    check_base_class_offset(lv, (B1*)(C21*)(E21x12*), ABISELECT(32,20), "G21x12y1");
    check_base_class_offset(lv, (C21*)(E21x12*), ABISELECT(16,12), "G21x12y1");
    check_base_class_offset(lv, (D0*)(E21x12*), ABISELECT(48,32), "G21x12y1");
    check_base_class_offset(lv, (E21x12*), ABISELECT(16,12), "G21x12y1");
    check_base_class_offset(lv, (F1*), 0, "G21x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x12y1.ff");
    test_class_info(&lv, &cd_G21x12y1);
    dp->~G21x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x12y1(Test_G21x12y1, "G21x12y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G21x12y1C1Ev();
extern void _ZN8G21x12y1D1Ev();
Name_Map name_map_G21x12y1[] = {
  NSPAIR(_ZN8G21x12y1C1Ev),
  NSPAIR(_ZN8G21x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x12;
extern VTBL_ENTRY _ZTI6E21x12[];
extern  VTBL_ENTRY _ZTV6E21x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x12y1[] = {
  // 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
    -1, //bcp->virtual_function_table_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_E21x12,    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
    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 _ZTI8G21x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E21x123fooEv();
extern void ABISELECT(_ZThn16_N6E21x123fooEv,_ZThn8_N6E21x123fooEv)();
static  VTBL_ENTRY vtc_G21x12y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G21x12y1[0]),
  (VTBL_ENTRY)&_ZN6E21x123fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G21x12y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N6E21x123fooEv,_ZThn8_N6E21x123fooEv),
};
extern VTBL_ENTRY _ZTV8G21x12y1[];
static  VTT_ENTRY vtt_G21x12y1[] = {
  {&(_ZTV8G21x12y1[3]),  3,11},
  {&(_ZTV8G21x12y1[7]),  7,11},
  {&(_ZTV8G21x12y1[10]),  10,11},
};
extern VTBL_ENTRY _ZTI8G21x12y1[];
extern  VTBL_ENTRY _ZTV8G21x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x12y1[];
Class_Descriptor cd_G21x12y1 = {  "G21x12y1", // class name
  bases_G21x12y1, 6,
  &(vtc_G21x12y1[0]), // expected_vtbl_contents
  &(vtt_G21x12y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G21x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x12y1),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x12y1),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  G21x12y2  : E21x12 , virtual F1 {
  int ff;
  ~G21x12y2(); // tgen
  G21x12y2(); // tgen
};
//SIG(1 G21x12y2) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G21x12y2 ::~G21x12y2(){ note_dtor("G21x12y2", this);} // tgen
G21x12y2 ::G21x12y2(){ note_ctor("G21x12y2", this);} // tgen

static void Test_G21x12y2()
{
  extern Class_Descriptor cd_G21x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G21x12y2, buf);
    G21x12y2 *dp, &lv = *(dp=new (buf) G21x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G21x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x12y2)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x12*), 0, "G21x12y2");
    check_base_class_offset(lv, (B1*)(C21*)(E21x12*), ABISELECT(16,8), "G21x12y2");
    check_base_class_offset(lv, (C21*)(E21x12*), 0, "G21x12y2");
    check_base_class_offset(lv, (D0*)(E21x12*), ABISELECT(32,20), "G21x12y2");
    check_base_class_offset(lv, (E21x12*), 0, "G21x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G21x12y2");
    check_field_offset(lv, ff, ABISELECT(40,28), "G21x12y2.ff");
    test_class_info(&lv, &cd_G21x12y2);
    dp->~G21x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x12y2(Test_G21x12y2, "G21x12y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G21x12y2C1Ev();
extern void _ZN8G21x12y2D1Ev();
Name_Map name_map_G21x12y2[] = {
  NSPAIR(_ZN8G21x12y2C1Ev),
  NSPAIR(_ZN8G21x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x12;
extern VTBL_ENTRY _ZTI6E21x12[];
extern  VTBL_ENTRY _ZTV6E21x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x12y2[] = {
  // 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_E21x12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI8G21x12y2[];
extern void _ZN6E21x123fooEv();
extern void ABISELECT(_ZThn16_N6E21x123fooEv,_ZThn8_N6E21x123fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x12y2[] = {
  ABISELECT(48,32),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x12y2[0]),
  (VTBL_ENTRY)&_ZN6E21x123fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G21x12y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N6E21x123fooEv,_ZThn8_N6E21x123fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G21x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G21x12y2[];
static  VTT_ENTRY vtt_G21x12y2[] = {
  {&(_ZTV8G21x12y2[3]),  3,11},
  {&(_ZTV8G21x12y2[10]),  10,11},
};
extern VTBL_ENTRY _ZTI8G21x12y2[];
extern  VTBL_ENTRY _ZTV8G21x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x12y2[];
Class_Descriptor cd_G21x12y2 = {  "G21x12y2", // class name
  bases_G21x12y2, 6,
  &(vtc_G21x12y2[0]), // expected_vtbl_contents
  &(vtt_G21x12y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G21x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x12y2),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x12y2),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  G21x12y3  : virtual E21x12 , virtual F1 {
  int ff;
  ~G21x12y3(); // tgen
  G21x12y3(); // tgen
};
//SIG(1 G21x12y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G21x12y3 ::~G21x12y3(){ note_dtor("G21x12y3", this);} // tgen
G21x12y3 ::G21x12y3(){ note_ctor("G21x12y3", this);} // tgen

static void Test_G21x12y3()
{
  extern Class_Descriptor cd_G21x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G21x12y3, buf);
    G21x12y3 *dp, &lv = *(dp=new (buf) G21x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G21x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x12y3)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x12*), ABISELECT(16,8), "G21x12y3");
    check_base_class_offset(lv, (B1*)(C21*)(E21x12*), ABISELECT(32,16), "G21x12y3");
    check_base_class_offset(lv, (C21*)(E21x12*), ABISELECT(16,8), "G21x12y3");
    check_base_class_offset(lv, (D0*)(E21x12*), ABISELECT(48,28), "G21x12y3");
    check_base_class_offset(lv, (E21x12*), ABISELECT(16,8), "G21x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G21x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G21x12y3.ff");
    test_class_info(&lv, &cd_G21x12y3);
    dp->~G21x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x12y3(Test_G21x12y3, "G21x12y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G21x12y3C1Ev();
extern void _ZN8G21x12y3D1Ev();
Name_Map name_map_G21x12y3[] = {
  NSPAIR(_ZN8G21x12y3C1Ev),
  NSPAIR(_ZN8G21x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x12;
extern VTBL_ENTRY _ZTI6E21x12[];
extern  VTBL_ENTRY _ZTV6E21x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x12y3[] = {
  // 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
    -1, //bcp->virtual_function_table_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_E21x12,    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
    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 _ZTI8G21x12y3[];
extern void _ZN6E21x123fooEv();
extern void ABISELECT(_ZThn16_N6E21x123fooEv,_ZThn8_N6E21x123fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x12y3[] = {
  ABISELECT(56,36),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x12y3[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G21x12y3[0]),
  (VTBL_ENTRY)&_ZN6E21x123fooEv,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G21x12y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N6E21x123fooEv,_ZThn8_N6E21x123fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G21x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G21x12y3[];
static  VTT_ENTRY vtt_G21x12y3[] = {
  {&(_ZTV8G21x12y3[4]),  4,15},
  {&(_ZTV8G21x12y3[7]),  7,15},
  {&(_ZTV8G21x12y3[10]),  10,15},
  {&(_ZTV8G21x12y3[14]),  14,15},
};
extern VTBL_ENTRY _ZTI8G21x12y3[];
extern  VTBL_ENTRY _ZTV8G21x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x12y3[];
Class_Descriptor cd_G21x12y3 = {  "G21x12y3", // class name
  bases_G21x12y3, 6,
  &(vtc_G21x12y3[0]), // expected_vtbl_contents
  &(vtt_G21x12y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G21x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x12y3),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x12y3),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  G21x12y4  : E21x12 , F0 {
  int ff;
  ~G21x12y4(); // tgen
  G21x12y4(); // tgen
};
//SIG(1 G21x12y4) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G21x12y4 ::~G21x12y4(){ note_dtor("G21x12y4", this);} // tgen
G21x12y4 ::G21x12y4(){ note_ctor("G21x12y4", this);} // tgen

static void Test_G21x12y4()
{
  extern Class_Descriptor cd_G21x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G21x12y4, buf);
    G21x12y4 *dp, &lv = *(dp=new (buf) G21x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G21x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x12y4)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x12*), 0, "G21x12y4");
    check_base_class_offset(lv, (B1*)(C21*)(E21x12*), ABISELECT(16,8), "G21x12y4");
    check_base_class_offset(lv, (C21*)(E21x12*), 0, "G21x12y4");
    check_base_class_offset(lv, (D0*)(E21x12*), ABISELECT(32,20), "G21x12y4");
    check_base_class_offset(lv, (E21x12*), 0, "G21x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(40,28), "G21x12y4");
    check_field_offset(lv, ff, ABISELECT(44,32), "G21x12y4.ff");
    test_class_info(&lv, &cd_G21x12y4);
    dp->~G21x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x12y4(Test_G21x12y4, "G21x12y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G21x12y4C1Ev();
extern void _ZN8G21x12y4D1Ev();
Name_Map name_map_G21x12y4[] = {
  NSPAIR(_ZN8G21x12y4C1Ev),
  NSPAIR(_ZN8G21x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x12;
extern VTBL_ENTRY _ZTI6E21x12[];
extern  VTBL_ENTRY _ZTV6E21x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x12y4[] = {
  // 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
    -1, //bcp->virtual_function_table_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_E21x12,    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
    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 _ZTI8G21x12y4[];
extern void _ZN6E21x123fooEv();
extern void ABISELECT(_ZThn16_N6E21x123fooEv,_ZThn8_N6E21x123fooEv)();
static  VTBL_ENTRY vtc_G21x12y4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI8G21x12y4[0]),
  (VTBL_ENTRY)&_ZN6E21x123fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G21x12y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N6E21x123fooEv,_ZThn8_N6E21x123fooEv),
};
extern VTBL_ENTRY _ZTI8G21x12y4[];
extern  VTBL_ENTRY _ZTV8G21x12y4[];
Class_Descriptor cd_G21x12y4 = {  "G21x12y4", // class name
  bases_G21x12y4, 6,
  &(vtc_G21x12y4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G21x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x12y4),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  G21x12y5  : virtual E21x12 , F0 {
  int ff;
  ~G21x12y5(); // tgen
  G21x12y5(); // tgen
};
//SIG(1 G21x12y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G21x12y5 ::~G21x12y5(){ note_dtor("G21x12y5", this);} // tgen
G21x12y5 ::G21x12y5(){ note_ctor("G21x12y5", this);} // tgen

static void Test_G21x12y5()
{
  extern Class_Descriptor cd_G21x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G21x12y5, buf);
    G21x12y5 *dp, &lv = *(dp=new (buf) G21x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G21x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x12y5)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x12*), ABISELECT(16,12), "G21x12y5");
    check_base_class_offset(lv, (B1*)(C21*)(E21x12*), ABISELECT(32,20), "G21x12y5");
    check_base_class_offset(lv, (C21*)(E21x12*), ABISELECT(16,12), "G21x12y5");
    check_base_class_offset(lv, (D0*)(E21x12*), ABISELECT(48,32), "G21x12y5");
    check_base_class_offset(lv, (E21x12*), ABISELECT(16,12), "G21x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G21x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x12y5.ff");
    test_class_info(&lv, &cd_G21x12y5);
    dp->~G21x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x12y5(Test_G21x12y5, "G21x12y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G21x12y5C1Ev();
extern void _ZN8G21x12y5D1Ev();
Name_Map name_map_G21x12y5[] = {
  NSPAIR(_ZN8G21x12y5C1Ev),
  NSPAIR(_ZN8G21x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x12;
extern VTBL_ENTRY _ZTI6E21x12[];
extern  VTBL_ENTRY _ZTV6E21x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x12y5[] = {
  // 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
    -1, //bcp->virtual_function_table_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_E21x12,    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
    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 _ZTI8G21x12y5[];
extern void _ZN6E21x123fooEv();
extern void ABISELECT(_ZThn16_N6E21x123fooEv,_ZThn8_N6E21x123fooEv)();
static  VTBL_ENTRY vtc_G21x12y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x12y5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G21x12y5[0]),
  (VTBL_ENTRY)&_ZN6E21x123fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G21x12y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N6E21x123fooEv,_ZThn8_N6E21x123fooEv),
};
extern VTBL_ENTRY _ZTV8G21x12y5[];
static  VTT_ENTRY vtt_G21x12y5[] = {
  {&(_ZTV8G21x12y5[3]),  3,10},
  {&(_ZTV8G21x12y5[6]),  6,10},
  {&(_ZTV8G21x12y5[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G21x12y5[];
extern  VTBL_ENTRY _ZTV8G21x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x12y5[];
Class_Descriptor cd_G21x12y5 = {  "G21x12y5", // class name
  bases_G21x12y5, 6,
  &(vtc_G21x12y5[0]), // expected_vtbl_contents
  &(vtt_G21x12y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G21x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x12y5),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x12y5),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  G21x12y6  : E21x12 , virtual F0 {
  int ff;
  ~G21x12y6(); // tgen
  G21x12y6(); // tgen
};
//SIG(1 G21x12y6) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G21x12y6 ::~G21x12y6(){ note_dtor("G21x12y6", this);} // tgen
G21x12y6 ::G21x12y6(){ note_ctor("G21x12y6", this);} // tgen

static void Test_G21x12y6()
{
  extern Class_Descriptor cd_G21x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G21x12y6, buf);
    G21x12y6 *dp, &lv = *(dp=new (buf) G21x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G21x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x12y6)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x12*), 0, "G21x12y6");
    check_base_class_offset(lv, (B1*)(C21*)(E21x12*), ABISELECT(16,8), "G21x12y6");
    check_base_class_offset(lv, (C21*)(E21x12*), 0, "G21x12y6");
    check_base_class_offset(lv, (D0*)(E21x12*), ABISELECT(32,20), "G21x12y6");
    check_base_class_offset(lv, (E21x12*), 0, "G21x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G21x12y6");
    check_field_offset(lv, ff, ABISELECT(40,28), "G21x12y6.ff");
    test_class_info(&lv, &cd_G21x12y6);
    dp->~G21x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x12y6(Test_G21x12y6, "G21x12y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G21x12y6C1Ev();
extern void _ZN8G21x12y6D1Ev();
Name_Map name_map_G21x12y6[] = {
  NSPAIR(_ZN8G21x12y6C1Ev),
  NSPAIR(_ZN8G21x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x12;
extern VTBL_ENTRY _ZTI6E21x12[];
extern  VTBL_ENTRY _ZTV6E21x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x12y6[] = {
  // 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_E21x12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI8G21x12y6[];
extern void _ZN6E21x123fooEv();
extern void ABISELECT(_ZThn16_N6E21x123fooEv,_ZThn8_N6E21x123fooEv)();
static  VTBL_ENTRY vtc_G21x12y6[] = {
  ABISELECT(44,32),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x12y6[0]),
  (VTBL_ENTRY)&_ZN6E21x123fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G21x12y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N6E21x123fooEv,_ZThn8_N6E21x123fooEv),
};
extern VTBL_ENTRY _ZTV8G21x12y6[];
static  VTT_ENTRY vtt_G21x12y6[] = {
  {&(_ZTV8G21x12y6[3]),  3,7},
};
extern VTBL_ENTRY _ZTI8G21x12y6[];
extern  VTBL_ENTRY _ZTV8G21x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x12y6[];
Class_Descriptor cd_G21x12y6 = {  "G21x12y6", // class name
  bases_G21x12y6, 6,
  &(vtc_G21x12y6[0]), // expected_vtbl_contents
  &(vtt_G21x12y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G21x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x12y6),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x12y6),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  G21x12y7  : virtual E21x12 , virtual F0 {
  int ff;
  ~G21x12y7(); // tgen
  G21x12y7(); // tgen
};
//SIG(1 G21x12y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G21x12y7 ::~G21x12y7(){ note_dtor("G21x12y7", this);} // tgen
G21x12y7 ::G21x12y7(){ note_ctor("G21x12y7", this);} // tgen

static void Test_G21x12y7()
{
  extern Class_Descriptor cd_G21x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G21x12y7, buf);
    G21x12y7 *dp, &lv = *(dp=new (buf) G21x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G21x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x12y7)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x12*), ABISELECT(16,8), "G21x12y7");
    check_base_class_offset(lv, (B1*)(C21*)(E21x12*), ABISELECT(32,16), "G21x12y7");
    check_base_class_offset(lv, (C21*)(E21x12*), ABISELECT(16,8), "G21x12y7");
    check_base_class_offset(lv, (D0*)(E21x12*), ABISELECT(48,28), "G21x12y7");
    check_base_class_offset(lv, (E21x12*), ABISELECT(16,8), "G21x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G21x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G21x12y7.ff");
    test_class_info(&lv, &cd_G21x12y7);
    dp->~G21x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x12y7(Test_G21x12y7, "G21x12y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G21x12y7C1Ev();
extern void _ZN8G21x12y7D1Ev();
Name_Map name_map_G21x12y7[] = {
  NSPAIR(_ZN8G21x12y7C1Ev),
  NSPAIR(_ZN8G21x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x12;
extern VTBL_ENTRY _ZTI6E21x12[];
extern  VTBL_ENTRY _ZTV6E21x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x12y7[] = {
  // 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
    -1, //bcp->virtual_function_table_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_E21x12,    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
    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 _ZTI8G21x12y7[];
extern void _ZN6E21x123fooEv();
extern void ABISELECT(_ZThn16_N6E21x123fooEv,_ZThn8_N6E21x123fooEv)();
static  VTBL_ENTRY vtc_G21x12y7[] = {
  ABISELECT(56,36),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x12y7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G21x12y7[0]),
  (VTBL_ENTRY)&_ZN6E21x123fooEv,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G21x12y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N6E21x123fooEv,_ZThn8_N6E21x123fooEv),
};
extern VTBL_ENTRY _ZTV8G21x12y7[];
static  VTT_ENTRY vtt_G21x12y7[] = {
  {&(_ZTV8G21x12y7[4]),  4,11},
  {&(_ZTV8G21x12y7[7]),  7,11},
  {&(_ZTV8G21x12y7[10]),  10,11},
};
extern VTBL_ENTRY _ZTI8G21x12y7[];
extern  VTBL_ENTRY _ZTV8G21x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x12y7[];
Class_Descriptor cd_G21x12y7 = {  "G21x12y7", // class name
  bases_G21x12y7, 6,
  &(vtc_G21x12y7[0]), // expected_vtbl_contents
  &(vtt_G21x12y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G21x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x12y7),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x12y7),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  E22x12  : C22 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E22x123fooEv
  ~E22x12(); // tgen
  E22x12(); // tgen
};
//SIG(-1 E22x12) C1{ BC2{ VBC3{ Fi} BC4{ v1 Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E22x12 ::foo(){vfunc_called(this, "_ZN6E22x123fooEv");}
E22x12 ::~E22x12(){ note_dtor("E22x12", this);} // tgen
E22x12 ::E22x12(){ note_ctor("E22x12", this);} // tgen

static void Test_E22x12()
{
  extern Class_Descriptor cd_E22x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E22x12, buf);
    E22x12 *dp, &lv = *(dp=new (buf) E22x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E22x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E22x12)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(24,20), "E22x12");
    check_base_class_offset(lv, (B1*)(C22*), 0, "E22x12");
    check_base_class_offset(lv, (C22*), 0, "E22x12");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E22x12");
    check_field_offset(lv, fd, ABISELECT(20,16), "E22x12.fd");
    test_class_info(&lv, &cd_E22x12);
    dp->~E22x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE22x12(Test_E22x12, "E22x12", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6E22x12C1Ev();
extern void _ZN6E22x12D1Ev();
Name_Map name_map_E22x12[] = {
  NSPAIR(_ZN6E22x12C1Ev),
  NSPAIR(_ZN6E22x12D1Ev),
  {0,0}
};
extern Class_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_E22x12[] = {
  // 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 _ZTI6E22x12[];
extern void _ZN6E22x123fooEv();
static  VTBL_ENTRY vtc_E22x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x12[0]),
  (VTBL_ENTRY)&_ZN6E22x123fooEv,
};
extern VTBL_ENTRY _ZTV6E22x12[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__6E22x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_E22x12[] = {
  {&(_ZTV6E22x12[3]),  3,4},
  {&(_tg__ZTV3C22__6E22x12[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E22x12[];
extern  VTBL_ENTRY _ZTV6E22x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x12[];
Class_Descriptor cd_E22x12 = {  "E22x12", // class name
  bases_E22x12, 4,
  &(vtc_E22x12[0]), // expected_vtbl_contents
  &(vtt_E22x12[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6E22x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E22x12),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E22x12),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  G22x12y0  : E22x12 , F1 {
  int ff;
  ~G22x12y0(); // tgen
  G22x12y0(); // tgen
};
//SIG(1 G22x12y0) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G22x12y0 ::~G22x12y0(){ note_dtor("G22x12y0", this);} // tgen
G22x12y0 ::G22x12y0(){ note_ctor("G22x12y0", this);} // tgen

static void Test_G22x12y0()
{
  extern Class_Descriptor cd_G22x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x12y0, buf);
    G22x12y0 *dp, &lv = *(dp=new (buf) G22x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x12y0)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x12*), ABISELECT(40,32), "G22x12y0");
    check_base_class_offset(lv, (B1*)(C22*)(E22x12*), 0, "G22x12y0");
    check_base_class_offset(lv, (C22*)(E22x12*), 0, "G22x12y0");
    check_base_class_offset(lv, (D0*)(E22x12*), ABISELECT(16,12), "G22x12y0");
    check_base_class_offset(lv, (E22x12*), 0, "G22x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G22x12y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G22x12y0.ff");
    test_class_info(&lv, &cd_G22x12y0);
    dp->~G22x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x12y0(Test_G22x12y0, "G22x12y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G22x12y0C1Ev();
extern void _ZN8G22x12y0D1Ev();
Name_Map name_map_G22x12y0[] = {
  NSPAIR(_ZN8G22x12y0C1Ev),
  NSPAIR(_ZN8G22x12y0D1Ev),
  {0,0}
};
extern Class_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_E22x12;
extern VTBL_ENTRY _ZTI6E22x12[];
extern  VTBL_ENTRY _ZTV6E22x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x12y0[] = {
  // 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_E22x12,    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 _ZTI8G22x12y0[];
extern void _ZN6E22x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x12y0[0]),
  (VTBL_ENTRY)&_ZN6E22x123fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G22x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G22x12y0[];
extern void _ZN6E22x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x12__8G22x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x12[0]),
  (VTBL_ENTRY)&_ZN6E22x123fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C226E22x12__8G22x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x12y0[] = {
  {&(_ZTV8G22x12y0[3]),  3,7},
  {&(_tg__ZTV6E22x12__8G22x12y0[3]),  3,4},
  {&(_tg__ZTV3C226E22x12__8G22x12y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x12y0[];
extern  VTBL_ENTRY _ZTV8G22x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x12y0[];
Class_Descriptor cd_G22x12y0 = {  "G22x12y0", // class name
  bases_G22x12y0, 6,
  &(vtc_G22x12y0[0]), // expected_vtbl_contents
  &(vtt_G22x12y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G22x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x12y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x12y0),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  G22x12y1  : virtual E22x12 , F1 {
  int ff;
  ~G22x12y1(); // tgen
  G22x12y1(); // tgen
};
//SIG(1 G22x12y1) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G22x12y1 ::~G22x12y1(){ note_dtor("G22x12y1", this);} // tgen
G22x12y1 ::G22x12y1(){ note_ctor("G22x12y1", this);} // tgen

static void Test_G22x12y1()
{
  extern Class_Descriptor cd_G22x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x12y1, buf);
    G22x12y1 *dp, &lv = *(dp=new (buf) G22x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x12y1)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x12*), ABISELECT(40,32), "G22x12y1");
    check_base_class_offset(lv, (B1*)(C22*)(E22x12*), ABISELECT(16,12), "G22x12y1");
    check_base_class_offset(lv, (C22*)(E22x12*), ABISELECT(16,12), "G22x12y1");
    check_base_class_offset(lv, (D0*)(E22x12*), ABISELECT(32,24), "G22x12y1");
    check_base_class_offset(lv, (E22x12*), ABISELECT(16,12), "G22x12y1");
    check_base_class_offset(lv, (F1*), 0, "G22x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x12y1.ff");
    test_class_info(&lv, &cd_G22x12y1);
    dp->~G22x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x12y1(Test_G22x12y1, "G22x12y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G22x12y1C1Ev();
extern void _ZN8G22x12y1D1Ev();
Name_Map name_map_G22x12y1[] = {
  NSPAIR(_ZN8G22x12y1C1Ev),
  NSPAIR(_ZN8G22x12y1D1Ev),
  {0,0}
};
extern Class_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_E22x12;
extern VTBL_ENTRY _ZTI6E22x12[];
extern  VTBL_ENTRY _ZTV6E22x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x12y1[] = {
  // 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_E22x12,    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 _ZTI8G22x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E22x123fooEv();
static  VTBL_ENTRY vtc_G22x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G22x12y1[0]),
  (VTBL_ENTRY)&_ZN6E22x123fooEv,
};
extern VTBL_ENTRY _ZTV8G22x12y1[];
extern void _ZN6E22x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x12__8G22x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x12[0]),
  (VTBL_ENTRY)&_ZN6E22x123fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C226E22x12__8G22x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x12y1[] = {
  {&(_ZTV8G22x12y1[4]),  4,10},
  {&(_ZTV8G22x12y1[9]),  9,10},
  {&(_tg__ZTV6E22x12__8G22x12y1[3]),  3,4},
  {&(_tg__ZTV3C226E22x12__8G22x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x12y1[];
extern  VTBL_ENTRY _ZTV8G22x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x12y1[];
Class_Descriptor cd_G22x12y1 = {  "G22x12y1", // class name
  bases_G22x12y1, 6,
  &(vtc_G22x12y1[0]), // expected_vtbl_contents
  &(vtt_G22x12y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G22x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x12y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x12y1),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  G22x12y2  : E22x12 , virtual F1 {
  int ff;
  ~G22x12y2(); // tgen
  G22x12y2(); // tgen
};
//SIG(1 G22x12y2) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G22x12y2 ::~G22x12y2(){ note_dtor("G22x12y2", this);} // tgen
G22x12y2 ::G22x12y2(){ note_ctor("G22x12y2", this);} // tgen

static void Test_G22x12y2()
{
  extern Class_Descriptor cd_G22x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x12y2, buf);
    G22x12y2 *dp, &lv = *(dp=new (buf) G22x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x12y2)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x12*), ABISELECT(28,24), "G22x12y2");
    check_base_class_offset(lv, (B1*)(C22*)(E22x12*), 0, "G22x12y2");
    check_base_class_offset(lv, (C22*)(E22x12*), 0, "G22x12y2");
    check_base_class_offset(lv, (D0*)(E22x12*), ABISELECT(16,12), "G22x12y2");
    check_base_class_offset(lv, (E22x12*), 0, "G22x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G22x12y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G22x12y2.ff");
    test_class_info(&lv, &cd_G22x12y2);
    dp->~G22x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x12y2(Test_G22x12y2, "G22x12y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G22x12y2C1Ev();
extern void _ZN8G22x12y2D1Ev();
Name_Map name_map_G22x12y2[] = {
  NSPAIR(_ZN8G22x12y2C1Ev),
  NSPAIR(_ZN8G22x12y2D1Ev),
  {0,0}
};
extern Class_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_E22x12;
extern VTBL_ENTRY _ZTI6E22x12[];
extern  VTBL_ENTRY _ZTV6E22x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x12y2[] = {
  // 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_E22x12,    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 _ZTI8G22x12y2[];
extern void _ZN6E22x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x12y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x12y2[0]),
  (VTBL_ENTRY)&_ZN6E22x123fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G22x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G22x12y2[];
extern void _ZN6E22x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x12__8G22x12y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x12[0]),
  (VTBL_ENTRY)&_ZN6E22x123fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C226E22x12__8G22x12y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x12y2[] = {
  {&(_ZTV8G22x12y2[4]),  4,9},
  {&(_tg__ZTV6E22x12__8G22x12y2[3]),  3,4},
  {&(_tg__ZTV3C226E22x12__8G22x12y2[3]),  3,4},
  {&(_ZTV8G22x12y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G22x12y2[];
extern  VTBL_ENTRY _ZTV8G22x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x12y2[];
Class_Descriptor cd_G22x12y2 = {  "G22x12y2", // class name
  bases_G22x12y2, 6,
  &(vtc_G22x12y2[0]), // expected_vtbl_contents
  &(vtt_G22x12y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G22x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x12y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x12y2),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  G22x12y3  : virtual E22x12 , virtual F1 {
  int ff;
  ~G22x12y3(); // tgen
  G22x12y3(); // tgen
};
//SIG(1 G22x12y3) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G22x12y3 ::~G22x12y3(){ note_dtor("G22x12y3", this);} // tgen
G22x12y3 ::G22x12y3(){ note_ctor("G22x12y3", this);} // tgen

static void Test_G22x12y3()
{
  extern Class_Descriptor cd_G22x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G22x12y3, buf);
    G22x12y3 *dp, &lv = *(dp=new (buf) G22x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G22x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x12y3)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x12*), ABISELECT(40,28), "G22x12y3");
    check_base_class_offset(lv, (B1*)(C22*)(E22x12*), ABISELECT(16,8), "G22x12y3");
    check_base_class_offset(lv, (C22*)(E22x12*), ABISELECT(16,8), "G22x12y3");
    check_base_class_offset(lv, (D0*)(E22x12*), ABISELECT(32,20), "G22x12y3");
    check_base_class_offset(lv, (E22x12*), ABISELECT(16,8), "G22x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G22x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G22x12y3.ff");
    test_class_info(&lv, &cd_G22x12y3);
    dp->~G22x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x12y3(Test_G22x12y3, "G22x12y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G22x12y3C1Ev();
extern void _ZN8G22x12y3D1Ev();
Name_Map name_map_G22x12y3[] = {
  NSPAIR(_ZN8G22x12y3C1Ev),
  NSPAIR(_ZN8G22x12y3D1Ev),
  {0,0}
};
extern Class_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_E22x12;
extern VTBL_ENTRY _ZTI6E22x12[];
extern  VTBL_ENTRY _ZTV6E22x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x12y3[] = {
  // 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_E22x12,    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 _ZTI8G22x12y3[];
extern void _ZN6E22x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x12y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G22x12y3[0]),
  (VTBL_ENTRY)&_ZN6E22x123fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G22x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G22x12y3[];
extern void _ZN6E22x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x12__8G22x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x12[0]),
  (VTBL_ENTRY)&_ZN6E22x123fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C226E22x12__8G22x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x12y3[] = {
  {&(_ZTV8G22x12y3[5]),  5,14},
  {&(_ZTV8G22x12y3[9]),  9,14},
  {&(_ZTV8G22x12y3[13]),  13,14},
  {&(_tg__ZTV6E22x12__8G22x12y3[3]),  3,4},
  {&(_tg__ZTV3C226E22x12__8G22x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x12y3[];
extern  VTBL_ENTRY _ZTV8G22x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x12y3[];
Class_Descriptor cd_G22x12y3 = {  "G22x12y3", // class name
  bases_G22x12y3, 6,
  &(vtc_G22x12y3[0]), // expected_vtbl_contents
  &(vtt_G22x12y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G22x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x12y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x12y3),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  G22x12y4  : E22x12 , F0 {
  int ff;
  ~G22x12y4(); // tgen
  G22x12y4(); // tgen
};
//SIG(1 G22x12y4) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G22x12y4 ::~G22x12y4(){ note_dtor("G22x12y4", this);} // tgen
G22x12y4 ::G22x12y4(){ note_ctor("G22x12y4", this);} // tgen

static void Test_G22x12y4()
{
  extern Class_Descriptor cd_G22x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G22x12y4, buf);
    G22x12y4 *dp, &lv = *(dp=new (buf) G22x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G22x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x12y4)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x12*), ABISELECT(32,28), "G22x12y4");
    check_base_class_offset(lv, (B1*)(C22*)(E22x12*), 0, "G22x12y4");
    check_base_class_offset(lv, (C22*)(E22x12*), 0, "G22x12y4");
    check_base_class_offset(lv, (D0*)(E22x12*), ABISELECT(16,12), "G22x12y4");
    check_base_class_offset(lv, (E22x12*), 0, "G22x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G22x12y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G22x12y4.ff");
    test_class_info(&lv, &cd_G22x12y4);
    dp->~G22x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x12y4(Test_G22x12y4, "G22x12y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G22x12y4C1Ev();
extern void _ZN8G22x12y4D1Ev();
Name_Map name_map_G22x12y4[] = {
  NSPAIR(_ZN8G22x12y4C1Ev),
  NSPAIR(_ZN8G22x12y4D1Ev),
  {0,0}
};
extern Class_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_E22x12;
extern VTBL_ENTRY _ZTI6E22x12[];
extern  VTBL_ENTRY _ZTV6E22x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x12y4[] = {
  // 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_E22x12,    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 _ZTI8G22x12y4[];
extern void _ZN6E22x123fooEv();
static  VTBL_ENTRY vtc_G22x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x12y4[0]),
  (VTBL_ENTRY)&_ZN6E22x123fooEv,
};
extern VTBL_ENTRY _ZTV8G22x12y4[];
extern void _ZN6E22x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x12__8G22x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x12[0]),
  (VTBL_ENTRY)&_ZN6E22x123fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C226E22x12__8G22x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x12y4[] = {
  {&(_ZTV8G22x12y4[3]),  3,4},
  {&(_tg__ZTV6E22x12__8G22x12y4[3]),  3,4},
  {&(_tg__ZTV3C226E22x12__8G22x12y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x12y4[];
extern  VTBL_ENTRY _ZTV8G22x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x12y4[];
Class_Descriptor cd_G22x12y4 = {  "G22x12y4", // class name
  bases_G22x12y4, 6,
  &(vtc_G22x12y4[0]), // expected_vtbl_contents
  &(vtt_G22x12y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G22x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x12y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x12y4),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  G22x12y5  : virtual E22x12 , F0 {
  int ff;
  ~G22x12y5(); // tgen
  G22x12y5(); // tgen
};
//SIG(1 G22x12y5) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G22x12y5 ::~G22x12y5(){ note_dtor("G22x12y5", this);} // tgen
G22x12y5 ::G22x12y5(){ note_ctor("G22x12y5", this);} // tgen

static void Test_G22x12y5()
{
  extern Class_Descriptor cd_G22x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x12y5, buf);
    G22x12y5 *dp, &lv = *(dp=new (buf) G22x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x12y5)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x12*), ABISELECT(40,32), "G22x12y5");
    check_base_class_offset(lv, (B1*)(C22*)(E22x12*), ABISELECT(16,12), "G22x12y5");
    check_base_class_offset(lv, (C22*)(E22x12*), ABISELECT(16,12), "G22x12y5");
    check_base_class_offset(lv, (D0*)(E22x12*), ABISELECT(32,24), "G22x12y5");
    check_base_class_offset(lv, (E22x12*), ABISELECT(16,12), "G22x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G22x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x12y5.ff");
    test_class_info(&lv, &cd_G22x12y5);
    dp->~G22x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x12y5(Test_G22x12y5, "G22x12y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G22x12y5C1Ev();
extern void _ZN8G22x12y5D1Ev();
Name_Map name_map_G22x12y5[] = {
  NSPAIR(_ZN8G22x12y5C1Ev),
  NSPAIR(_ZN8G22x12y5D1Ev),
  {0,0}
};
extern Class_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_E22x12;
extern VTBL_ENTRY _ZTI6E22x12[];
extern  VTBL_ENTRY _ZTV6E22x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x12y5[] = {
  // 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_E22x12,    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 _ZTI8G22x12y5[];
extern void _ZN6E22x123fooEv();
static  VTBL_ENTRY vtc_G22x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G22x12y5[0]),
  (VTBL_ENTRY)&_ZN6E22x123fooEv,
};
extern VTBL_ENTRY _ZTV8G22x12y5[];
extern void _ZN6E22x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x12__8G22x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x12[0]),
  (VTBL_ENTRY)&_ZN6E22x123fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C226E22x12__8G22x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x12y5[] = {
  {&(_ZTV8G22x12y5[4]),  4,9},
  {&(_ZTV8G22x12y5[8]),  8,9},
  {&(_tg__ZTV6E22x12__8G22x12y5[3]),  3,4},
  {&(_tg__ZTV3C226E22x12__8G22x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x12y5[];
extern  VTBL_ENTRY _ZTV8G22x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x12y5[];
Class_Descriptor cd_G22x12y5 = {  "G22x12y5", // class name
  bases_G22x12y5, 6,
  &(vtc_G22x12y5[0]), // expected_vtbl_contents
  &(vtt_G22x12y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G22x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x12y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x12y5),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  G22x12y6  : E22x12 , virtual F0 {
  int ff;
  ~G22x12y6(); // tgen
  G22x12y6(); // tgen
};
//SIG(1 G22x12y6) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G22x12y6 ::~G22x12y6(){ note_dtor("G22x12y6", this);} // tgen
G22x12y6 ::G22x12y6(){ note_ctor("G22x12y6", this);} // tgen

static void Test_G22x12y6()
{
  extern Class_Descriptor cd_G22x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G22x12y6, buf);
    G22x12y6 *dp, &lv = *(dp=new (buf) G22x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G22x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x12y6)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x12*), ABISELECT(28,24), "G22x12y6");
    check_base_class_offset(lv, (B1*)(C22*)(E22x12*), 0, "G22x12y6");
    check_base_class_offset(lv, (C22*)(E22x12*), 0, "G22x12y6");
    check_base_class_offset(lv, (D0*)(E22x12*), ABISELECT(16,12), "G22x12y6");
    check_base_class_offset(lv, (E22x12*), 0, "G22x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G22x12y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G22x12y6.ff");
    test_class_info(&lv, &cd_G22x12y6);
    dp->~G22x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x12y6(Test_G22x12y6, "G22x12y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G22x12y6C1Ev();
extern void _ZN8G22x12y6D1Ev();
Name_Map name_map_G22x12y6[] = {
  NSPAIR(_ZN8G22x12y6C1Ev),
  NSPAIR(_ZN8G22x12y6D1Ev),
  {0,0}
};
extern Class_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_E22x12;
extern VTBL_ENTRY _ZTI6E22x12[];
extern  VTBL_ENTRY _ZTV6E22x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x12y6[] = {
  // 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_E22x12,    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 _ZTI8G22x12y6[];
extern void _ZN6E22x123fooEv();
static  VTBL_ENTRY vtc_G22x12y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x12y6[0]),
  (VTBL_ENTRY)&_ZN6E22x123fooEv,
};
extern VTBL_ENTRY _ZTV8G22x12y6[];
extern void _ZN6E22x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x12__8G22x12y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x12[0]),
  (VTBL_ENTRY)&_ZN6E22x123fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C226E22x12__8G22x12y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x12y6[] = {
  {&(_ZTV8G22x12y6[4]),  4,5},
  {&(_tg__ZTV6E22x12__8G22x12y6[3]),  3,4},
  {&(_tg__ZTV3C226E22x12__8G22x12y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x12y6[];
extern  VTBL_ENTRY _ZTV8G22x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x12y6[];
Class_Descriptor cd_G22x12y6 = {  "G22x12y6", // class name
  bases_G22x12y6, 6,
  &(vtc_G22x12y6[0]), // expected_vtbl_contents
  &(vtt_G22x12y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G22x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x12y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x12y6),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  G22x12y7  : virtual E22x12 , virtual F0 {
  int ff;
  ~G22x12y7(); // tgen
  G22x12y7(); // tgen
};
//SIG(1 G22x12y7) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G22x12y7 ::~G22x12y7(){ note_dtor("G22x12y7", this);} // tgen
G22x12y7 ::G22x12y7(){ note_ctor("G22x12y7", this);} // tgen

static void Test_G22x12y7()
{
  extern Class_Descriptor cd_G22x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x12y7, buf);
    G22x12y7 *dp, &lv = *(dp=new (buf) G22x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x12y7)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x12*), ABISELECT(40,28), "G22x12y7");
    check_base_class_offset(lv, (B1*)(C22*)(E22x12*), ABISELECT(16,8), "G22x12y7");
    check_base_class_offset(lv, (C22*)(E22x12*), ABISELECT(16,8), "G22x12y7");
    check_base_class_offset(lv, (D0*)(E22x12*), ABISELECT(32,20), "G22x12y7");
    check_base_class_offset(lv, (E22x12*), ABISELECT(16,8), "G22x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G22x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G22x12y7.ff");
    test_class_info(&lv, &cd_G22x12y7);
    dp->~G22x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x12y7(Test_G22x12y7, "G22x12y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G22x12y7C1Ev();
extern void _ZN8G22x12y7D1Ev();
Name_Map name_map_G22x12y7[] = {
  NSPAIR(_ZN8G22x12y7C1Ev),
  NSPAIR(_ZN8G22x12y7D1Ev),
  {0,0}
};
extern Class_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_E22x12;
extern VTBL_ENTRY _ZTI6E22x12[];
extern  VTBL_ENTRY _ZTV6E22x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x12y7[] = {
  // 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_E22x12,    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 _ZTI8G22x12y7[];
extern void _ZN6E22x123fooEv();
static  VTBL_ENTRY vtc_G22x12y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G22x12y7[0]),
  (VTBL_ENTRY)&_ZN6E22x123fooEv,
};
extern VTBL_ENTRY _ZTV8G22x12y7[];
extern void _ZN6E22x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x12__8G22x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x12[0]),
  (VTBL_ENTRY)&_ZN6E22x123fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C226E22x12__8G22x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x12y7[] = {
  {&(_ZTV8G22x12y7[5]),  5,10},
  {&(_ZTV8G22x12y7[9]),  9,10},
  {&(_tg__ZTV6E22x12__8G22x12y7[3]),  3,4},
  {&(_tg__ZTV3C226E22x12__8G22x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x12y7[];
extern  VTBL_ENTRY _ZTV8G22x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x12y7[];
Class_Descriptor cd_G22x12y7 = {  "G22x12y7", // class name
  bases_G22x12y7, 6,
  &(vtc_G22x12y7[0]), // expected_vtbl_contents
  &(vtt_G22x12y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G22x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x12y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x12y7),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  E23x12  : C23 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E23x123fooEv
  ~E23x12(); // tgen
  E23x12(); // tgen
};
//SIG(-1 E23x12) C1{ BC2{ VBC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E23x12 ::foo(){vfunc_called(this, "_ZN6E23x123fooEv");}
E23x12 ::~E23x12(){ note_dtor("E23x12", this);} // tgen
E23x12 ::E23x12(){ note_ctor("E23x12", this);} // tgen

static void Test_E23x12()
{
  extern Class_Descriptor cd_E23x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E23x12, buf);
    E23x12 *dp, &lv = *(dp=new (buf) E23x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E23x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E23x12)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(24,20), "E23x12");
    check_base_class_offset(lv, (B1*)(C23*), 0, "E23x12");
    check_base_class_offset(lv, (C23*), 0, "E23x12");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E23x12");
    check_field_offset(lv, fd, ABISELECT(20,16), "E23x12.fd");
    test_class_info(&lv, &cd_E23x12);
    dp->~E23x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE23x12(Test_E23x12, "E23x12", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E23x12C1Ev();
extern void _ZN6E23x12D1Ev();
Name_Map name_map_E23x12[] = {
  NSPAIR(_ZN6E23x12C1Ev),
  NSPAIR(_ZN6E23x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x12[] = {
  // 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 _ZTI6E23x12[];
extern void _ZN6E23x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv)();
extern void ABISELECT(_ZThn24_N6E23x123fooEv,_ZThn20_N6E23x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E23x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x12[0]),
  (VTBL_ENTRY)&_ZN6E23x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E23x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv),
};
extern VTBL_ENTRY _ZTV6E23x12[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__6E23x12[] = {
  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__6E23x12[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_E23x12[] = {
  {&(_ZTV6E23x12[3]),  3,8},
  {&(_tg__ZTV3C23__6E23x12[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__6E23x12[3]),  3,4},
  {&(_ZTV6E23x12[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6E23x12[];
extern  VTBL_ENTRY _ZTV6E23x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x12[];
static VTBL_ENTRY alt_thunk_names80[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x123fooEv,_ZThn20_N6E23x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E23x12 = {  "E23x12", // class name
  bases_E23x12, 4,
  &(vtc_E23x12[0]), // expected_vtbl_contents
  &(vtt_E23x12[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E23x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E23x12),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E23x12),4, //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  G23x12y0  : E23x12 , F1 {
  int ff;
  ~G23x12y0(); // tgen
  G23x12y0(); // tgen
};
//SIG(1 G23x12y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G23x12y0 ::~G23x12y0(){ note_dtor("G23x12y0", this);} // tgen
G23x12y0 ::G23x12y0(){ note_ctor("G23x12y0", this);} // tgen

static void Test_G23x12y0()
{
  extern Class_Descriptor cd_G23x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x12y0, buf);
    G23x12y0 *dp, &lv = *(dp=new (buf) G23x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x12y0)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x12*), ABISELECT(40,32), "G23x12y0");
    check_base_class_offset(lv, (B1*)(C23*)(E23x12*), 0, "G23x12y0");
    check_base_class_offset(lv, (C23*)(E23x12*), 0, "G23x12y0");
    check_base_class_offset(lv, (D0*)(E23x12*), ABISELECT(16,12), "G23x12y0");
    check_base_class_offset(lv, (E23x12*), 0, "G23x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G23x12y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G23x12y0.ff");
    test_class_info(&lv, &cd_G23x12y0);
    dp->~G23x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x12y0(Test_G23x12y0, "G23x12y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G23x12y0C1Ev();
extern void _ZN8G23x12y0D1Ev();
Name_Map name_map_G23x12y0[] = {
  NSPAIR(_ZN8G23x12y0C1Ev),
  NSPAIR(_ZN8G23x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x12;
extern VTBL_ENTRY _ZTI6E23x12[];
extern  VTBL_ENTRY _ZTV6E23x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x12y0[] = {
  // 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_E23x12,    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 _ZTI8G23x12y0[];
extern void _ZN6E23x123fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv)();
extern void ABISELECT(_ZThn40_N6E23x123fooEv,_ZThn32_N6E23x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x12y0[0]),
  (VTBL_ENTRY)&_ZN6E23x123fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G23x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G23x12y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv),
};
extern VTBL_ENTRY _ZTV8G23x12y0[];
extern void _ZN6E23x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x12__8G23x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x12[0]),
  (VTBL_ENTRY)&_ZN6E23x123fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C236E23x12__8G23x12y0[] = {
  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__3C236E23x12__8G23x12y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv)();
extern void ABISELECT(_ZThn40_N6E23x123fooEv,_ZThn32_N6E23x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x12__8G23x12y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6E23x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv),
};
static  VTT_ENTRY vtt_G23x12y0[] = {
  {&(_ZTV8G23x12y0[3]),  3,11},
  {&(_tg__ZTV6E23x12__8G23x12y0[3]),  3,4},
  {&(_tg__ZTV3C236E23x12__8G23x12y0[3]),  3,4},
  {&(_tg__ZTV2A1__3C236E23x12__8G23x12y0[3]),  3,4},
  {&(_tg__ZTV2A1__6E23x12__8G23x12y0[3]),  3,4},
  {&(_ZTV8G23x12y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI8G23x12y0[];
extern  VTBL_ENTRY _ZTV8G23x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x12y0[];
static VTBL_ENTRY alt_thunk_names81[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C233fooEv,_ZThn32_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E23x123fooEv,_ZThn32_N6E23x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E23x123fooEv,_ZThn32_N6E23x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x12y0 = {  "G23x12y0", // class name
  bases_G23x12y0, 6,
  &(vtc_G23x12y0[0]), // expected_vtbl_contents
  &(vtt_G23x12y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G23x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x12y0),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x12y0),6, //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  G23x12y1  : virtual E23x12 , F1 {
  int ff;
  ~G23x12y1(); // tgen
  G23x12y1(); // tgen
};
//SIG(1 G23x12y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G23x12y1 ::~G23x12y1(){ note_dtor("G23x12y1", this);} // tgen
G23x12y1 ::G23x12y1(){ note_ctor("G23x12y1", this);} // tgen

static void Test_G23x12y1()
{
  extern Class_Descriptor cd_G23x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x12y1, buf);
    G23x12y1 *dp, &lv = *(dp=new (buf) G23x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x12y1)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x12*), ABISELECT(40,32), "G23x12y1");
    check_base_class_offset(lv, (B1*)(C23*)(E23x12*), ABISELECT(16,12), "G23x12y1");
    check_base_class_offset(lv, (C23*)(E23x12*), ABISELECT(16,12), "G23x12y1");
    check_base_class_offset(lv, (D0*)(E23x12*), ABISELECT(32,24), "G23x12y1");
    check_base_class_offset(lv, (E23x12*), ABISELECT(16,12), "G23x12y1");
    check_base_class_offset(lv, (F1*), 0, "G23x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x12y1.ff");
    test_class_info(&lv, &cd_G23x12y1);
    dp->~G23x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x12y1(Test_G23x12y1, "G23x12y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G23x12y1C1Ev();
extern void _ZN8G23x12y1D1Ev();
Name_Map name_map_G23x12y1[] = {
  NSPAIR(_ZN8G23x12y1C1Ev),
  NSPAIR(_ZN8G23x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x12;
extern VTBL_ENTRY _ZTI6E23x12[];
extern  VTBL_ENTRY _ZTV6E23x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x12y1[] = {
  // 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_E23x12,    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 _ZTI8G23x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E23x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv)();
extern void ABISELECT(_ZThn24_N6E23x123fooEv,_ZThn20_N6E23x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G23x12y1[0]),
  (VTBL_ENTRY)&_ZN6E23x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G23x12y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv),
};
extern VTBL_ENTRY _ZTV8G23x12y1[];
extern void _ZN6E23x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x12__8G23x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x12[0]),
  (VTBL_ENTRY)&_ZN6E23x123fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C236E23x12__8G23x12y1[] = {
  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__3C236E23x12__8G23x12y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv)();
extern void ABISELECT(_ZThn24_N6E23x123fooEv,_ZThn20_N6E23x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x12__8G23x12y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E23x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv),
};
static  VTT_ENTRY vtt_G23x12y1[] = {
  {&(_ZTV8G23x12y1[4]),  4,14},
  {&(_ZTV8G23x12y1[9]),  9,14},
  {&(_ZTV8G23x12y1[13]),  13,14},
  {&(_tg__ZTV6E23x12__8G23x12y1[3]),  3,4},
  {&(_tg__ZTV3C236E23x12__8G23x12y1[3]),  3,4},
  {&(_tg__ZTV2A1__3C236E23x12__8G23x12y1[3]),  3,4},
  {&(_tg__ZTV2A1__6E23x12__8G23x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x12y1[];
extern  VTBL_ENTRY _ZTV8G23x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x12y1[];
static VTBL_ENTRY alt_thunk_names82[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x123fooEv,_ZThn20_N6E23x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x123fooEv,_ZThn20_N6E23x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x12y1 = {  "G23x12y1", // class name
  bases_G23x12y1, 6,
  &(vtc_G23x12y1[0]), // expected_vtbl_contents
  &(vtt_G23x12y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G23x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x12y1),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x12y1),7, //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  G23x12y2  : E23x12 , virtual F1 {
  int ff;
  ~G23x12y2(); // tgen
  G23x12y2(); // tgen
};
//SIG(1 G23x12y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G23x12y2 ::~G23x12y2(){ note_dtor("G23x12y2", this);} // tgen
G23x12y2 ::G23x12y2(){ note_ctor("G23x12y2", this);} // tgen

static void Test_G23x12y2()
{
  extern Class_Descriptor cd_G23x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G23x12y2, buf);
    G23x12y2 *dp, &lv = *(dp=new (buf) G23x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G23x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x12y2)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x12*), ABISELECT(32,24), "G23x12y2");
    check_base_class_offset(lv, (B1*)(C23*)(E23x12*), 0, "G23x12y2");
    check_base_class_offset(lv, (C23*)(E23x12*), 0, "G23x12y2");
    check_base_class_offset(lv, (D0*)(E23x12*), ABISELECT(16,12), "G23x12y2");
    check_base_class_offset(lv, (E23x12*), 0, "G23x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G23x12y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G23x12y2.ff");
    test_class_info(&lv, &cd_G23x12y2);
    dp->~G23x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x12y2(Test_G23x12y2, "G23x12y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G23x12y2C1Ev();
extern void _ZN8G23x12y2D1Ev();
Name_Map name_map_G23x12y2[] = {
  NSPAIR(_ZN8G23x12y2C1Ev),
  NSPAIR(_ZN8G23x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x12;
extern VTBL_ENTRY _ZTI6E23x12[];
extern  VTBL_ENTRY _ZTV6E23x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x12y2[] = {
  // 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_E23x12,    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 _ZTI8G23x12y2[];
extern void _ZN6E23x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv)();
extern void ABISELECT(_ZThn32_N6E23x123fooEv,_ZThn24_N6E23x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G23x12y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x12y2[0]),
  (VTBL_ENTRY)&_ZN6E23x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G23x12y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G23x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G23x12y2[];
extern void _ZN6E23x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x12__8G23x12y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x12[0]),
  (VTBL_ENTRY)&_ZN6E23x123fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C236E23x12__8G23x12y2[] = {
  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__3C236E23x12__8G23x12y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv)();
extern void ABISELECT(_ZThn32_N6E23x123fooEv,_ZThn24_N6E23x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x12__8G23x12y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E23x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv),
};
static  VTT_ENTRY vtt_G23x12y2[] = {
  {&(_ZTV8G23x12y2[4]),  4,13},
  {&(_tg__ZTV6E23x12__8G23x12y2[3]),  3,4},
  {&(_tg__ZTV3C236E23x12__8G23x12y2[3]),  3,4},
  {&(_tg__ZTV2A1__3C236E23x12__8G23x12y2[3]),  3,4},
  {&(_tg__ZTV2A1__6E23x12__8G23x12y2[3]),  3,4},
  {&(_ZTV8G23x12y2[8]),  8,13},
  {&(_ZTV8G23x12y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI8G23x12y2[];
extern  VTBL_ENTRY _ZTV8G23x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x12y2[];
static VTBL_ENTRY alt_thunk_names83[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x123fooEv,_ZThn24_N6E23x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x123fooEv,_ZThn24_N6E23x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x12y2 = {  "G23x12y2", // class name
  bases_G23x12y2, 6,
  &(vtc_G23x12y2[0]), // expected_vtbl_contents
  &(vtt_G23x12y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G23x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x12y2),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x12y2),7, //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  G23x12y3  : virtual E23x12 , virtual F1 {
  int ff;
  ~G23x12y3(); // tgen
  G23x12y3(); // tgen
};
//SIG(1 G23x12y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G23x12y3 ::~G23x12y3(){ note_dtor("G23x12y3", this);} // tgen
G23x12y3 ::G23x12y3(){ note_ctor("G23x12y3", this);} // tgen

static void Test_G23x12y3()
{
  extern Class_Descriptor cd_G23x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G23x12y3, buf);
    G23x12y3 *dp, &lv = *(dp=new (buf) G23x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G23x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x12y3)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x12*), ABISELECT(40,28), "G23x12y3");
    check_base_class_offset(lv, (B1*)(C23*)(E23x12*), ABISELECT(16,8), "G23x12y3");
    check_base_class_offset(lv, (C23*)(E23x12*), ABISELECT(16,8), "G23x12y3");
    check_base_class_offset(lv, (D0*)(E23x12*), ABISELECT(32,20), "G23x12y3");
    check_base_class_offset(lv, (E23x12*), ABISELECT(16,8), "G23x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G23x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G23x12y3.ff");
    test_class_info(&lv, &cd_G23x12y3);
    dp->~G23x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x12y3(Test_G23x12y3, "G23x12y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G23x12y3C1Ev();
extern void _ZN8G23x12y3D1Ev();
Name_Map name_map_G23x12y3[] = {
  NSPAIR(_ZN8G23x12y3C1Ev),
  NSPAIR(_ZN8G23x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x12;
extern VTBL_ENTRY _ZTI6E23x12[];
extern  VTBL_ENTRY _ZTV6E23x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x12y3[] = {
  // 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_E23x12,    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 _ZTI8G23x12y3[];
extern void _ZN6E23x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv)();
extern void ABISELECT(_ZThn24_N6E23x123fooEv,_ZThn20_N6E23x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G23x12y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G23x12y3[0]),
  (VTBL_ENTRY)&_ZN6E23x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G23x12y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G23x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G23x12y3[];
extern void _ZN6E23x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x12__8G23x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x12[0]),
  (VTBL_ENTRY)&_ZN6E23x123fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C236E23x12__8G23x12y3[] = {
  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__3C236E23x12__8G23x12y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv)();
extern void ABISELECT(_ZThn24_N6E23x123fooEv,_ZThn20_N6E23x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x12__8G23x12y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E23x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv),
};
static  VTT_ENTRY vtt_G23x12y3[] = {
  {&(_ZTV8G23x12y3[5]),  5,18},
  {&(_ZTV8G23x12y3[9]),  9,18},
  {&(_ZTV8G23x12y3[13]),  13,18},
  {&(_ZTV8G23x12y3[17]),  17,18},
  {&(_tg__ZTV6E23x12__8G23x12y3[3]),  3,4},
  {&(_tg__ZTV3C236E23x12__8G23x12y3[3]),  3,4},
  {&(_tg__ZTV2A1__3C236E23x12__8G23x12y3[3]),  3,4},
  {&(_tg__ZTV2A1__6E23x12__8G23x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x12y3[];
extern  VTBL_ENTRY _ZTV8G23x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x12y3[];
static VTBL_ENTRY alt_thunk_names84[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x123fooEv,_ZThn20_N6E23x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x123fooEv,_ZThn20_N6E23x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x12y3 = {  "G23x12y3", // class name
  bases_G23x12y3, 6,
  &(vtc_G23x12y3[0]), // expected_vtbl_contents
  &(vtt_G23x12y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G23x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x12y3),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x12y3),8, //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  G23x12y4  : E23x12 , F0 {
  int ff;
  ~G23x12y4(); // tgen
  G23x12y4(); // tgen
};
//SIG(1 G23x12y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G23x12y4 ::~G23x12y4(){ note_dtor("G23x12y4", this);} // tgen
G23x12y4 ::G23x12y4(){ note_ctor("G23x12y4", this);} // tgen

static void Test_G23x12y4()
{
  extern Class_Descriptor cd_G23x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G23x12y4, buf);
    G23x12y4 *dp, &lv = *(dp=new (buf) G23x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G23x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x12y4)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x12*), ABISELECT(32,28), "G23x12y4");
    check_base_class_offset(lv, (B1*)(C23*)(E23x12*), 0, "G23x12y4");
    check_base_class_offset(lv, (C23*)(E23x12*), 0, "G23x12y4");
    check_base_class_offset(lv, (D0*)(E23x12*), ABISELECT(16,12), "G23x12y4");
    check_base_class_offset(lv, (E23x12*), 0, "G23x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G23x12y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G23x12y4.ff");
    test_class_info(&lv, &cd_G23x12y4);
    dp->~G23x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x12y4(Test_G23x12y4, "G23x12y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G23x12y4C1Ev();
extern void _ZN8G23x12y4D1Ev();
Name_Map name_map_G23x12y4[] = {
  NSPAIR(_ZN8G23x12y4C1Ev),
  NSPAIR(_ZN8G23x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x12;
extern VTBL_ENTRY _ZTI6E23x12[];
extern  VTBL_ENTRY _ZTV6E23x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x12y4[] = {
  // 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_E23x12,    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 _ZTI8G23x12y4[];
extern void _ZN6E23x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv)();
extern void ABISELECT(_ZThn32_N6E23x123fooEv,_ZThn28_N6E23x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x12y4[0]),
  (VTBL_ENTRY)&_ZN6E23x123fooEv,
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G23x12y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv),
};
extern VTBL_ENTRY _ZTV8G23x12y4[];
extern void _ZN6E23x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x12__8G23x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x12[0]),
  (VTBL_ENTRY)&_ZN6E23x123fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C236E23x12__8G23x12y4[] = {
  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__3C236E23x12__8G23x12y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv)();
extern void ABISELECT(_ZThn32_N6E23x123fooEv,_ZThn28_N6E23x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x12__8G23x12y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6E23x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv),
};
static  VTT_ENTRY vtt_G23x12y4[] = {
  {&(_ZTV8G23x12y4[3]),  3,8},
  {&(_tg__ZTV6E23x12__8G23x12y4[3]),  3,4},
  {&(_tg__ZTV3C236E23x12__8G23x12y4[3]),  3,4},
  {&(_tg__ZTV2A1__3C236E23x12__8G23x12y4[3]),  3,4},
  {&(_tg__ZTV2A1__6E23x12__8G23x12y4[3]),  3,4},
  {&(_ZTV8G23x12y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI8G23x12y4[];
extern  VTBL_ENTRY _ZTV8G23x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x12y4[];
static VTBL_ENTRY alt_thunk_names85[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C233fooEv,_ZThn28_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x123fooEv,_ZThn28_N6E23x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x123fooEv,_ZThn28_N6E23x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x12y4 = {  "G23x12y4", // class name
  bases_G23x12y4, 6,
  &(vtc_G23x12y4[0]), // expected_vtbl_contents
  &(vtt_G23x12y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G23x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x12y4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x12y4),6, //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  G23x12y5  : virtual E23x12 , F0 {
  int ff;
  ~G23x12y5(); // tgen
  G23x12y5(); // tgen
};
//SIG(1 G23x12y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G23x12y5 ::~G23x12y5(){ note_dtor("G23x12y5", this);} // tgen
G23x12y5 ::G23x12y5(){ note_ctor("G23x12y5", this);} // tgen

static void Test_G23x12y5()
{
  extern Class_Descriptor cd_G23x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x12y5, buf);
    G23x12y5 *dp, &lv = *(dp=new (buf) G23x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x12y5)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x12*), ABISELECT(40,32), "G23x12y5");
    check_base_class_offset(lv, (B1*)(C23*)(E23x12*), ABISELECT(16,12), "G23x12y5");
    check_base_class_offset(lv, (C23*)(E23x12*), ABISELECT(16,12), "G23x12y5");
    check_base_class_offset(lv, (D0*)(E23x12*), ABISELECT(32,24), "G23x12y5");
    check_base_class_offset(lv, (E23x12*), ABISELECT(16,12), "G23x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G23x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x12y5.ff");
    test_class_info(&lv, &cd_G23x12y5);
    dp->~G23x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x12y5(Test_G23x12y5, "G23x12y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G23x12y5C1Ev();
extern void _ZN8G23x12y5D1Ev();
Name_Map name_map_G23x12y5[] = {
  NSPAIR(_ZN8G23x12y5C1Ev),
  NSPAIR(_ZN8G23x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x12;
extern VTBL_ENTRY _ZTI6E23x12[];
extern  VTBL_ENTRY _ZTV6E23x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x12y5[] = {
  // 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_E23x12,    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 _ZTI8G23x12y5[];
extern void _ZN6E23x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv)();
extern void ABISELECT(_ZThn24_N6E23x123fooEv,_ZThn20_N6E23x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G23x12y5[0]),
  (VTBL_ENTRY)&_ZN6E23x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G23x12y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv),
};
extern VTBL_ENTRY _ZTV8G23x12y5[];
extern void _ZN6E23x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x12__8G23x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x12[0]),
  (VTBL_ENTRY)&_ZN6E23x123fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C236E23x12__8G23x12y5[] = {
  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__3C236E23x12__8G23x12y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv)();
extern void ABISELECT(_ZThn24_N6E23x123fooEv,_ZThn20_N6E23x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x12__8G23x12y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E23x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv),
};
static  VTT_ENTRY vtt_G23x12y5[] = {
  {&(_ZTV8G23x12y5[4]),  4,13},
  {&(_ZTV8G23x12y5[8]),  8,13},
  {&(_ZTV8G23x12y5[12]),  12,13},
  {&(_tg__ZTV6E23x12__8G23x12y5[3]),  3,4},
  {&(_tg__ZTV3C236E23x12__8G23x12y5[3]),  3,4},
  {&(_tg__ZTV2A1__3C236E23x12__8G23x12y5[3]),  3,4},
  {&(_tg__ZTV2A1__6E23x12__8G23x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x12y5[];
extern  VTBL_ENTRY _ZTV8G23x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x12y5[];
static VTBL_ENTRY alt_thunk_names86[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x123fooEv,_ZThn20_N6E23x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x123fooEv,_ZThn20_N6E23x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x12y5 = {  "G23x12y5", // class name
  bases_G23x12y5, 6,
  &(vtc_G23x12y5[0]), // expected_vtbl_contents
  &(vtt_G23x12y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G23x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x12y5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x12y5),7, //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  G23x12y6  : E23x12 , virtual F0 {
  int ff;
  ~G23x12y6(); // tgen
  G23x12y6(); // tgen
};
//SIG(1 G23x12y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G23x12y6 ::~G23x12y6(){ note_dtor("G23x12y6", this);} // tgen
G23x12y6 ::G23x12y6(){ note_ctor("G23x12y6", this);} // tgen

static void Test_G23x12y6()
{
  extern Class_Descriptor cd_G23x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G23x12y6, buf);
    G23x12y6 *dp, &lv = *(dp=new (buf) G23x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G23x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x12y6)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x12*), ABISELECT(32,24), "G23x12y6");
    check_base_class_offset(lv, (B1*)(C23*)(E23x12*), 0, "G23x12y6");
    check_base_class_offset(lv, (C23*)(E23x12*), 0, "G23x12y6");
    check_base_class_offset(lv, (D0*)(E23x12*), ABISELECT(16,12), "G23x12y6");
    check_base_class_offset(lv, (E23x12*), 0, "G23x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G23x12y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G23x12y6.ff");
    test_class_info(&lv, &cd_G23x12y6);
    dp->~G23x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x12y6(Test_G23x12y6, "G23x12y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G23x12y6C1Ev();
extern void _ZN8G23x12y6D1Ev();
Name_Map name_map_G23x12y6[] = {
  NSPAIR(_ZN8G23x12y6C1Ev),
  NSPAIR(_ZN8G23x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x12;
extern VTBL_ENTRY _ZTI6E23x12[];
extern  VTBL_ENTRY _ZTV6E23x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x12y6[] = {
  // 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_E23x12,    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 _ZTI8G23x12y6[];
extern void _ZN6E23x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv)();
extern void ABISELECT(_ZThn32_N6E23x123fooEv,_ZThn24_N6E23x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x12y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x12y6[0]),
  (VTBL_ENTRY)&_ZN6E23x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G23x12y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv),
};
extern VTBL_ENTRY _ZTV8G23x12y6[];
extern void _ZN6E23x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x12__8G23x12y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x12[0]),
  (VTBL_ENTRY)&_ZN6E23x123fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C236E23x12__8G23x12y6[] = {
  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__3C236E23x12__8G23x12y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv)();
extern void ABISELECT(_ZThn32_N6E23x123fooEv,_ZThn24_N6E23x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x12__8G23x12y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E23x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv),
};
static  VTT_ENTRY vtt_G23x12y6[] = {
  {&(_ZTV8G23x12y6[4]),  4,9},
  {&(_tg__ZTV6E23x12__8G23x12y6[3]),  3,4},
  {&(_tg__ZTV3C236E23x12__8G23x12y6[3]),  3,4},
  {&(_tg__ZTV2A1__3C236E23x12__8G23x12y6[3]),  3,4},
  {&(_tg__ZTV2A1__6E23x12__8G23x12y6[3]),  3,4},
  {&(_ZTV8G23x12y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G23x12y6[];
extern  VTBL_ENTRY _ZTV8G23x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x12y6[];
static VTBL_ENTRY alt_thunk_names87[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x123fooEv,_ZThn24_N6E23x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x123fooEv,_ZThn24_N6E23x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x12y6 = {  "G23x12y6", // class name
  bases_G23x12y6, 6,
  &(vtc_G23x12y6[0]), // expected_vtbl_contents
  &(vtt_G23x12y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G23x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x12y6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x12y6),6, //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  G23x12y7  : virtual E23x12 , virtual F0 {
  int ff;
  ~G23x12y7(); // tgen
  G23x12y7(); // tgen
};
//SIG(1 G23x12y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G23x12y7 ::~G23x12y7(){ note_dtor("G23x12y7", this);} // tgen
G23x12y7 ::G23x12y7(){ note_ctor("G23x12y7", this);} // tgen

static void Test_G23x12y7()
{
  extern Class_Descriptor cd_G23x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x12y7, buf);
    G23x12y7 *dp, &lv = *(dp=new (buf) G23x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x12y7)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x12*), ABISELECT(40,28), "G23x12y7");
    check_base_class_offset(lv, (B1*)(C23*)(E23x12*), ABISELECT(16,8), "G23x12y7");
    check_base_class_offset(lv, (C23*)(E23x12*), ABISELECT(16,8), "G23x12y7");
    check_base_class_offset(lv, (D0*)(E23x12*), ABISELECT(32,20), "G23x12y7");
    check_base_class_offset(lv, (E23x12*), ABISELECT(16,8), "G23x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G23x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G23x12y7.ff");
    test_class_info(&lv, &cd_G23x12y7);
    dp->~G23x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x12y7(Test_G23x12y7, "G23x12y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G23x12y7C1Ev();
extern void _ZN8G23x12y7D1Ev();
Name_Map name_map_G23x12y7[] = {
  NSPAIR(_ZN8G23x12y7C1Ev),
  NSPAIR(_ZN8G23x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x12;
extern VTBL_ENTRY _ZTI6E23x12[];
extern  VTBL_ENTRY _ZTV6E23x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x12y7[] = {
  // 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_E23x12,    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 _ZTI8G23x12y7[];
extern void _ZN6E23x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv)();
extern void ABISELECT(_ZThn24_N6E23x123fooEv,_ZThn20_N6E23x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x12y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G23x12y7[0]),
  (VTBL_ENTRY)&_ZN6E23x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G23x12y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv),
};
extern VTBL_ENTRY _ZTV8G23x12y7[];
extern void _ZN6E23x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x12__8G23x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x12[0]),
  (VTBL_ENTRY)&_ZN6E23x123fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C236E23x12__8G23x12y7[] = {
  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__3C236E23x12__8G23x12y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv)();
extern void ABISELECT(_ZThn24_N6E23x123fooEv,_ZThn20_N6E23x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x12__8G23x12y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E23x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv),
};
static  VTT_ENTRY vtt_G23x12y7[] = {
  {&(_ZTV8G23x12y7[5]),  5,14},
  {&(_ZTV8G23x12y7[9]),  9,14},
  {&(_ZTV8G23x12y7[13]),  13,14},
  {&(_tg__ZTV6E23x12__8G23x12y7[3]),  3,4},
  {&(_tg__ZTV3C236E23x12__8G23x12y7[3]),  3,4},
  {&(_tg__ZTV2A1__3C236E23x12__8G23x12y7[3]),  3,4},
  {&(_tg__ZTV2A1__6E23x12__8G23x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x12y7[];
extern  VTBL_ENTRY _ZTV8G23x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x12y7[];
static VTBL_ENTRY alt_thunk_names88[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x123fooEv,_ZTv0_n12_N6E23x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x123fooEv,_ZThn20_N6E23x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x123fooEv,_ZThn20_N6E23x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x12y7 = {  "G23x12y7", // class name
  bases_G23x12y7, 6,
  &(vtc_G23x12y7[0]), // expected_vtbl_contents
  &(vtt_G23x12y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G23x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x12y7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x12y7),7, //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  E24x12  : C24 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E24x123fooEv
  ~E24x12(); // tgen
  E24x12(); // tgen
};
//SIG(-1 E24x12) C1{ BC2{ BC3{ Fi} VBC4{ Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E24x12 ::foo(){vfunc_called(this, "_ZN6E24x123fooEv");}
E24x12 ::~E24x12(){ note_dtor("E24x12", this);} // tgen
E24x12 ::E24x12(){ note_ctor("E24x12", this);} // tgen

static void Test_E24x12()
{
  extern Class_Descriptor cd_E24x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E24x12, buf);
    E24x12 *dp, &lv = *(dp=new (buf) E24x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E24x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E24x12)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(8,4), "E24x12");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(24,20), "E24x12");
    check_base_class_offset(lv, (C24*), 0, "E24x12");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E24x12");
    check_field_offset(lv, fd, ABISELECT(20,16), "E24x12.fd");
    test_class_info(&lv, &cd_E24x12);
    dp->~E24x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE24x12(Test_E24x12, "E24x12", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6E24x12C1Ev();
extern void _ZN6E24x12D1Ev();
Name_Map name_map_E24x12[] = {
  NSPAIR(_ZN6E24x12C1Ev),
  NSPAIR(_ZN6E24x12D1Ev),
  {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_E24x12[] = {
  // 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 _ZTI6E24x12[];
extern void _ZN6E24x123fooEv();
static  VTBL_ENTRY vtc_E24x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x12[0]),
  (VTBL_ENTRY)&_ZN6E24x123fooEv,
};
extern VTBL_ENTRY _ZTV6E24x12[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__6E24x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_E24x12[] = {
  {&(_ZTV6E24x12[3]),  3,4},
  {&(_tg__ZTV3C24__6E24x12[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E24x12[];
extern  VTBL_ENTRY _ZTV6E24x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x12[];
Class_Descriptor cd_E24x12 = {  "E24x12", // class name
  bases_E24x12, 4,
  &(vtc_E24x12[0]), // expected_vtbl_contents
  &(vtt_E24x12[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6E24x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E24x12),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E24x12),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  G24x12y0  : E24x12 , F1 {
  int ff;
  ~G24x12y0(); // tgen
  G24x12y0(); // tgen
};
//SIG(1 G24x12y0) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G24x12y0 ::~G24x12y0(){ note_dtor("G24x12y0", this);} // tgen
G24x12y0 ::G24x12y0(){ note_ctor("G24x12y0", this);} // tgen

static void Test_G24x12y0()
{
  extern Class_Descriptor cd_G24x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x12y0, buf);
    G24x12y0 *dp, &lv = *(dp=new (buf) G24x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x12y0)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x12*), ABISELECT(8,4), "G24x12y0");
    check_base_class_offset(lv, (B0*)(C24*)(E24x12*), ABISELECT(40,32), "G24x12y0");
    check_base_class_offset(lv, (C24*)(E24x12*), 0, "G24x12y0");
    check_base_class_offset(lv, (D0*)(E24x12*), ABISELECT(16,12), "G24x12y0");
    check_base_class_offset(lv, (E24x12*), 0, "G24x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G24x12y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G24x12y0.ff");
    test_class_info(&lv, &cd_G24x12y0);
    dp->~G24x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x12y0(Test_G24x12y0, "G24x12y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G24x12y0C1Ev();
extern void _ZN8G24x12y0D1Ev();
Name_Map name_map_G24x12y0[] = {
  NSPAIR(_ZN8G24x12y0C1Ev),
  NSPAIR(_ZN8G24x12y0D1Ev),
  {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_E24x12;
extern VTBL_ENTRY _ZTI6E24x12[];
extern  VTBL_ENTRY _ZTV6E24x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x12y0[] = {
  // 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_E24x12,    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 _ZTI8G24x12y0[];
extern void _ZN6E24x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x12y0[0]),
  (VTBL_ENTRY)&_ZN6E24x123fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G24x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G24x12y0[];
extern void _ZN6E24x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x12__8G24x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x12[0]),
  (VTBL_ENTRY)&_ZN6E24x123fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C246E24x12__8G24x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x12y0[] = {
  {&(_ZTV8G24x12y0[3]),  3,7},
  {&(_tg__ZTV6E24x12__8G24x12y0[3]),  3,4},
  {&(_tg__ZTV3C246E24x12__8G24x12y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x12y0[];
extern  VTBL_ENTRY _ZTV8G24x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x12y0[];
Class_Descriptor cd_G24x12y0 = {  "G24x12y0", // class name
  bases_G24x12y0, 6,
  &(vtc_G24x12y0[0]), // expected_vtbl_contents
  &(vtt_G24x12y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G24x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x12y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x12y0),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  G24x12y1  : virtual E24x12 , F1 {
  int ff;
  ~G24x12y1(); // tgen
  G24x12y1(); // tgen
};
//SIG(1 G24x12y1) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G24x12y1 ::~G24x12y1(){ note_dtor("G24x12y1", this);} // tgen
G24x12y1 ::G24x12y1(){ note_ctor("G24x12y1", this);} // tgen

static void Test_G24x12y1()
{
  extern Class_Descriptor cd_G24x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x12y1, buf);
    G24x12y1 *dp, &lv = *(dp=new (buf) G24x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x12y1)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x12*), ABISELECT(24,16), "G24x12y1");
    check_base_class_offset(lv, (B0*)(C24*)(E24x12*), ABISELECT(40,32), "G24x12y1");
    check_base_class_offset(lv, (C24*)(E24x12*), ABISELECT(16,12), "G24x12y1");
    check_base_class_offset(lv, (D0*)(E24x12*), ABISELECT(32,24), "G24x12y1");
    check_base_class_offset(lv, (E24x12*), ABISELECT(16,12), "G24x12y1");
    check_base_class_offset(lv, (F1*), 0, "G24x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x12y1.ff");
    test_class_info(&lv, &cd_G24x12y1);
    dp->~G24x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x12y1(Test_G24x12y1, "G24x12y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G24x12y1C1Ev();
extern void _ZN8G24x12y1D1Ev();
Name_Map name_map_G24x12y1[] = {
  NSPAIR(_ZN8G24x12y1C1Ev),
  NSPAIR(_ZN8G24x12y1D1Ev),
  {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_E24x12;
extern VTBL_ENTRY _ZTI6E24x12[];
extern  VTBL_ENTRY _ZTV6E24x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x12y1[] = {
  // 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_E24x12,    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 _ZTI8G24x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E24x123fooEv();
static  VTBL_ENTRY vtc_G24x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G24x12y1[0]),
  (VTBL_ENTRY)&_ZN6E24x123fooEv,
};
extern VTBL_ENTRY _ZTV8G24x12y1[];
extern void _ZN6E24x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x12__8G24x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x12[0]),
  (VTBL_ENTRY)&_ZN6E24x123fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C246E24x12__8G24x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x12y1[] = {
  {&(_ZTV8G24x12y1[4]),  4,10},
  {&(_ZTV8G24x12y1[9]),  9,10},
  {&(_tg__ZTV6E24x12__8G24x12y1[3]),  3,4},
  {&(_tg__ZTV3C246E24x12__8G24x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x12y1[];
extern  VTBL_ENTRY _ZTV8G24x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x12y1[];
Class_Descriptor cd_G24x12y1 = {  "G24x12y1", // class name
  bases_G24x12y1, 6,
  &(vtc_G24x12y1[0]), // expected_vtbl_contents
  &(vtt_G24x12y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G24x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x12y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x12y1),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  G24x12y2  : E24x12 , virtual F1 {
  int ff;
  ~G24x12y2(); // tgen
  G24x12y2(); // tgen
};
//SIG(1 G24x12y2) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G24x12y2 ::~G24x12y2(){ note_dtor("G24x12y2", this);} // tgen
G24x12y2 ::G24x12y2(){ note_ctor("G24x12y2", this);} // tgen

static void Test_G24x12y2()
{
  extern Class_Descriptor cd_G24x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x12y2, buf);
    G24x12y2 *dp, &lv = *(dp=new (buf) G24x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x12y2)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x12*), ABISELECT(8,4), "G24x12y2");
    check_base_class_offset(lv, (B0*)(C24*)(E24x12*), ABISELECT(28,24), "G24x12y2");
    check_base_class_offset(lv, (C24*)(E24x12*), 0, "G24x12y2");
    check_base_class_offset(lv, (D0*)(E24x12*), ABISELECT(16,12), "G24x12y2");
    check_base_class_offset(lv, (E24x12*), 0, "G24x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G24x12y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G24x12y2.ff");
    test_class_info(&lv, &cd_G24x12y2);
    dp->~G24x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x12y2(Test_G24x12y2, "G24x12y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G24x12y2C1Ev();
extern void _ZN8G24x12y2D1Ev();
Name_Map name_map_G24x12y2[] = {
  NSPAIR(_ZN8G24x12y2C1Ev),
  NSPAIR(_ZN8G24x12y2D1Ev),
  {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_E24x12;
extern VTBL_ENTRY _ZTI6E24x12[];
extern  VTBL_ENTRY _ZTV6E24x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x12y2[] = {
  // 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_E24x12,    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 _ZTI8G24x12y2[];
extern void _ZN6E24x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x12y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x12y2[0]),
  (VTBL_ENTRY)&_ZN6E24x123fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G24x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G24x12y2[];
extern void _ZN6E24x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x12__8G24x12y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x12[0]),
  (VTBL_ENTRY)&_ZN6E24x123fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C246E24x12__8G24x12y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x12y2[] = {
  {&(_ZTV8G24x12y2[4]),  4,9},
  {&(_tg__ZTV6E24x12__8G24x12y2[3]),  3,4},
  {&(_tg__ZTV3C246E24x12__8G24x12y2[3]),  3,4},
  {&(_ZTV8G24x12y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G24x12y2[];
extern  VTBL_ENTRY _ZTV8G24x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x12y2[];
Class_Descriptor cd_G24x12y2 = {  "G24x12y2", // class name
  bases_G24x12y2, 6,
  &(vtc_G24x12y2[0]), // expected_vtbl_contents
  &(vtt_G24x12y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G24x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x12y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x12y2),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  G24x12y3  : virtual E24x12 , virtual F1 {
  int ff;
  ~G24x12y3(); // tgen
  G24x12y3(); // tgen
};
//SIG(1 G24x12y3) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G24x12y3 ::~G24x12y3(){ note_dtor("G24x12y3", this);} // tgen
G24x12y3 ::G24x12y3(){ note_ctor("G24x12y3", this);} // tgen

static void Test_G24x12y3()
{
  extern Class_Descriptor cd_G24x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G24x12y3, buf);
    G24x12y3 *dp, &lv = *(dp=new (buf) G24x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G24x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x12y3)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x12*), ABISELECT(24,12), "G24x12y3");
    check_base_class_offset(lv, (B0*)(C24*)(E24x12*), ABISELECT(40,28), "G24x12y3");
    check_base_class_offset(lv, (C24*)(E24x12*), ABISELECT(16,8), "G24x12y3");
    check_base_class_offset(lv, (D0*)(E24x12*), ABISELECT(32,20), "G24x12y3");
    check_base_class_offset(lv, (E24x12*), ABISELECT(16,8), "G24x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G24x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G24x12y3.ff");
    test_class_info(&lv, &cd_G24x12y3);
    dp->~G24x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x12y3(Test_G24x12y3, "G24x12y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G24x12y3C1Ev();
extern void _ZN8G24x12y3D1Ev();
Name_Map name_map_G24x12y3[] = {
  NSPAIR(_ZN8G24x12y3C1Ev),
  NSPAIR(_ZN8G24x12y3D1Ev),
  {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_E24x12;
extern VTBL_ENTRY _ZTI6E24x12[];
extern  VTBL_ENTRY _ZTV6E24x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x12y3[] = {
  // 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_E24x12,    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 _ZTI8G24x12y3[];
extern void _ZN6E24x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x12y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G24x12y3[0]),
  (VTBL_ENTRY)&_ZN6E24x123fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G24x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G24x12y3[];
extern void _ZN6E24x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x12__8G24x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x12[0]),
  (VTBL_ENTRY)&_ZN6E24x123fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C246E24x12__8G24x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x12y3[] = {
  {&(_ZTV8G24x12y3[5]),  5,14},
  {&(_ZTV8G24x12y3[9]),  9,14},
  {&(_ZTV8G24x12y3[13]),  13,14},
  {&(_tg__ZTV6E24x12__8G24x12y3[3]),  3,4},
  {&(_tg__ZTV3C246E24x12__8G24x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x12y3[];
extern  VTBL_ENTRY _ZTV8G24x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x12y3[];
Class_Descriptor cd_G24x12y3 = {  "G24x12y3", // class name
  bases_G24x12y3, 6,
  &(vtc_G24x12y3[0]), // expected_vtbl_contents
  &(vtt_G24x12y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G24x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x12y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x12y3),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  G24x12y4  : E24x12 , F0 {
  int ff;
  ~G24x12y4(); // tgen
  G24x12y4(); // tgen
};
//SIG(1 G24x12y4) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G24x12y4 ::~G24x12y4(){ note_dtor("G24x12y4", this);} // tgen
G24x12y4 ::G24x12y4(){ note_ctor("G24x12y4", this);} // tgen

static void Test_G24x12y4()
{
  extern Class_Descriptor cd_G24x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G24x12y4, buf);
    G24x12y4 *dp, &lv = *(dp=new (buf) G24x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G24x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x12y4)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x12*), ABISELECT(8,4), "G24x12y4");
    check_base_class_offset(lv, (B0*)(C24*)(E24x12*), ABISELECT(32,28), "G24x12y4");
    check_base_class_offset(lv, (C24*)(E24x12*), 0, "G24x12y4");
    check_base_class_offset(lv, (D0*)(E24x12*), ABISELECT(16,12), "G24x12y4");
    check_base_class_offset(lv, (E24x12*), 0, "G24x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G24x12y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G24x12y4.ff");
    test_class_info(&lv, &cd_G24x12y4);
    dp->~G24x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x12y4(Test_G24x12y4, "G24x12y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G24x12y4C1Ev();
extern void _ZN8G24x12y4D1Ev();
Name_Map name_map_G24x12y4[] = {
  NSPAIR(_ZN8G24x12y4C1Ev),
  NSPAIR(_ZN8G24x12y4D1Ev),
  {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_E24x12;
extern VTBL_ENTRY _ZTI6E24x12[];
extern  VTBL_ENTRY _ZTV6E24x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x12y4[] = {
  // 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_E24x12,    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 _ZTI8G24x12y4[];
extern void _ZN6E24x123fooEv();
static  VTBL_ENTRY vtc_G24x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x12y4[0]),
  (VTBL_ENTRY)&_ZN6E24x123fooEv,
};
extern VTBL_ENTRY _ZTV8G24x12y4[];
extern void _ZN6E24x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x12__8G24x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x12[0]),
  (VTBL_ENTRY)&_ZN6E24x123fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C246E24x12__8G24x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x12y4[] = {
  {&(_ZTV8G24x12y4[3]),  3,4},
  {&(_tg__ZTV6E24x12__8G24x12y4[3]),  3,4},
  {&(_tg__ZTV3C246E24x12__8G24x12y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x12y4[];
extern  VTBL_ENTRY _ZTV8G24x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x12y4[];
Class_Descriptor cd_G24x12y4 = {  "G24x12y4", // class name
  bases_G24x12y4, 6,
  &(vtc_G24x12y4[0]), // expected_vtbl_contents
  &(vtt_G24x12y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G24x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x12y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x12y4),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  G24x12y5  : virtual E24x12 , F0 {
  int ff;
  ~G24x12y5(); // tgen
  G24x12y5(); // tgen
};
//SIG(1 G24x12y5) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G24x12y5 ::~G24x12y5(){ note_dtor("G24x12y5", this);} // tgen
G24x12y5 ::G24x12y5(){ note_ctor("G24x12y5", this);} // tgen

static void Test_G24x12y5()
{
  extern Class_Descriptor cd_G24x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x12y5, buf);
    G24x12y5 *dp, &lv = *(dp=new (buf) G24x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x12y5)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x12*), ABISELECT(24,16), "G24x12y5");
    check_base_class_offset(lv, (B0*)(C24*)(E24x12*), ABISELECT(40,32), "G24x12y5");
    check_base_class_offset(lv, (C24*)(E24x12*), ABISELECT(16,12), "G24x12y5");
    check_base_class_offset(lv, (D0*)(E24x12*), ABISELECT(32,24), "G24x12y5");
    check_base_class_offset(lv, (E24x12*), ABISELECT(16,12), "G24x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G24x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x12y5.ff");
    test_class_info(&lv, &cd_G24x12y5);
    dp->~G24x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x12y5(Test_G24x12y5, "G24x12y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G24x12y5C1Ev();
extern void _ZN8G24x12y5D1Ev();
Name_Map name_map_G24x12y5[] = {
  NSPAIR(_ZN8G24x12y5C1Ev),
  NSPAIR(_ZN8G24x12y5D1Ev),
  {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_E24x12;
extern VTBL_ENTRY _ZTI6E24x12[];
extern  VTBL_ENTRY _ZTV6E24x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x12y5[] = {
  // 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_E24x12,    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 _ZTI8G24x12y5[];
extern void _ZN6E24x123fooEv();
static  VTBL_ENTRY vtc_G24x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G24x12y5[0]),
  (VTBL_ENTRY)&_ZN6E24x123fooEv,
};
extern VTBL_ENTRY _ZTV8G24x12y5[];
extern void _ZN6E24x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x12__8G24x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x12[0]),
  (VTBL_ENTRY)&_ZN6E24x123fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C246E24x12__8G24x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x12y5[] = {
  {&(_ZTV8G24x12y5[4]),  4,9},
  {&(_ZTV8G24x12y5[8]),  8,9},
  {&(_tg__ZTV6E24x12__8G24x12y5[3]),  3,4},
  {&(_tg__ZTV3C246E24x12__8G24x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x12y5[];
extern  VTBL_ENTRY _ZTV8G24x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x12y5[];
Class_Descriptor cd_G24x12y5 = {  "G24x12y5", // class name
  bases_G24x12y5, 6,
  &(vtc_G24x12y5[0]), // expected_vtbl_contents
  &(vtt_G24x12y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G24x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x12y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x12y5),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  G24x12y6  : E24x12 , virtual F0 {
  int ff;
  ~G24x12y6(); // tgen
  G24x12y6(); // tgen
};
//SIG(1 G24x12y6) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G24x12y6 ::~G24x12y6(){ note_dtor("G24x12y6", this);} // tgen
G24x12y6 ::G24x12y6(){ note_ctor("G24x12y6", this);} // tgen

static void Test_G24x12y6()
{
  extern Class_Descriptor cd_G24x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G24x12y6, buf);
    G24x12y6 *dp, &lv = *(dp=new (buf) G24x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G24x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x12y6)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x12*), ABISELECT(8,4), "G24x12y6");
    check_base_class_offset(lv, (B0*)(C24*)(E24x12*), ABISELECT(28,24), "G24x12y6");
    check_base_class_offset(lv, (C24*)(E24x12*), 0, "G24x12y6");
    check_base_class_offset(lv, (D0*)(E24x12*), ABISELECT(16,12), "G24x12y6");
    check_base_class_offset(lv, (E24x12*), 0, "G24x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G24x12y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G24x12y6.ff");
    test_class_info(&lv, &cd_G24x12y6);
    dp->~G24x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x12y6(Test_G24x12y6, "G24x12y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G24x12y6C1Ev();
extern void _ZN8G24x12y6D1Ev();
Name_Map name_map_G24x12y6[] = {
  NSPAIR(_ZN8G24x12y6C1Ev),
  NSPAIR(_ZN8G24x12y6D1Ev),
  {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_E24x12;
extern VTBL_ENTRY _ZTI6E24x12[];
extern  VTBL_ENTRY _ZTV6E24x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x12y6[] = {
  // 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_E24x12,    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 _ZTI8G24x12y6[];
extern void _ZN6E24x123fooEv();
static  VTBL_ENTRY vtc_G24x12y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x12y6[0]),
  (VTBL_ENTRY)&_ZN6E24x123fooEv,
};
extern VTBL_ENTRY _ZTV8G24x12y6[];
extern void _ZN6E24x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x12__8G24x12y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x12[0]),
  (VTBL_ENTRY)&_ZN6E24x123fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C246E24x12__8G24x12y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x12y6[] = {
  {&(_ZTV8G24x12y6[4]),  4,5},
  {&(_tg__ZTV6E24x12__8G24x12y6[3]),  3,4},
  {&(_tg__ZTV3C246E24x12__8G24x12y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x12y6[];
extern  VTBL_ENTRY _ZTV8G24x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x12y6[];
Class_Descriptor cd_G24x12y6 = {  "G24x12y6", // class name
  bases_G24x12y6, 6,
  &(vtc_G24x12y6[0]), // expected_vtbl_contents
  &(vtt_G24x12y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G24x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x12y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x12y6),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  G24x12y7  : virtual E24x12 , virtual F0 {
  int ff;
  ~G24x12y7(); // tgen
  G24x12y7(); // tgen
};
//SIG(1 G24x12y7) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G24x12y7 ::~G24x12y7(){ note_dtor("G24x12y7", this);} // tgen
G24x12y7 ::G24x12y7(){ note_ctor("G24x12y7", this);} // tgen

static void Test_G24x12y7()
{
  extern Class_Descriptor cd_G24x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x12y7, buf);
    G24x12y7 *dp, &lv = *(dp=new (buf) G24x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x12y7)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x12*), ABISELECT(24,12), "G24x12y7");
    check_base_class_offset(lv, (B0*)(C24*)(E24x12*), ABISELECT(40,28), "G24x12y7");
    check_base_class_offset(lv, (C24*)(E24x12*), ABISELECT(16,8), "G24x12y7");
    check_base_class_offset(lv, (D0*)(E24x12*), ABISELECT(32,20), "G24x12y7");
    check_base_class_offset(lv, (E24x12*), ABISELECT(16,8), "G24x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G24x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G24x12y7.ff");
    test_class_info(&lv, &cd_G24x12y7);
    dp->~G24x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x12y7(Test_G24x12y7, "G24x12y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G24x12y7C1Ev();
extern void _ZN8G24x12y7D1Ev();
Name_Map name_map_G24x12y7[] = {
  NSPAIR(_ZN8G24x12y7C1Ev),
  NSPAIR(_ZN8G24x12y7D1Ev),
  {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_E24x12;
extern VTBL_ENTRY _ZTI6E24x12[];
extern  VTBL_ENTRY _ZTV6E24x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x12y7[] = {
  // 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_E24x12,    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 _ZTI8G24x12y7[];
extern void _ZN6E24x123fooEv();
static  VTBL_ENTRY vtc_G24x12y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G24x12y7[0]),
  (VTBL_ENTRY)&_ZN6E24x123fooEv,
};
extern VTBL_ENTRY _ZTV8G24x12y7[];
extern void _ZN6E24x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x12__8G24x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x12[0]),
  (VTBL_ENTRY)&_ZN6E24x123fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C246E24x12__8G24x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x12y7[] = {
  {&(_ZTV8G24x12y7[5]),  5,10},
  {&(_ZTV8G24x12y7[9]),  9,10},
  {&(_tg__ZTV6E24x12__8G24x12y7[3]),  3,4},
  {&(_tg__ZTV3C246E24x12__8G24x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x12y7[];
extern  VTBL_ENTRY _ZTV8G24x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x12y7[];
Class_Descriptor cd_G24x12y7 = {  "G24x12y7", // class name
  bases_G24x12y7, 6,
  &(vtc_G24x12y7[0]), // expected_vtbl_contents
  &(vtt_G24x12y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G24x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x12y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x12y7),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  E25x12  : C25 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E25x123fooEv
  ~E25x12(); // tgen
  E25x12(); // tgen
};
//SIG(-1 E25x12) C1{ BC2{ BC3{ v1 Fi} VBC4{ Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E25x12 ::foo(){vfunc_called(this, "_ZN6E25x123fooEv");}
E25x12 ::~E25x12(){ note_dtor("E25x12", this);} // tgen
E25x12 ::E25x12(){ note_ctor("E25x12", this);} // tgen

static void Test_E25x12()
{
  extern Class_Descriptor cd_E25x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E25x12, buf);
    E25x12 *dp, &lv = *(dp=new (buf) E25x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E25x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E25x12)");
    check_base_class_offset(lv, (A1*)(C25*), 0, "E25x12");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(24,20), "E25x12");
    check_base_class_offset(lv, (C25*), 0, "E25x12");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E25x12");
    check_field_offset(lv, fd, ABISELECT(20,16), "E25x12.fd");
    test_class_info(&lv, &cd_E25x12);
    dp->~E25x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE25x12(Test_E25x12, "E25x12", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6E25x12C1Ev();
extern void _ZN6E25x12D1Ev();
Name_Map name_map_E25x12[] = {
  NSPAIR(_ZN6E25x12C1Ev),
  NSPAIR(_ZN6E25x12D1Ev),
  {0,0}
};
extern Class_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_E25x12[] = {
  // 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 _ZTI6E25x12[];
extern void _ZN6E25x123fooEv();
static  VTBL_ENTRY vtc_E25x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x12[0]),
  (VTBL_ENTRY)&_ZN6E25x123fooEv,
};
extern VTBL_ENTRY _ZTV6E25x12[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__6E25x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_E25x12[] = {
  {&(_ZTV6E25x12[3]),  3,4},
  {&(_tg__ZTV3C25__6E25x12[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E25x12[];
extern  VTBL_ENTRY _ZTV6E25x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x12[];
Class_Descriptor cd_E25x12 = {  "E25x12", // class name
  bases_E25x12, 4,
  &(vtc_E25x12[0]), // expected_vtbl_contents
  &(vtt_E25x12[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6E25x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E25x12),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E25x12),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  G25x12y0  : E25x12 , F1 {
  int ff;
  ~G25x12y0(); // tgen
  G25x12y0(); // tgen
};
//SIG(1 G25x12y0) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G25x12y0 ::~G25x12y0(){ note_dtor("G25x12y0", this);} // tgen
G25x12y0 ::G25x12y0(){ note_ctor("G25x12y0", this);} // tgen

static void Test_G25x12y0()
{
  extern Class_Descriptor cd_G25x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x12y0, buf);
    G25x12y0 *dp, &lv = *(dp=new (buf) G25x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x12y0)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x12*), 0, "G25x12y0");
    check_base_class_offset(lv, (B0*)(C25*)(E25x12*), ABISELECT(40,32), "G25x12y0");
    check_base_class_offset(lv, (C25*)(E25x12*), 0, "G25x12y0");
    check_base_class_offset(lv, (D0*)(E25x12*), ABISELECT(16,12), "G25x12y0");
    check_base_class_offset(lv, (E25x12*), 0, "G25x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G25x12y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G25x12y0.ff");
    test_class_info(&lv, &cd_G25x12y0);
    dp->~G25x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x12y0(Test_G25x12y0, "G25x12y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G25x12y0C1Ev();
extern void _ZN8G25x12y0D1Ev();
Name_Map name_map_G25x12y0[] = {
  NSPAIR(_ZN8G25x12y0C1Ev),
  NSPAIR(_ZN8G25x12y0D1Ev),
  {0,0}
};
extern Class_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_E25x12;
extern VTBL_ENTRY _ZTI6E25x12[];
extern  VTBL_ENTRY _ZTV6E25x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x12y0[] = {
  // 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_E25x12,    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 _ZTI8G25x12y0[];
extern void _ZN6E25x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x12y0[0]),
  (VTBL_ENTRY)&_ZN6E25x123fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G25x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G25x12y0[];
extern void _ZN6E25x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x12__8G25x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x12[0]),
  (VTBL_ENTRY)&_ZN6E25x123fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C256E25x12__8G25x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x12y0[] = {
  {&(_ZTV8G25x12y0[3]),  3,7},
  {&(_tg__ZTV6E25x12__8G25x12y0[3]),  3,4},
  {&(_tg__ZTV3C256E25x12__8G25x12y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x12y0[];
extern  VTBL_ENTRY _ZTV8G25x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x12y0[];
Class_Descriptor cd_G25x12y0 = {  "G25x12y0", // class name
  bases_G25x12y0, 6,
  &(vtc_G25x12y0[0]), // expected_vtbl_contents
  &(vtt_G25x12y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G25x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x12y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x12y0),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  G25x12y1  : virtual E25x12 , F1 {
  int ff;
  ~G25x12y1(); // tgen
  G25x12y1(); // tgen
};
//SIG(1 G25x12y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G25x12y1 ::~G25x12y1(){ note_dtor("G25x12y1", this);} // tgen
G25x12y1 ::G25x12y1(){ note_ctor("G25x12y1", this);} // tgen

static void Test_G25x12y1()
{
  extern Class_Descriptor cd_G25x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x12y1, buf);
    G25x12y1 *dp, &lv = *(dp=new (buf) G25x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x12y1)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x12*), ABISELECT(16,12), "G25x12y1");
    check_base_class_offset(lv, (B0*)(C25*)(E25x12*), ABISELECT(40,32), "G25x12y1");
    check_base_class_offset(lv, (C25*)(E25x12*), ABISELECT(16,12), "G25x12y1");
    check_base_class_offset(lv, (D0*)(E25x12*), ABISELECT(32,24), "G25x12y1");
    check_base_class_offset(lv, (E25x12*), ABISELECT(16,12), "G25x12y1");
    check_base_class_offset(lv, (F1*), 0, "G25x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x12y1.ff");
    test_class_info(&lv, &cd_G25x12y1);
    dp->~G25x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x12y1(Test_G25x12y1, "G25x12y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G25x12y1C1Ev();
extern void _ZN8G25x12y1D1Ev();
Name_Map name_map_G25x12y1[] = {
  NSPAIR(_ZN8G25x12y1C1Ev),
  NSPAIR(_ZN8G25x12y1D1Ev),
  {0,0}
};
extern Class_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_E25x12;
extern VTBL_ENTRY _ZTI6E25x12[];
extern  VTBL_ENTRY _ZTV6E25x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x12y1[] = {
  // 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_E25x12,    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 _ZTI8G25x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E25x123fooEv();
static  VTBL_ENTRY vtc_G25x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G25x12y1[0]),
  (VTBL_ENTRY)&_ZN6E25x123fooEv,
};
extern VTBL_ENTRY _ZTV8G25x12y1[];
extern void _ZN6E25x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x12__8G25x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x12[0]),
  (VTBL_ENTRY)&_ZN6E25x123fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C256E25x12__8G25x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x12y1[] = {
  {&(_ZTV8G25x12y1[4]),  4,10},
  {&(_ZTV8G25x12y1[9]),  9,10},
  {&(_tg__ZTV6E25x12__8G25x12y1[3]),  3,4},
  {&(_tg__ZTV3C256E25x12__8G25x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x12y1[];
extern  VTBL_ENTRY _ZTV8G25x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x12y1[];
Class_Descriptor cd_G25x12y1 = {  "G25x12y1", // class name
  bases_G25x12y1, 6,
  &(vtc_G25x12y1[0]), // expected_vtbl_contents
  &(vtt_G25x12y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G25x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x12y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x12y1),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  G25x12y2  : E25x12 , virtual F1 {
  int ff;
  ~G25x12y2(); // tgen
  G25x12y2(); // tgen
};
//SIG(1 G25x12y2) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G25x12y2 ::~G25x12y2(){ note_dtor("G25x12y2", this);} // tgen
G25x12y2 ::G25x12y2(){ note_ctor("G25x12y2", this);} // tgen

static void Test_G25x12y2()
{
  extern Class_Descriptor cd_G25x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x12y2, buf);
    G25x12y2 *dp, &lv = *(dp=new (buf) G25x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x12y2)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x12*), 0, "G25x12y2");
    check_base_class_offset(lv, (B0*)(C25*)(E25x12*), ABISELECT(28,24), "G25x12y2");
    check_base_class_offset(lv, (C25*)(E25x12*), 0, "G25x12y2");
    check_base_class_offset(lv, (D0*)(E25x12*), ABISELECT(16,12), "G25x12y2");
    check_base_class_offset(lv, (E25x12*), 0, "G25x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G25x12y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G25x12y2.ff");
    test_class_info(&lv, &cd_G25x12y2);
    dp->~G25x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x12y2(Test_G25x12y2, "G25x12y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G25x12y2C1Ev();
extern void _ZN8G25x12y2D1Ev();
Name_Map name_map_G25x12y2[] = {
  NSPAIR(_ZN8G25x12y2C1Ev),
  NSPAIR(_ZN8G25x12y2D1Ev),
  {0,0}
};
extern Class_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_E25x12;
extern VTBL_ENTRY _ZTI6E25x12[];
extern  VTBL_ENTRY _ZTV6E25x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x12y2[] = {
  // 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_E25x12,    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 _ZTI8G25x12y2[];
extern void _ZN6E25x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x12y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x12y2[0]),
  (VTBL_ENTRY)&_ZN6E25x123fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G25x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G25x12y2[];
extern void _ZN6E25x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x12__8G25x12y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x12[0]),
  (VTBL_ENTRY)&_ZN6E25x123fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C256E25x12__8G25x12y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x12y2[] = {
  {&(_ZTV8G25x12y2[4]),  4,9},
  {&(_tg__ZTV6E25x12__8G25x12y2[3]),  3,4},
  {&(_tg__ZTV3C256E25x12__8G25x12y2[3]),  3,4},
  {&(_ZTV8G25x12y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G25x12y2[];
extern  VTBL_ENTRY _ZTV8G25x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x12y2[];
Class_Descriptor cd_G25x12y2 = {  "G25x12y2", // class name
  bases_G25x12y2, 6,
  &(vtc_G25x12y2[0]), // expected_vtbl_contents
  &(vtt_G25x12y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G25x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x12y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x12y2),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  G25x12y3  : virtual E25x12 , virtual F1 {
  int ff;
  ~G25x12y3(); // tgen
  G25x12y3(); // tgen
};
//SIG(1 G25x12y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G25x12y3 ::~G25x12y3(){ note_dtor("G25x12y3", this);} // tgen
G25x12y3 ::G25x12y3(){ note_ctor("G25x12y3", this);} // tgen

static void Test_G25x12y3()
{
  extern Class_Descriptor cd_G25x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G25x12y3, buf);
    G25x12y3 *dp, &lv = *(dp=new (buf) G25x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G25x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x12y3)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x12*), ABISELECT(16,8), "G25x12y3");
    check_base_class_offset(lv, (B0*)(C25*)(E25x12*), ABISELECT(40,28), "G25x12y3");
    check_base_class_offset(lv, (C25*)(E25x12*), ABISELECT(16,8), "G25x12y3");
    check_base_class_offset(lv, (D0*)(E25x12*), ABISELECT(32,20), "G25x12y3");
    check_base_class_offset(lv, (E25x12*), ABISELECT(16,8), "G25x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G25x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G25x12y3.ff");
    test_class_info(&lv, &cd_G25x12y3);
    dp->~G25x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x12y3(Test_G25x12y3, "G25x12y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G25x12y3C1Ev();
extern void _ZN8G25x12y3D1Ev();
Name_Map name_map_G25x12y3[] = {
  NSPAIR(_ZN8G25x12y3C1Ev),
  NSPAIR(_ZN8G25x12y3D1Ev),
  {0,0}
};
extern Class_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_E25x12;
extern VTBL_ENTRY _ZTI6E25x12[];
extern  VTBL_ENTRY _ZTV6E25x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x12y3[] = {
  // 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_E25x12,    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 _ZTI8G25x12y3[];
extern void _ZN6E25x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x12y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G25x12y3[0]),
  (VTBL_ENTRY)&_ZN6E25x123fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G25x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G25x12y3[];
extern void _ZN6E25x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x12__8G25x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x12[0]),
  (VTBL_ENTRY)&_ZN6E25x123fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C256E25x12__8G25x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x12y3[] = {
  {&(_ZTV8G25x12y3[5]),  5,14},
  {&(_ZTV8G25x12y3[9]),  9,14},
  {&(_ZTV8G25x12y3[13]),  13,14},
  {&(_tg__ZTV6E25x12__8G25x12y3[3]),  3,4},
  {&(_tg__ZTV3C256E25x12__8G25x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x12y3[];
extern  VTBL_ENTRY _ZTV8G25x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x12y3[];
Class_Descriptor cd_G25x12y3 = {  "G25x12y3", // class name
  bases_G25x12y3, 6,
  &(vtc_G25x12y3[0]), // expected_vtbl_contents
  &(vtt_G25x12y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G25x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x12y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x12y3),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  G25x12y4  : E25x12 , F0 {
  int ff;
  ~G25x12y4(); // tgen
  G25x12y4(); // tgen
};
//SIG(1 G25x12y4) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G25x12y4 ::~G25x12y4(){ note_dtor("G25x12y4", this);} // tgen
G25x12y4 ::G25x12y4(){ note_ctor("G25x12y4", this);} // tgen

static void Test_G25x12y4()
{
  extern Class_Descriptor cd_G25x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G25x12y4, buf);
    G25x12y4 *dp, &lv = *(dp=new (buf) G25x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G25x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x12y4)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x12*), 0, "G25x12y4");
    check_base_class_offset(lv, (B0*)(C25*)(E25x12*), ABISELECT(32,28), "G25x12y4");
    check_base_class_offset(lv, (C25*)(E25x12*), 0, "G25x12y4");
    check_base_class_offset(lv, (D0*)(E25x12*), ABISELECT(16,12), "G25x12y4");
    check_base_class_offset(lv, (E25x12*), 0, "G25x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G25x12y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G25x12y4.ff");
    test_class_info(&lv, &cd_G25x12y4);
    dp->~G25x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x12y4(Test_G25x12y4, "G25x12y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G25x12y4C1Ev();
extern void _ZN8G25x12y4D1Ev();
Name_Map name_map_G25x12y4[] = {
  NSPAIR(_ZN8G25x12y4C1Ev),
  NSPAIR(_ZN8G25x12y4D1Ev),
  {0,0}
};
extern Class_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_E25x12;
extern VTBL_ENTRY _ZTI6E25x12[];
extern  VTBL_ENTRY _ZTV6E25x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x12y4[] = {
  // 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_E25x12,    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 _ZTI8G25x12y4[];
extern void _ZN6E25x123fooEv();
static  VTBL_ENTRY vtc_G25x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x12y4[0]),
  (VTBL_ENTRY)&_ZN6E25x123fooEv,
};
extern VTBL_ENTRY _ZTV8G25x12y4[];
extern void _ZN6E25x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x12__8G25x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x12[0]),
  (VTBL_ENTRY)&_ZN6E25x123fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C256E25x12__8G25x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x12y4[] = {
  {&(_ZTV8G25x12y4[3]),  3,4},
  {&(_tg__ZTV6E25x12__8G25x12y4[3]),  3,4},
  {&(_tg__ZTV3C256E25x12__8G25x12y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x12y4[];
extern  VTBL_ENTRY _ZTV8G25x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x12y4[];
Class_Descriptor cd_G25x12y4 = {  "G25x12y4", // class name
  bases_G25x12y4, 6,
  &(vtc_G25x12y4[0]), // expected_vtbl_contents
  &(vtt_G25x12y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G25x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x12y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x12y4),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  G25x12y5  : virtual E25x12 , F0 {
  int ff;
  ~G25x12y5(); // tgen
  G25x12y5(); // tgen
};
//SIG(1 G25x12y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G25x12y5 ::~G25x12y5(){ note_dtor("G25x12y5", this);} // tgen
G25x12y5 ::G25x12y5(){ note_ctor("G25x12y5", this);} // tgen

static void Test_G25x12y5()
{
  extern Class_Descriptor cd_G25x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x12y5, buf);
    G25x12y5 *dp, &lv = *(dp=new (buf) G25x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x12y5)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x12*), ABISELECT(16,12), "G25x12y5");
    check_base_class_offset(lv, (B0*)(C25*)(E25x12*), ABISELECT(40,32), "G25x12y5");
    check_base_class_offset(lv, (C25*)(E25x12*), ABISELECT(16,12), "G25x12y5");
    check_base_class_offset(lv, (D0*)(E25x12*), ABISELECT(32,24), "G25x12y5");
    check_base_class_offset(lv, (E25x12*), ABISELECT(16,12), "G25x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G25x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x12y5.ff");
    test_class_info(&lv, &cd_G25x12y5);
    dp->~G25x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x12y5(Test_G25x12y5, "G25x12y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G25x12y5C1Ev();
extern void _ZN8G25x12y5D1Ev();
Name_Map name_map_G25x12y5[] = {
  NSPAIR(_ZN8G25x12y5C1Ev),
  NSPAIR(_ZN8G25x12y5D1Ev),
  {0,0}
};
extern Class_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_E25x12;
extern VTBL_ENTRY _ZTI6E25x12[];
extern  VTBL_ENTRY _ZTV6E25x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x12y5[] = {
  // 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_E25x12,    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 _ZTI8G25x12y5[];
extern void _ZN6E25x123fooEv();
static  VTBL_ENTRY vtc_G25x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G25x12y5[0]),
  (VTBL_ENTRY)&_ZN6E25x123fooEv,
};
extern VTBL_ENTRY _ZTV8G25x12y5[];
extern void _ZN6E25x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x12__8G25x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x12[0]),
  (VTBL_ENTRY)&_ZN6E25x123fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C256E25x12__8G25x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x12y5[] = {
  {&(_ZTV8G25x12y5[4]),  4,9},
  {&(_ZTV8G25x12y5[8]),  8,9},
  {&(_tg__ZTV6E25x12__8G25x12y5[3]),  3,4},
  {&(_tg__ZTV3C256E25x12__8G25x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x12y5[];
extern  VTBL_ENTRY _ZTV8G25x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x12y5[];
Class_Descriptor cd_G25x12y5 = {  "G25x12y5", // class name
  bases_G25x12y5, 6,
  &(vtc_G25x12y5[0]), // expected_vtbl_contents
  &(vtt_G25x12y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G25x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x12y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x12y5),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  G25x12y6  : E25x12 , virtual F0 {
  int ff;
  ~G25x12y6(); // tgen
  G25x12y6(); // tgen
};
//SIG(1 G25x12y6) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G25x12y6 ::~G25x12y6(){ note_dtor("G25x12y6", this);} // tgen
G25x12y6 ::G25x12y6(){ note_ctor("G25x12y6", this);} // tgen

static void Test_G25x12y6()
{
  extern Class_Descriptor cd_G25x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G25x12y6, buf);
    G25x12y6 *dp, &lv = *(dp=new (buf) G25x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G25x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x12y6)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x12*), 0, "G25x12y6");
    check_base_class_offset(lv, (B0*)(C25*)(E25x12*), ABISELECT(28,24), "G25x12y6");
    check_base_class_offset(lv, (C25*)(E25x12*), 0, "G25x12y6");
    check_base_class_offset(lv, (D0*)(E25x12*), ABISELECT(16,12), "G25x12y6");
    check_base_class_offset(lv, (E25x12*), 0, "G25x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G25x12y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G25x12y6.ff");
    test_class_info(&lv, &cd_G25x12y6);
    dp->~G25x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x12y6(Test_G25x12y6, "G25x12y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G25x12y6C1Ev();
extern void _ZN8G25x12y6D1Ev();
Name_Map name_map_G25x12y6[] = {
  NSPAIR(_ZN8G25x12y6C1Ev),
  NSPAIR(_ZN8G25x12y6D1Ev),
  {0,0}
};
extern Class_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_E25x12;
extern VTBL_ENTRY _ZTI6E25x12[];
extern  VTBL_ENTRY _ZTV6E25x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x12y6[] = {
  // 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_E25x12,    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 _ZTI8G25x12y6[];
extern void _ZN6E25x123fooEv();
static  VTBL_ENTRY vtc_G25x12y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x12y6[0]),
  (VTBL_ENTRY)&_ZN6E25x123fooEv,
};
extern VTBL_ENTRY _ZTV8G25x12y6[];
extern void _ZN6E25x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x12__8G25x12y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x12[0]),
  (VTBL_ENTRY)&_ZN6E25x123fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C256E25x12__8G25x12y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x12y6[] = {
  {&(_ZTV8G25x12y6[4]),  4,5},
  {&(_tg__ZTV6E25x12__8G25x12y6[3]),  3,4},
  {&(_tg__ZTV3C256E25x12__8G25x12y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x12y6[];
extern  VTBL_ENTRY _ZTV8G25x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x12y6[];
Class_Descriptor cd_G25x12y6 = {  "G25x12y6", // class name
  bases_G25x12y6, 6,
  &(vtc_G25x12y6[0]), // expected_vtbl_contents
  &(vtt_G25x12y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G25x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x12y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x12y6),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  G25x12y7  : virtual E25x12 , virtual F0 {
  int ff;
  ~G25x12y7(); // tgen
  G25x12y7(); // tgen
};
//SIG(1 G25x12y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G25x12y7 ::~G25x12y7(){ note_dtor("G25x12y7", this);} // tgen
G25x12y7 ::G25x12y7(){ note_ctor("G25x12y7", this);} // tgen

static void Test_G25x12y7()
{
  extern Class_Descriptor cd_G25x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x12y7, buf);
    G25x12y7 *dp, &lv = *(dp=new (buf) G25x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x12y7)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x12*), ABISELECT(16,8), "G25x12y7");
    check_base_class_offset(lv, (B0*)(C25*)(E25x12*), ABISELECT(40,28), "G25x12y7");
    check_base_class_offset(lv, (C25*)(E25x12*), ABISELECT(16,8), "G25x12y7");
    check_base_class_offset(lv, (D0*)(E25x12*), ABISELECT(32,20), "G25x12y7");
    check_base_class_offset(lv, (E25x12*), ABISELECT(16,8), "G25x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G25x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G25x12y7.ff");
    test_class_info(&lv, &cd_G25x12y7);
    dp->~G25x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x12y7(Test_G25x12y7, "G25x12y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G25x12y7C1Ev();
extern void _ZN8G25x12y7D1Ev();
Name_Map name_map_G25x12y7[] = {
  NSPAIR(_ZN8G25x12y7C1Ev),
  NSPAIR(_ZN8G25x12y7D1Ev),
  {0,0}
};
extern Class_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_E25x12;
extern VTBL_ENTRY _ZTI6E25x12[];
extern  VTBL_ENTRY _ZTV6E25x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x12y7[] = {
  // 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_E25x12,    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 _ZTI8G25x12y7[];
extern void _ZN6E25x123fooEv();
static  VTBL_ENTRY vtc_G25x12y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G25x12y7[0]),
  (VTBL_ENTRY)&_ZN6E25x123fooEv,
};
extern VTBL_ENTRY _ZTV8G25x12y7[];
extern void _ZN6E25x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x12__8G25x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x12[0]),
  (VTBL_ENTRY)&_ZN6E25x123fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C256E25x12__8G25x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x12y7[] = {
  {&(_ZTV8G25x12y7[5]),  5,10},
  {&(_ZTV8G25x12y7[9]),  9,10},
  {&(_tg__ZTV6E25x12__8G25x12y7[3]),  3,4},
  {&(_tg__ZTV3C256E25x12__8G25x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x12y7[];
extern  VTBL_ENTRY _ZTV8G25x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x12y7[];
Class_Descriptor cd_G25x12y7 = {  "G25x12y7", // class name
  bases_G25x12y7, 6,
  &(vtc_G25x12y7[0]), // expected_vtbl_contents
  &(vtt_G25x12y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G25x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x12y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x12y7),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  E26x12  : C26 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E26x123fooEv
  ~E26x12(); // tgen
  E26x12(); // tgen
};
//SIG(-1 E26x12) C1{ BC2{ VBC3{ Fi} VBC4{ Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E26x12 ::foo(){vfunc_called(this, "_ZN6E26x123fooEv");}
E26x12 ::~E26x12(){ note_dtor("E26x12", this);} // tgen
E26x12 ::E26x12(){ note_ctor("E26x12", this);} // tgen

static void Test_E26x12()
{
  extern Class_Descriptor cd_E26x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E26x12, buf);
    E26x12 *dp, &lv = *(dp=new (buf) E26x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E26x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E26x12)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(20,16), "E26x12");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(24,20), "E26x12");
    check_base_class_offset(lv, (C26*), 0, "E26x12");
    check_base_class_offset(lv, (D0*), ABISELECT(12,8), "E26x12");
    check_field_offset(lv, fd, ABISELECT(16,12), "E26x12.fd");
    test_class_info(&lv, &cd_E26x12);
    dp->~E26x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE26x12(Test_E26x12, "E26x12", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6E26x12C1Ev();
extern void _ZN6E26x12D1Ev();
Name_Map name_map_E26x12[] = {
  NSPAIR(_ZN6E26x12C1Ev),
  NSPAIR(_ZN6E26x12D1Ev),
  {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_E26x12[] = {
  // 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 _ZTI6E26x12[];
extern void _ZN6E26x123fooEv();
static  VTBL_ENTRY vtc_E26x12[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x12[0]),
  (VTBL_ENTRY)&_ZN6E26x123fooEv,
};
extern VTBL_ENTRY _ZTV6E26x12[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__6E26x12[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_E26x12[] = {
  {&(_ZTV6E26x12[4]),  4,5},
  {&(_tg__ZTV3C26__6E26x12[4]),  4,5},
};
extern VTBL_ENTRY _ZTI6E26x12[];
extern  VTBL_ENTRY _ZTV6E26x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x12[];
Class_Descriptor cd_E26x12 = {  "E26x12", // class name
  bases_E26x12, 4,
  &(vtc_E26x12[0]), // expected_vtbl_contents
  &(vtt_E26x12[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6E26x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E26x12),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E26x12),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  G26x12y0  : E26x12 , F1 {
  int ff;
  ~G26x12y0(); // tgen
  G26x12y0(); // tgen
};
//SIG(1 G26x12y0) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G26x12y0 ::~G26x12y0(){ note_dtor("G26x12y0", this);} // tgen
G26x12y0 ::G26x12y0(){ note_ctor("G26x12y0", this);} // tgen

static void Test_G26x12y0()
{
  extern Class_Descriptor cd_G26x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x12y0, buf);
    G26x12y0 *dp, &lv = *(dp=new (buf) G26x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x12y0)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x12*), ABISELECT(40,28), "G26x12y0");
    check_base_class_offset(lv, (B0*)(C26*)(E26x12*), ABISELECT(44,32), "G26x12y0");
    check_base_class_offset(lv, (C26*)(E26x12*), 0, "G26x12y0");
    check_base_class_offset(lv, (D0*)(E26x12*), ABISELECT(12,8), "G26x12y0");
    check_base_class_offset(lv, (E26x12*), 0, "G26x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G26x12y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G26x12y0.ff");
    test_class_info(&lv, &cd_G26x12y0);
    dp->~G26x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x12y0(Test_G26x12y0, "G26x12y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G26x12y0C1Ev();
extern void _ZN8G26x12y0D1Ev();
Name_Map name_map_G26x12y0[] = {
  NSPAIR(_ZN8G26x12y0C1Ev),
  NSPAIR(_ZN8G26x12y0D1Ev),
  {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_E26x12;
extern VTBL_ENTRY _ZTI6E26x12[];
extern  VTBL_ENTRY _ZTV6E26x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x12y0[] = {
  // 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_E26x12,    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 _ZTI8G26x12y0[];
extern void _ZN6E26x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x12y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x12y0[0]),
  (VTBL_ENTRY)&_ZN6E26x123fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G26x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G26x12y0[];
extern void _ZN6E26x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x12__8G26x12y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x12[0]),
  (VTBL_ENTRY)&_ZN6E26x123fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C266E26x12__8G26x12y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x12y0[] = {
  {&(_ZTV8G26x12y0[4]),  4,8},
  {&(_tg__ZTV6E26x12__8G26x12y0[4]),  4,5},
  {&(_tg__ZTV3C266E26x12__8G26x12y0[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x12y0[];
extern  VTBL_ENTRY _ZTV8G26x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x12y0[];
Class_Descriptor cd_G26x12y0 = {  "G26x12y0", // class name
  bases_G26x12y0, 6,
  &(vtc_G26x12y0[0]), // expected_vtbl_contents
  &(vtt_G26x12y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G26x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x12y0),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x12y0),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  G26x12y1  : virtual E26x12 , F1 {
  int ff;
  ~G26x12y1(); // tgen
  G26x12y1(); // tgen
};
//SIG(1 G26x12y1) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G26x12y1 ::~G26x12y1(){ note_dtor("G26x12y1", this);} // tgen
G26x12y1 ::G26x12y1(){ note_ctor("G26x12y1", this);} // tgen

static void Test_G26x12y1()
{
  extern Class_Descriptor cd_G26x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x12y1, buf);
    G26x12y1 *dp, &lv = *(dp=new (buf) G26x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x12y1)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x12*), ABISELECT(36,28), "G26x12y1");
    check_base_class_offset(lv, (B0*)(C26*)(E26x12*), ABISELECT(40,32), "G26x12y1");
    check_base_class_offset(lv, (C26*)(E26x12*), ABISELECT(16,12), "G26x12y1");
    check_base_class_offset(lv, (D0*)(E26x12*), ABISELECT(28,20), "G26x12y1");
    check_base_class_offset(lv, (E26x12*), ABISELECT(16,12), "G26x12y1");
    check_base_class_offset(lv, (F1*), 0, "G26x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x12y1.ff");
    test_class_info(&lv, &cd_G26x12y1);
    dp->~G26x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x12y1(Test_G26x12y1, "G26x12y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G26x12y1C1Ev();
extern void _ZN8G26x12y1D1Ev();
Name_Map name_map_G26x12y1[] = {
  NSPAIR(_ZN8G26x12y1C1Ev),
  NSPAIR(_ZN8G26x12y1D1Ev),
  {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_E26x12;
extern VTBL_ENTRY _ZTI6E26x12[];
extern  VTBL_ENTRY _ZTV6E26x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x12y1[] = {
  // 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_E26x12,    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 _ZTI8G26x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E26x123fooEv();
static  VTBL_ENTRY vtc_G26x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G26x12y1[0]),
  (VTBL_ENTRY)&_ZN6E26x123fooEv,
};
extern VTBL_ENTRY _ZTV8G26x12y1[];
extern void _ZN6E26x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x12__8G26x12y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x12[0]),
  (VTBL_ENTRY)&_ZN6E26x123fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C266E26x12__8G26x12y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x12y1[] = {
  {&(_ZTV8G26x12y1[5]),  5,12},
  {&(_ZTV8G26x12y1[11]),  11,12},
  {&(_tg__ZTV6E26x12__8G26x12y1[4]),  4,5},
  {&(_tg__ZTV3C266E26x12__8G26x12y1[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x12y1[];
extern  VTBL_ENTRY _ZTV8G26x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x12y1[];
Class_Descriptor cd_G26x12y1 = {  "G26x12y1", // class name
  bases_G26x12y1, 6,
  &(vtc_G26x12y1[0]), // expected_vtbl_contents
  &(vtt_G26x12y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G26x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x12y1),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x12y1),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  G26x12y2  : E26x12 , virtual F1 {
  int ff;
  ~G26x12y2(); // tgen
  G26x12y2(); // tgen
};
//SIG(1 G26x12y2) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G26x12y2 ::~G26x12y2(){ note_dtor("G26x12y2", this);} // tgen
G26x12y2 ::G26x12y2(){ note_ctor("G26x12y2", this);} // tgen

static void Test_G26x12y2()
{
  extern Class_Descriptor cd_G26x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x12y2, buf);
    G26x12y2 *dp, &lv = *(dp=new (buf) G26x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x12y2)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x12*), ABISELECT(24,20), "G26x12y2");
    check_base_class_offset(lv, (B0*)(C26*)(E26x12*), ABISELECT(28,24), "G26x12y2");
    check_base_class_offset(lv, (C26*)(E26x12*), 0, "G26x12y2");
    check_base_class_offset(lv, (D0*)(E26x12*), ABISELECT(12,8), "G26x12y2");
    check_base_class_offset(lv, (E26x12*), 0, "G26x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G26x12y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G26x12y2.ff");
    test_class_info(&lv, &cd_G26x12y2);
    dp->~G26x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x12y2(Test_G26x12y2, "G26x12y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G26x12y2C1Ev();
extern void _ZN8G26x12y2D1Ev();
Name_Map name_map_G26x12y2[] = {
  NSPAIR(_ZN8G26x12y2C1Ev),
  NSPAIR(_ZN8G26x12y2D1Ev),
  {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_E26x12;
extern VTBL_ENTRY _ZTI6E26x12[];
extern  VTBL_ENTRY _ZTV6E26x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x12y2[] = {
  // 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_E26x12,    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 _ZTI8G26x12y2[];
extern void _ZN6E26x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x12y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x12y2[0]),
  (VTBL_ENTRY)&_ZN6E26x123fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G26x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G26x12y2[];
extern void _ZN6E26x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x12__8G26x12y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x12[0]),
  (VTBL_ENTRY)&_ZN6E26x123fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C266E26x12__8G26x12y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x12y2[] = {
  {&(_ZTV8G26x12y2[5]),  5,10},
  {&(_tg__ZTV6E26x12__8G26x12y2[4]),  4,5},
  {&(_tg__ZTV3C266E26x12__8G26x12y2[4]),  4,5},
  {&(_ZTV8G26x12y2[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G26x12y2[];
extern  VTBL_ENTRY _ZTV8G26x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x12y2[];
Class_Descriptor cd_G26x12y2 = {  "G26x12y2", // class name
  bases_G26x12y2, 6,
  &(vtc_G26x12y2[0]), // expected_vtbl_contents
  &(vtt_G26x12y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G26x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x12y2),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x12y2),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  G26x12y3  : virtual E26x12 , virtual F1 {
  int ff;
  ~G26x12y3(); // tgen
  G26x12y3(); // tgen
};
//SIG(1 G26x12y3) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G26x12y3 ::~G26x12y3(){ note_dtor("G26x12y3", this);} // tgen
G26x12y3 ::G26x12y3(){ note_ctor("G26x12y3", this);} // tgen

static void Test_G26x12y3()
{
  extern Class_Descriptor cd_G26x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G26x12y3, buf);
    G26x12y3 *dp, &lv = *(dp=new (buf) G26x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G26x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x12y3)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x12*), ABISELECT(36,24), "G26x12y3");
    check_base_class_offset(lv, (B0*)(C26*)(E26x12*), ABISELECT(40,28), "G26x12y3");
    check_base_class_offset(lv, (C26*)(E26x12*), ABISELECT(16,8), "G26x12y3");
    check_base_class_offset(lv, (D0*)(E26x12*), ABISELECT(28,16), "G26x12y3");
    check_base_class_offset(lv, (E26x12*), ABISELECT(16,8), "G26x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G26x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G26x12y3.ff");
    test_class_info(&lv, &cd_G26x12y3);
    dp->~G26x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x12y3(Test_G26x12y3, "G26x12y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G26x12y3C1Ev();
extern void _ZN8G26x12y3D1Ev();
Name_Map name_map_G26x12y3[] = {
  NSPAIR(_ZN8G26x12y3C1Ev),
  NSPAIR(_ZN8G26x12y3D1Ev),
  {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_E26x12;
extern VTBL_ENTRY _ZTI6E26x12[];
extern  VTBL_ENTRY _ZTV6E26x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x12y3[] = {
  // 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_E26x12,    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 _ZTI8G26x12y3[];
extern void _ZN6E26x123fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x12y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G26x12y3[0]),
  (VTBL_ENTRY)&_ZN6E26x123fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G26x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G26x12y3[];
extern void _ZN6E26x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x12__8G26x12y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x12[0]),
  (VTBL_ENTRY)&_ZN6E26x123fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C266E26x12__8G26x12y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x12y3[] = {
  {&(_ZTV8G26x12y3[6]),  6,16},
  {&(_ZTV8G26x12y3[11]),  11,16},
  {&(_ZTV8G26x12y3[15]),  15,16},
  {&(_tg__ZTV6E26x12__8G26x12y3[4]),  4,5},
  {&(_tg__ZTV3C266E26x12__8G26x12y3[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x12y3[];
extern  VTBL_ENTRY _ZTV8G26x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x12y3[];
Class_Descriptor cd_G26x12y3 = {  "G26x12y3", // class name
  bases_G26x12y3, 6,
  &(vtc_G26x12y3[0]), // expected_vtbl_contents
  &(vtt_G26x12y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G26x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x12y3),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x12y3),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  G26x12y4  : E26x12 , F0 {
  int ff;
  ~G26x12y4(); // tgen
  G26x12y4(); // tgen
};
//SIG(1 G26x12y4) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G26x12y4 ::~G26x12y4(){ note_dtor("G26x12y4", this);} // tgen
G26x12y4 ::G26x12y4(){ note_ctor("G26x12y4", this);} // tgen

static void Test_G26x12y4()
{
  extern Class_Descriptor cd_G26x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G26x12y4, buf);
    G26x12y4 *dp, &lv = *(dp=new (buf) G26x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G26x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x12y4)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x12*), ABISELECT(28,24), "G26x12y4");
    check_base_class_offset(lv, (B0*)(C26*)(E26x12*), ABISELECT(32,28), "G26x12y4");
    check_base_class_offset(lv, (C26*)(E26x12*), 0, "G26x12y4");
    check_base_class_offset(lv, (D0*)(E26x12*), ABISELECT(12,8), "G26x12y4");
    check_base_class_offset(lv, (E26x12*), 0, "G26x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G26x12y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G26x12y4.ff");
    test_class_info(&lv, &cd_G26x12y4);
    dp->~G26x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x12y4(Test_G26x12y4, "G26x12y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G26x12y4C1Ev();
extern void _ZN8G26x12y4D1Ev();
Name_Map name_map_G26x12y4[] = {
  NSPAIR(_ZN8G26x12y4C1Ev),
  NSPAIR(_ZN8G26x12y4D1Ev),
  {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_E26x12;
extern VTBL_ENTRY _ZTI6E26x12[];
extern  VTBL_ENTRY _ZTV6E26x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x12y4[] = {
  // 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_E26x12,    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 _ZTI8G26x12y4[];
extern void _ZN6E26x123fooEv();
static  VTBL_ENTRY vtc_G26x12y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x12y4[0]),
  (VTBL_ENTRY)&_ZN6E26x123fooEv,
};
extern VTBL_ENTRY _ZTV8G26x12y4[];
extern void _ZN6E26x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x12__8G26x12y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x12[0]),
  (VTBL_ENTRY)&_ZN6E26x123fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C266E26x12__8G26x12y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x12y4[] = {
  {&(_ZTV8G26x12y4[4]),  4,5},
  {&(_tg__ZTV6E26x12__8G26x12y4[4]),  4,5},
  {&(_tg__ZTV3C266E26x12__8G26x12y4[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x12y4[];
extern  VTBL_ENTRY _ZTV8G26x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x12y4[];
Class_Descriptor cd_G26x12y4 = {  "G26x12y4", // class name
  bases_G26x12y4, 6,
  &(vtc_G26x12y4[0]), // expected_vtbl_contents
  &(vtt_G26x12y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G26x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x12y4),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x12y4),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  G26x12y5  : virtual E26x12 , F0 {
  int ff;
  ~G26x12y5(); // tgen
  G26x12y5(); // tgen
};
//SIG(1 G26x12y5) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G26x12y5 ::~G26x12y5(){ note_dtor("G26x12y5", this);} // tgen
G26x12y5 ::G26x12y5(){ note_ctor("G26x12y5", this);} // tgen

static void Test_G26x12y5()
{
  extern Class_Descriptor cd_G26x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x12y5, buf);
    G26x12y5 *dp, &lv = *(dp=new (buf) G26x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x12y5)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x12*), ABISELECT(36,28), "G26x12y5");
    check_base_class_offset(lv, (B0*)(C26*)(E26x12*), ABISELECT(40,32), "G26x12y5");
    check_base_class_offset(lv, (C26*)(E26x12*), ABISELECT(16,12), "G26x12y5");
    check_base_class_offset(lv, (D0*)(E26x12*), ABISELECT(28,20), "G26x12y5");
    check_base_class_offset(lv, (E26x12*), ABISELECT(16,12), "G26x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G26x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x12y5.ff");
    test_class_info(&lv, &cd_G26x12y5);
    dp->~G26x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x12y5(Test_G26x12y5, "G26x12y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G26x12y5C1Ev();
extern void _ZN8G26x12y5D1Ev();
Name_Map name_map_G26x12y5[] = {
  NSPAIR(_ZN8G26x12y5C1Ev),
  NSPAIR(_ZN8G26x12y5D1Ev),
  {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_E26x12;
extern VTBL_ENTRY _ZTI6E26x12[];
extern  VTBL_ENTRY _ZTV6E26x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x12y5[] = {
  // 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_E26x12,    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 _ZTI8G26x12y5[];
extern void _ZN6E26x123fooEv();
static  VTBL_ENTRY vtc_G26x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G26x12y5[0]),
  (VTBL_ENTRY)&_ZN6E26x123fooEv,
};
extern VTBL_ENTRY _ZTV8G26x12y5[];
extern void _ZN6E26x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x12__8G26x12y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x12[0]),
  (VTBL_ENTRY)&_ZN6E26x123fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C266E26x12__8G26x12y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x12y5[] = {
  {&(_ZTV8G26x12y5[5]),  5,11},
  {&(_ZTV8G26x12y5[10]),  10,11},
  {&(_tg__ZTV6E26x12__8G26x12y5[4]),  4,5},
  {&(_tg__ZTV3C266E26x12__8G26x12y5[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x12y5[];
extern  VTBL_ENTRY _ZTV8G26x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x12y5[];
Class_Descriptor cd_G26x12y5 = {  "G26x12y5", // class name
  bases_G26x12y5, 6,
  &(vtc_G26x12y5[0]), // expected_vtbl_contents
  &(vtt_G26x12y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G26x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x12y5),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x12y5),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  G26x12y6  : E26x12 , virtual F0 {
  int ff;
  ~G26x12y6(); // tgen
  G26x12y6(); // tgen
};
//SIG(1 G26x12y6) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G26x12y6 ::~G26x12y6(){ note_dtor("G26x12y6", this);} // tgen
G26x12y6 ::G26x12y6(){ note_ctor("G26x12y6", this);} // tgen

static void Test_G26x12y6()
{
  extern Class_Descriptor cd_G26x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G26x12y6, buf);
    G26x12y6 *dp, &lv = *(dp=new (buf) G26x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G26x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x12y6)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x12*), ABISELECT(24,20), "G26x12y6");
    check_base_class_offset(lv, (B0*)(C26*)(E26x12*), ABISELECT(28,24), "G26x12y6");
    check_base_class_offset(lv, (C26*)(E26x12*), 0, "G26x12y6");
    check_base_class_offset(lv, (D0*)(E26x12*), ABISELECT(12,8), "G26x12y6");
    check_base_class_offset(lv, (E26x12*), 0, "G26x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G26x12y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G26x12y6.ff");
    test_class_info(&lv, &cd_G26x12y6);
    dp->~G26x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x12y6(Test_G26x12y6, "G26x12y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G26x12y6C1Ev();
extern void _ZN8G26x12y6D1Ev();
Name_Map name_map_G26x12y6[] = {
  NSPAIR(_ZN8G26x12y6C1Ev),
  NSPAIR(_ZN8G26x12y6D1Ev),
  {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_E26x12;
extern VTBL_ENTRY _ZTI6E26x12[];
extern  VTBL_ENTRY _ZTV6E26x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x12y6[] = {
  // 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_E26x12,    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 _ZTI8G26x12y6[];
extern void _ZN6E26x123fooEv();
static  VTBL_ENTRY vtc_G26x12y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x12y6[0]),
  (VTBL_ENTRY)&_ZN6E26x123fooEv,
};
extern VTBL_ENTRY _ZTV8G26x12y6[];
extern void _ZN6E26x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x12__8G26x12y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x12[0]),
  (VTBL_ENTRY)&_ZN6E26x123fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C266E26x12__8G26x12y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x12y6[] = {
  {&(_ZTV8G26x12y6[5]),  5,6},
  {&(_tg__ZTV6E26x12__8G26x12y6[4]),  4,5},
  {&(_tg__ZTV3C266E26x12__8G26x12y6[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x12y6[];
extern  VTBL_ENTRY _ZTV8G26x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x12y6[];
Class_Descriptor cd_G26x12y6 = {  "G26x12y6", // class name
  bases_G26x12y6, 6,
  &(vtc_G26x12y6[0]), // expected_vtbl_contents
  &(vtt_G26x12y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G26x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x12y6),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x12y6),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  G26x12y7  : virtual E26x12 , virtual F0 {
  int ff;
  ~G26x12y7(); // tgen
  G26x12y7(); // tgen
};
//SIG(1 G26x12y7) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G26x12y7 ::~G26x12y7(){ note_dtor("G26x12y7", this);} // tgen
G26x12y7 ::G26x12y7(){ note_ctor("G26x12y7", this);} // tgen

static void Test_G26x12y7()
{
  extern Class_Descriptor cd_G26x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x12y7, buf);
    G26x12y7 *dp, &lv = *(dp=new (buf) G26x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x12y7)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x12*), ABISELECT(36,24), "G26x12y7");
    check_base_class_offset(lv, (B0*)(C26*)(E26x12*), ABISELECT(40,28), "G26x12y7");
    check_base_class_offset(lv, (C26*)(E26x12*), ABISELECT(16,8), "G26x12y7");
    check_base_class_offset(lv, (D0*)(E26x12*), ABISELECT(28,16), "G26x12y7");
    check_base_class_offset(lv, (E26x12*), ABISELECT(16,8), "G26x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G26x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G26x12y7.ff");
    test_class_info(&lv, &cd_G26x12y7);
    dp->~G26x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x12y7(Test_G26x12y7, "G26x12y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G26x12y7C1Ev();
extern void _ZN8G26x12y7D1Ev();
Name_Map name_map_G26x12y7[] = {
  NSPAIR(_ZN8G26x12y7C1Ev),
  NSPAIR(_ZN8G26x12y7D1Ev),
  {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_E26x12;
extern VTBL_ENTRY _ZTI6E26x12[];
extern  VTBL_ENTRY _ZTV6E26x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x12y7[] = {
  // 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_E26x12,    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 _ZTI8G26x12y7[];
extern void _ZN6E26x123fooEv();
static  VTBL_ENTRY vtc_G26x12y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G26x12y7[0]),
  (VTBL_ENTRY)&_ZN6E26x123fooEv,
};
extern VTBL_ENTRY _ZTV8G26x12y7[];
extern void _ZN6E26x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x12__8G26x12y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x12[0]),
  (VTBL_ENTRY)&_ZN6E26x123fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C266E26x12__8G26x12y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x12y7[] = {
  {&(_ZTV8G26x12y7[6]),  6,12},
  {&(_ZTV8G26x12y7[11]),  11,12},
  {&(_tg__ZTV6E26x12__8G26x12y7[4]),  4,5},
  {&(_tg__ZTV3C266E26x12__8G26x12y7[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x12y7[];
extern  VTBL_ENTRY _ZTV8G26x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x12y7[];
Class_Descriptor cd_G26x12y7 = {  "G26x12y7", // class name
  bases_G26x12y7, 6,
  &(vtc_G26x12y7[0]), // expected_vtbl_contents
  &(vtt_G26x12y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G26x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x12y7),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x12y7),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  E27x12  : C27 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E27x123fooEv
  ~E27x12(); // tgen
  E27x12(); // tgen
};
//SIG(-1 E27x12) C1{ BC2{ VBC3{ v1 Fi} VBC4{ Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E27x12 ::foo(){vfunc_called(this, "_ZN6E27x123fooEv");}
E27x12 ::~E27x12(){ note_dtor("E27x12", this);} // tgen
E27x12 ::E27x12(){ note_ctor("E27x12", this);} // tgen

static void Test_E27x12()
{
  extern Class_Descriptor cd_E27x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E27x12, buf);
    E27x12 *dp, &lv = *(dp=new (buf) E27x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E27x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E27x12)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(24,16), "E27x12");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(36,24), "E27x12");
    check_base_class_offset(lv, (C27*), 0, "E27x12");
    check_base_class_offset(lv, (D0*), ABISELECT(12,8), "E27x12");
    check_field_offset(lv, fd, ABISELECT(16,12), "E27x12.fd");
    test_class_info(&lv, &cd_E27x12);
    dp->~E27x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE27x12(Test_E27x12, "E27x12", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E27x12C1Ev();
extern void _ZN6E27x12D1Ev();
Name_Map name_map_E27x12[] = {
  NSPAIR(_ZN6E27x12C1Ev),
  NSPAIR(_ZN6E27x12D1Ev),
  {0,0}
};
extern Class_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_E27x12[] = {
  // 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 _ZTI6E27x12[];
extern void _ZN6E27x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv)();
extern void ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn16_N6E27x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E27x12[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x12[0]),
  (VTBL_ENTRY)&_ZN6E27x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E27x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv),
};
extern VTBL_ENTRY _ZTV6E27x12[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__6E27x12[] = {
  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__6E27x12[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_E27x12[] = {
  {&(_ZTV6E27x12[4]),  4,9},
  {&(_tg__ZTV3C27__6E27x12[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__6E27x12[3]),  3,4},
  {&(_ZTV6E27x12[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6E27x12[];
extern  VTBL_ENTRY _ZTV6E27x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x12[];
static VTBL_ENTRY alt_thunk_names89[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn16_N6E27x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E27x12 = {  "E27x12", // class name
  bases_E27x12, 4,
  &(vtc_E27x12[0]), // expected_vtbl_contents
  &(vtt_E27x12[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E27x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E27x12),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E27x12),4, //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  G27x12y0  : E27x12 , F1 {
  int ff;
  ~G27x12y0(); // tgen
  G27x12y0(); // tgen
};
//SIG(1 G27x12y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G27x12y0 ::~G27x12y0(){ note_dtor("G27x12y0", this);} // tgen
G27x12y0 ::G27x12y0(){ note_ctor("G27x12y0", this);} // tgen

static void Test_G27x12y0()
{
  extern Class_Descriptor cd_G27x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x12y0, buf);
    G27x12y0 *dp, &lv = *(dp=new (buf) G27x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x12y0)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x12*), ABISELECT(40,28), "G27x12y0");
    check_base_class_offset(lv, (B0*)(C27*)(E27x12*), ABISELECT(52,36), "G27x12y0");
    check_base_class_offset(lv, (C27*)(E27x12*), 0, "G27x12y0");
    check_base_class_offset(lv, (D0*)(E27x12*), ABISELECT(12,8), "G27x12y0");
    check_base_class_offset(lv, (E27x12*), 0, "G27x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G27x12y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G27x12y0.ff");
    test_class_info(&lv, &cd_G27x12y0);
    dp->~G27x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x12y0(Test_G27x12y0, "G27x12y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G27x12y0C1Ev();
extern void _ZN8G27x12y0D1Ev();
Name_Map name_map_G27x12y0[] = {
  NSPAIR(_ZN8G27x12y0C1Ev),
  NSPAIR(_ZN8G27x12y0D1Ev),
  {0,0}
};
extern Class_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_E27x12;
extern VTBL_ENTRY _ZTI6E27x12[];
extern  VTBL_ENTRY _ZTV6E27x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x12y0[] = {
  // 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_E27x12,    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 _ZTI8G27x12y0[];
extern void _ZN6E27x123fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv)();
extern void ABISELECT(_ZThn40_N6E27x123fooEv,_ZThn28_N6E27x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x12y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x12y0[0]),
  (VTBL_ENTRY)&_ZN6E27x123fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G27x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G27x12y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv),
};
extern VTBL_ENTRY _ZTV8G27x12y0[];
extern void _ZN6E27x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x12__8G27x12y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x12[0]),
  (VTBL_ENTRY)&_ZN6E27x123fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C276E27x12__8G27x12y0[] = {
  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__3C276E27x12__8G27x12y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv)();
extern void ABISELECT(_ZThn40_N6E27x123fooEv,_ZThn28_N6E27x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x12__8G27x12y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E27x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv),
};
static  VTT_ENTRY vtt_G27x12y0[] = {
  {&(_ZTV8G27x12y0[4]),  4,12},
  {&(_tg__ZTV6E27x12__8G27x12y0[4]),  4,5},
  {&(_tg__ZTV3C276E27x12__8G27x12y0[4]),  4,5},
  {&(_tg__ZTV2A1__3C276E27x12__8G27x12y0[3]),  3,4},
  {&(_tg__ZTV2A1__6E27x12__8G27x12y0[3]),  3,4},
  {&(_ZTV8G27x12y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI8G27x12y0[];
extern  VTBL_ENTRY _ZTV8G27x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x12y0[];
static VTBL_ENTRY alt_thunk_names90[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C273fooEv,_ZThn28_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E27x123fooEv,_ZThn28_N6E27x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E27x123fooEv,_ZThn28_N6E27x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x12y0 = {  "G27x12y0", // class name
  bases_G27x12y0, 6,
  &(vtc_G27x12y0[0]), // expected_vtbl_contents
  &(vtt_G27x12y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G27x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x12y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x12y0),6, //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  G27x12y1  : virtual E27x12 , F1 {
  int ff;
  ~G27x12y1(); // tgen
  G27x12y1(); // tgen
};
//SIG(1 G27x12y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G27x12y1 ::~G27x12y1(){ note_dtor("G27x12y1", this);} // tgen
G27x12y1 ::G27x12y1(){ note_ctor("G27x12y1", this);} // tgen

static void Test_G27x12y1()
{
  extern Class_Descriptor cd_G27x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x12y1, buf);
    G27x12y1 *dp, &lv = *(dp=new (buf) G27x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x12y1)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x12*), ABISELECT(40,28), "G27x12y1");
    check_base_class_offset(lv, (B0*)(C27*)(E27x12*), ABISELECT(52,36), "G27x12y1");
    check_base_class_offset(lv, (C27*)(E27x12*), ABISELECT(16,12), "G27x12y1");
    check_base_class_offset(lv, (D0*)(E27x12*), ABISELECT(28,20), "G27x12y1");
    check_base_class_offset(lv, (E27x12*), ABISELECT(16,12), "G27x12y1");
    check_base_class_offset(lv, (F1*), 0, "G27x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x12y1.ff");
    test_class_info(&lv, &cd_G27x12y1);
    dp->~G27x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x12y1(Test_G27x12y1, "G27x12y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G27x12y1C1Ev();
extern void _ZN8G27x12y1D1Ev();
Name_Map name_map_G27x12y1[] = {
  NSPAIR(_ZN8G27x12y1C1Ev),
  NSPAIR(_ZN8G27x12y1D1Ev),
  {0,0}
};
extern Class_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_E27x12;
extern VTBL_ENTRY _ZTI6E27x12[];
extern  VTBL_ENTRY _ZTV6E27x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x12y1[] = {
  // 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_E27x12,    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 _ZTI8G27x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E27x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv)();
extern void ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn16_N6E27x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x12y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G27x12y1[0]),
  (VTBL_ENTRY)&_ZN6E27x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G27x12y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv),
};
extern VTBL_ENTRY _ZTV8G27x12y1[];
extern void _ZN6E27x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x12__8G27x12y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x12[0]),
  (VTBL_ENTRY)&_ZN6E27x123fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C276E27x12__8G27x12y1[] = {
  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__3C276E27x12__8G27x12y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv)();
extern void ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn16_N6E27x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x12__8G27x12y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E27x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv),
};
static  VTT_ENTRY vtt_G27x12y1[] = {
  {&(_ZTV8G27x12y1[5]),  5,16},
  {&(_ZTV8G27x12y1[11]),  11,16},
  {&(_ZTV8G27x12y1[15]),  15,16},
  {&(_tg__ZTV6E27x12__8G27x12y1[4]),  4,5},
  {&(_tg__ZTV3C276E27x12__8G27x12y1[4]),  4,5},
  {&(_tg__ZTV2A1__3C276E27x12__8G27x12y1[3]),  3,4},
  {&(_tg__ZTV2A1__6E27x12__8G27x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x12y1[];
extern  VTBL_ENTRY _ZTV8G27x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x12y1[];
static VTBL_ENTRY alt_thunk_names91[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn16_N6E27x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn16_N6E27x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x12y1 = {  "G27x12y1", // class name
  bases_G27x12y1, 6,
  &(vtc_G27x12y1[0]), // expected_vtbl_contents
  &(vtt_G27x12y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G27x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x12y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x12y1),7, //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  G27x12y2  : E27x12 , virtual F1 {
  int ff;
  ~G27x12y2(); // tgen
  G27x12y2(); // tgen
};
//SIG(1 G27x12y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G27x12y2 ::~G27x12y2(){ note_dtor("G27x12y2", this);} // tgen
G27x12y2 ::G27x12y2(){ note_ctor("G27x12y2", this);} // tgen

static void Test_G27x12y2()
{
  extern Class_Descriptor cd_G27x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x12y2, buf);
    G27x12y2 *dp, &lv = *(dp=new (buf) G27x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x12y2)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x12*), ABISELECT(24,20), "G27x12y2");
    check_base_class_offset(lv, (B0*)(C27*)(E27x12*), ABISELECT(36,28), "G27x12y2");
    check_base_class_offset(lv, (C27*)(E27x12*), 0, "G27x12y2");
    check_base_class_offset(lv, (D0*)(E27x12*), ABISELECT(12,8), "G27x12y2");
    check_base_class_offset(lv, (E27x12*), 0, "G27x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G27x12y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G27x12y2.ff");
    test_class_info(&lv, &cd_G27x12y2);
    dp->~G27x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x12y2(Test_G27x12y2, "G27x12y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G27x12y2C1Ev();
extern void _ZN8G27x12y2D1Ev();
Name_Map name_map_G27x12y2[] = {
  NSPAIR(_ZN8G27x12y2C1Ev),
  NSPAIR(_ZN8G27x12y2D1Ev),
  {0,0}
};
extern Class_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_E27x12;
extern VTBL_ENTRY _ZTI6E27x12[];
extern  VTBL_ENTRY _ZTV6E27x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x12y2[] = {
  // 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_E27x12,    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 _ZTI8G27x12y2[];
extern void _ZN6E27x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv)();
extern void ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn20_N6E27x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G27x12y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x12y2[0]),
  (VTBL_ENTRY)&_ZN6E27x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G27x12y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G27x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G27x12y2[];
extern void _ZN6E27x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x12__8G27x12y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x12[0]),
  (VTBL_ENTRY)&_ZN6E27x123fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C276E27x12__8G27x12y2[] = {
  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__3C276E27x12__8G27x12y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv)();
extern void ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn20_N6E27x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x12__8G27x12y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E27x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv),
};
static  VTT_ENTRY vtt_G27x12y2[] = {
  {&(_ZTV8G27x12y2[5]),  5,14},
  {&(_tg__ZTV6E27x12__8G27x12y2[4]),  4,5},
  {&(_tg__ZTV3C276E27x12__8G27x12y2[4]),  4,5},
  {&(_tg__ZTV2A1__3C276E27x12__8G27x12y2[3]),  3,4},
  {&(_tg__ZTV2A1__6E27x12__8G27x12y2[3]),  3,4},
  {&(_ZTV8G27x12y2[9]),  9,14},
  {&(_ZTV8G27x12y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI8G27x12y2[];
extern  VTBL_ENTRY _ZTV8G27x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x12y2[];
static VTBL_ENTRY alt_thunk_names92[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn20_N6E27x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn20_N6E27x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x12y2 = {  "G27x12y2", // class name
  bases_G27x12y2, 6,
  &(vtc_G27x12y2[0]), // expected_vtbl_contents
  &(vtt_G27x12y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G27x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x12y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x12y2),7, //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  G27x12y3  : virtual E27x12 , virtual F1 {
  int ff;
  ~G27x12y3(); // tgen
  G27x12y3(); // tgen
};
//SIG(1 G27x12y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G27x12y3 ::~G27x12y3(){ note_dtor("G27x12y3", this);} // tgen
G27x12y3 ::G27x12y3(){ note_ctor("G27x12y3", this);} // tgen

static void Test_G27x12y3()
{
  extern Class_Descriptor cd_G27x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G27x12y3, buf);
    G27x12y3 *dp, &lv = *(dp=new (buf) G27x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G27x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x12y3)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x12*), ABISELECT(40,24), "G27x12y3");
    check_base_class_offset(lv, (B0*)(C27*)(E27x12*), ABISELECT(52,32), "G27x12y3");
    check_base_class_offset(lv, (C27*)(E27x12*), ABISELECT(16,8), "G27x12y3");
    check_base_class_offset(lv, (D0*)(E27x12*), ABISELECT(28,16), "G27x12y3");
    check_base_class_offset(lv, (E27x12*), ABISELECT(16,8), "G27x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G27x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G27x12y3.ff");
    test_class_info(&lv, &cd_G27x12y3);
    dp->~G27x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x12y3(Test_G27x12y3, "G27x12y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G27x12y3C1Ev();
extern void _ZN8G27x12y3D1Ev();
Name_Map name_map_G27x12y3[] = {
  NSPAIR(_ZN8G27x12y3C1Ev),
  NSPAIR(_ZN8G27x12y3D1Ev),
  {0,0}
};
extern Class_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_E27x12;
extern VTBL_ENTRY _ZTI6E27x12[];
extern  VTBL_ENTRY _ZTV6E27x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x12y3[] = {
  // 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_E27x12,    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 _ZTI8G27x12y3[];
extern void _ZN6E27x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv)();
extern void ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn16_N6E27x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G27x12y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x12y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G27x12y3[0]),
  (VTBL_ENTRY)&_ZN6E27x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G27x12y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G27x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G27x12y3[];
extern void _ZN6E27x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x12__8G27x12y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x12[0]),
  (VTBL_ENTRY)&_ZN6E27x123fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C276E27x12__8G27x12y3[] = {
  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__3C276E27x12__8G27x12y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv)();
extern void ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn16_N6E27x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x12__8G27x12y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E27x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv),
};
static  VTT_ENTRY vtt_G27x12y3[] = {
  {&(_ZTV8G27x12y3[6]),  6,20},
  {&(_ZTV8G27x12y3[11]),  11,20},
  {&(_ZTV8G27x12y3[15]),  15,20},
  {&(_ZTV8G27x12y3[19]),  19,20},
  {&(_tg__ZTV6E27x12__8G27x12y3[4]),  4,5},
  {&(_tg__ZTV3C276E27x12__8G27x12y3[4]),  4,5},
  {&(_tg__ZTV2A1__3C276E27x12__8G27x12y3[3]),  3,4},
  {&(_tg__ZTV2A1__6E27x12__8G27x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x12y3[];
extern  VTBL_ENTRY _ZTV8G27x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x12y3[];
static VTBL_ENTRY alt_thunk_names93[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn16_N6E27x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn16_N6E27x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x12y3 = {  "G27x12y3", // class name
  bases_G27x12y3, 6,
  &(vtc_G27x12y3[0]), // expected_vtbl_contents
  &(vtt_G27x12y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G27x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x12y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x12y3),8, //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  G27x12y4  : E27x12 , F0 {
  int ff;
  ~G27x12y4(); // tgen
  G27x12y4(); // tgen
};
//SIG(1 G27x12y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G27x12y4 ::~G27x12y4(){ note_dtor("G27x12y4", this);} // tgen
G27x12y4 ::G27x12y4(){ note_ctor("G27x12y4", this);} // tgen

static void Test_G27x12y4()
{
  extern Class_Descriptor cd_G27x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G27x12y4, buf);
    G27x12y4 *dp, &lv = *(dp=new (buf) G27x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G27x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x12y4)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x12*), ABISELECT(32,24), "G27x12y4");
    check_base_class_offset(lv, (B0*)(C27*)(E27x12*), ABISELECT(44,32), "G27x12y4");
    check_base_class_offset(lv, (C27*)(E27x12*), 0, "G27x12y4");
    check_base_class_offset(lv, (D0*)(E27x12*), ABISELECT(12,8), "G27x12y4");
    check_base_class_offset(lv, (E27x12*), 0, "G27x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G27x12y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G27x12y4.ff");
    test_class_info(&lv, &cd_G27x12y4);
    dp->~G27x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x12y4(Test_G27x12y4, "G27x12y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G27x12y4C1Ev();
extern void _ZN8G27x12y4D1Ev();
Name_Map name_map_G27x12y4[] = {
  NSPAIR(_ZN8G27x12y4C1Ev),
  NSPAIR(_ZN8G27x12y4D1Ev),
  {0,0}
};
extern Class_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_E27x12;
extern VTBL_ENTRY _ZTI6E27x12[];
extern  VTBL_ENTRY _ZTV6E27x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x12y4[] = {
  // 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_E27x12,    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 _ZTI8G27x12y4[];
extern void _ZN6E27x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv)();
extern void ABISELECT(_ZThn32_N6E27x123fooEv,_ZThn24_N6E27x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x12y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x12y4[0]),
  (VTBL_ENTRY)&_ZN6E27x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G27x12y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv),
};
extern VTBL_ENTRY _ZTV8G27x12y4[];
extern void _ZN6E27x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x12__8G27x12y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x12[0]),
  (VTBL_ENTRY)&_ZN6E27x123fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C276E27x12__8G27x12y4[] = {
  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__3C276E27x12__8G27x12y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv)();
extern void ABISELECT(_ZThn32_N6E27x123fooEv,_ZThn24_N6E27x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x12__8G27x12y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E27x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv),
};
static  VTT_ENTRY vtt_G27x12y4[] = {
  {&(_ZTV8G27x12y4[4]),  4,9},
  {&(_tg__ZTV6E27x12__8G27x12y4[4]),  4,5},
  {&(_tg__ZTV3C276E27x12__8G27x12y4[4]),  4,5},
  {&(_tg__ZTV2A1__3C276E27x12__8G27x12y4[3]),  3,4},
  {&(_tg__ZTV2A1__6E27x12__8G27x12y4[3]),  3,4},
  {&(_ZTV8G27x12y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G27x12y4[];
extern  VTBL_ENTRY _ZTV8G27x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x12y4[];
static VTBL_ENTRY alt_thunk_names94[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C273fooEv,_ZThn24_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x123fooEv,_ZThn24_N6E27x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x123fooEv,_ZThn24_N6E27x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x12y4 = {  "G27x12y4", // class name
  bases_G27x12y4, 6,
  &(vtc_G27x12y4[0]), // expected_vtbl_contents
  &(vtt_G27x12y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G27x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x12y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x12y4),6, //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  G27x12y5  : virtual E27x12 , F0 {
  int ff;
  ~G27x12y5(); // tgen
  G27x12y5(); // tgen
};
//SIG(1 G27x12y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G27x12y5 ::~G27x12y5(){ note_dtor("G27x12y5", this);} // tgen
G27x12y5 ::G27x12y5(){ note_ctor("G27x12y5", this);} // tgen

static void Test_G27x12y5()
{
  extern Class_Descriptor cd_G27x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x12y5, buf);
    G27x12y5 *dp, &lv = *(dp=new (buf) G27x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x12y5)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x12*), ABISELECT(40,28), "G27x12y5");
    check_base_class_offset(lv, (B0*)(C27*)(E27x12*), ABISELECT(52,36), "G27x12y5");
    check_base_class_offset(lv, (C27*)(E27x12*), ABISELECT(16,12), "G27x12y5");
    check_base_class_offset(lv, (D0*)(E27x12*), ABISELECT(28,20), "G27x12y5");
    check_base_class_offset(lv, (E27x12*), ABISELECT(16,12), "G27x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G27x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x12y5.ff");
    test_class_info(&lv, &cd_G27x12y5);
    dp->~G27x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x12y5(Test_G27x12y5, "G27x12y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G27x12y5C1Ev();
extern void _ZN8G27x12y5D1Ev();
Name_Map name_map_G27x12y5[] = {
  NSPAIR(_ZN8G27x12y5C1Ev),
  NSPAIR(_ZN8G27x12y5D1Ev),
  {0,0}
};
extern Class_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_E27x12;
extern VTBL_ENTRY _ZTI6E27x12[];
extern  VTBL_ENTRY _ZTV6E27x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x12y5[] = {
  // 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_E27x12,    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 _ZTI8G27x12y5[];
extern void _ZN6E27x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv)();
extern void ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn16_N6E27x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x12y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x12y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G27x12y5[0]),
  (VTBL_ENTRY)&_ZN6E27x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G27x12y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv),
};
extern VTBL_ENTRY _ZTV8G27x12y5[];
extern void _ZN6E27x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x12__8G27x12y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x12[0]),
  (VTBL_ENTRY)&_ZN6E27x123fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C276E27x12__8G27x12y5[] = {
  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__3C276E27x12__8G27x12y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv)();
extern void ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn16_N6E27x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x12__8G27x12y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E27x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv),
};
static  VTT_ENTRY vtt_G27x12y5[] = {
  {&(_ZTV8G27x12y5[5]),  5,15},
  {&(_ZTV8G27x12y5[10]),  10,15},
  {&(_ZTV8G27x12y5[14]),  14,15},
  {&(_tg__ZTV6E27x12__8G27x12y5[4]),  4,5},
  {&(_tg__ZTV3C276E27x12__8G27x12y5[4]),  4,5},
  {&(_tg__ZTV2A1__3C276E27x12__8G27x12y5[3]),  3,4},
  {&(_tg__ZTV2A1__6E27x12__8G27x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x12y5[];
extern  VTBL_ENTRY _ZTV8G27x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x12y5[];
static VTBL_ENTRY alt_thunk_names95[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn16_N6E27x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn16_N6E27x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x12y5 = {  "G27x12y5", // class name
  bases_G27x12y5, 6,
  &(vtc_G27x12y5[0]), // expected_vtbl_contents
  &(vtt_G27x12y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G27x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x12y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x12y5),7, //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  G27x12y6  : E27x12 , virtual F0 {
  int ff;
  ~G27x12y6(); // tgen
  G27x12y6(); // tgen
};
//SIG(1 G27x12y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G27x12y6 ::~G27x12y6(){ note_dtor("G27x12y6", this);} // tgen
G27x12y6 ::G27x12y6(){ note_ctor("G27x12y6", this);} // tgen

static void Test_G27x12y6()
{
  extern Class_Descriptor cd_G27x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G27x12y6, buf);
    G27x12y6 *dp, &lv = *(dp=new (buf) G27x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G27x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x12y6)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x12*), ABISELECT(24,20), "G27x12y6");
    check_base_class_offset(lv, (B0*)(C27*)(E27x12*), ABISELECT(36,28), "G27x12y6");
    check_base_class_offset(lv, (C27*)(E27x12*), 0, "G27x12y6");
    check_base_class_offset(lv, (D0*)(E27x12*), ABISELECT(12,8), "G27x12y6");
    check_base_class_offset(lv, (E27x12*), 0, "G27x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G27x12y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G27x12y6.ff");
    test_class_info(&lv, &cd_G27x12y6);
    dp->~G27x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x12y6(Test_G27x12y6, "G27x12y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G27x12y6C1Ev();
extern void _ZN8G27x12y6D1Ev();
Name_Map name_map_G27x12y6[] = {
  NSPAIR(_ZN8G27x12y6C1Ev),
  NSPAIR(_ZN8G27x12y6D1Ev),
  {0,0}
};
extern Class_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_E27x12;
extern VTBL_ENTRY _ZTI6E27x12[];
extern  VTBL_ENTRY _ZTV6E27x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x12y6[] = {
  // 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_E27x12,    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 _ZTI8G27x12y6[];
extern void _ZN6E27x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv)();
extern void ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn20_N6E27x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x12y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x12y6[0]),
  (VTBL_ENTRY)&_ZN6E27x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G27x12y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv),
};
extern VTBL_ENTRY _ZTV8G27x12y6[];
extern void _ZN6E27x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x12__8G27x12y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x12[0]),
  (VTBL_ENTRY)&_ZN6E27x123fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C276E27x12__8G27x12y6[] = {
  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__3C276E27x12__8G27x12y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv)();
extern void ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn20_N6E27x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x12__8G27x12y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E27x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv),
};
static  VTT_ENTRY vtt_G27x12y6[] = {
  {&(_ZTV8G27x12y6[5]),  5,10},
  {&(_tg__ZTV6E27x12__8G27x12y6[4]),  4,5},
  {&(_tg__ZTV3C276E27x12__8G27x12y6[4]),  4,5},
  {&(_tg__ZTV2A1__3C276E27x12__8G27x12y6[3]),  3,4},
  {&(_tg__ZTV2A1__6E27x12__8G27x12y6[3]),  3,4},
  {&(_ZTV8G27x12y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G27x12y6[];
extern  VTBL_ENTRY _ZTV8G27x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x12y6[];
static VTBL_ENTRY alt_thunk_names96[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn20_N6E27x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn20_N6E27x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x12y6 = {  "G27x12y6", // class name
  bases_G27x12y6, 6,
  &(vtc_G27x12y6[0]), // expected_vtbl_contents
  &(vtt_G27x12y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G27x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x12y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x12y6),6, //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  G27x12y7  : virtual E27x12 , virtual F0 {
  int ff;
  ~G27x12y7(); // tgen
  G27x12y7(); // tgen
};
//SIG(1 G27x12y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G27x12y7 ::~G27x12y7(){ note_dtor("G27x12y7", this);} // tgen
G27x12y7 ::G27x12y7(){ note_ctor("G27x12y7", this);} // tgen

static void Test_G27x12y7()
{
  extern Class_Descriptor cd_G27x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G27x12y7, buf);
    G27x12y7 *dp, &lv = *(dp=new (buf) G27x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G27x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x12y7)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x12*), ABISELECT(40,24), "G27x12y7");
    check_base_class_offset(lv, (B0*)(C27*)(E27x12*), ABISELECT(52,32), "G27x12y7");
    check_base_class_offset(lv, (C27*)(E27x12*), ABISELECT(16,8), "G27x12y7");
    check_base_class_offset(lv, (D0*)(E27x12*), ABISELECT(28,16), "G27x12y7");
    check_base_class_offset(lv, (E27x12*), ABISELECT(16,8), "G27x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G27x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G27x12y7.ff");
    test_class_info(&lv, &cd_G27x12y7);
    dp->~G27x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x12y7(Test_G27x12y7, "G27x12y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G27x12y7C1Ev();
extern void _ZN8G27x12y7D1Ev();
Name_Map name_map_G27x12y7[] = {
  NSPAIR(_ZN8G27x12y7C1Ev),
  NSPAIR(_ZN8G27x12y7D1Ev),
  {0,0}
};
extern Class_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_E27x12;
extern VTBL_ENTRY _ZTI6E27x12[];
extern  VTBL_ENTRY _ZTV6E27x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x12y7[] = {
  // 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_E27x12,    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 _ZTI8G27x12y7[];
extern void _ZN6E27x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv)();
extern void ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn16_N6E27x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x12y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x12y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G27x12y7[0]),
  (VTBL_ENTRY)&_ZN6E27x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G27x12y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv),
};
extern VTBL_ENTRY _ZTV8G27x12y7[];
extern void _ZN6E27x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x12__8G27x12y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x12[0]),
  (VTBL_ENTRY)&_ZN6E27x123fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C276E27x12__8G27x12y7[] = {
  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__3C276E27x12__8G27x12y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv)();
extern void ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn16_N6E27x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x12__8G27x12y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E27x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv),
};
static  VTT_ENTRY vtt_G27x12y7[] = {
  {&(_ZTV8G27x12y7[6]),  6,16},
  {&(_ZTV8G27x12y7[11]),  11,16},
  {&(_ZTV8G27x12y7[15]),  15,16},
  {&(_tg__ZTV6E27x12__8G27x12y7[4]),  4,5},
  {&(_tg__ZTV3C276E27x12__8G27x12y7[4]),  4,5},
  {&(_tg__ZTV2A1__3C276E27x12__8G27x12y7[3]),  3,4},
  {&(_tg__ZTV2A1__6E27x12__8G27x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x12y7[];
extern  VTBL_ENTRY _ZTV8G27x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x12y7[];
static VTBL_ENTRY alt_thunk_names97[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x123fooEv,_ZTv0_n12_N6E27x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn16_N6E27x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x123fooEv,_ZThn16_N6E27x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x12y7 = {  "G27x12y7", // class name
  bases_G27x12y7, 6,
  &(vtc_G27x12y7[0]), // expected_vtbl_contents
  &(vtt_G27x12y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G27x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x12y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x12y7),7, //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  E28x12  : C28 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E28x123fooEv
  ~E28x12(); // tgen
  E28x12(); // tgen
};
//SIG(-1 E28x12) C1{ BC2{ BC3{ Fi} VBC4{ v1 Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E28x12 ::foo(){vfunc_called(this, "_ZN6E28x123fooEv");}
E28x12 ::~E28x12(){ note_dtor("E28x12", this);} // tgen
E28x12 ::E28x12(){ note_ctor("E28x12", this);} // tgen

static void Test_E28x12()
{
  extern Class_Descriptor cd_E28x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E28x12, buf);
    E28x12 *dp, &lv = *(dp=new (buf) E28x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E28x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E28x12)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(8,4), "E28x12");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(24,20), "E28x12");
    check_base_class_offset(lv, (C28*), 0, "E28x12");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E28x12");
    check_field_offset(lv, fd, ABISELECT(20,16), "E28x12.fd");
    test_class_info(&lv, &cd_E28x12);
    dp->~E28x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE28x12(Test_E28x12, "E28x12", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E28x12C1Ev();
extern void _ZN6E28x12D1Ev();
Name_Map name_map_E28x12[] = {
  NSPAIR(_ZN6E28x12C1Ev),
  NSPAIR(_ZN6E28x12D1Ev),
  {0,0}
};
extern Class_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_E28x12[] = {
  // 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 _ZTI6E28x12[];
extern void _ZN6E28x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv)();
extern void ABISELECT(_ZThn24_N6E28x123fooEv,_ZThn20_N6E28x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E28x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x12[0]),
  (VTBL_ENTRY)&_ZN6E28x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E28x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv),
};
extern VTBL_ENTRY _ZTV6E28x12[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__6E28x12[] = {
  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__6E28x12[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_E28x12[] = {
  {&(_ZTV6E28x12[3]),  3,8},
  {&(_tg__ZTV3C28__6E28x12[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__6E28x12[3]),  3,4},
  {&(_ZTV6E28x12[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6E28x12[];
extern  VTBL_ENTRY _ZTV6E28x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x12[];
static VTBL_ENTRY alt_thunk_names98[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x123fooEv,_ZThn20_N6E28x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E28x12 = {  "E28x12", // class name
  bases_E28x12, 4,
  &(vtc_E28x12[0]), // expected_vtbl_contents
  &(vtt_E28x12[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E28x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E28x12),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E28x12),4, //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  G28x12y0  : E28x12 , F1 {
  int ff;
  ~G28x12y0(); // tgen
  G28x12y0(); // tgen
};
//SIG(1 G28x12y0) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G28x12y0 ::~G28x12y0(){ note_dtor("G28x12y0", this);} // tgen
G28x12y0 ::G28x12y0(){ note_ctor("G28x12y0", this);} // tgen

static void Test_G28x12y0()
{
  extern Class_Descriptor cd_G28x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x12y0, buf);
    G28x12y0 *dp, &lv = *(dp=new (buf) G28x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x12y0)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x12*), ABISELECT(8,4), "G28x12y0");
    check_base_class_offset(lv, (B1*)(C28*)(E28x12*), ABISELECT(40,32), "G28x12y0");
    check_base_class_offset(lv, (C28*)(E28x12*), 0, "G28x12y0");
    check_base_class_offset(lv, (D0*)(E28x12*), ABISELECT(16,12), "G28x12y0");
    check_base_class_offset(lv, (E28x12*), 0, "G28x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G28x12y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G28x12y0.ff");
    test_class_info(&lv, &cd_G28x12y0);
    dp->~G28x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x12y0(Test_G28x12y0, "G28x12y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G28x12y0C1Ev();
extern void _ZN8G28x12y0D1Ev();
Name_Map name_map_G28x12y0[] = {
  NSPAIR(_ZN8G28x12y0C1Ev),
  NSPAIR(_ZN8G28x12y0D1Ev),
  {0,0}
};
extern Class_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_E28x12;
extern VTBL_ENTRY _ZTI6E28x12[];
extern  VTBL_ENTRY _ZTV6E28x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x12y0[] = {
  // 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_E28x12,    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 _ZTI8G28x12y0[];
extern void _ZN6E28x123fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv)();
extern void ABISELECT(_ZThn40_N6E28x123fooEv,_ZThn32_N6E28x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x12y0[0]),
  (VTBL_ENTRY)&_ZN6E28x123fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G28x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G28x12y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv),
};
extern VTBL_ENTRY _ZTV8G28x12y0[];
extern void _ZN6E28x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x12__8G28x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x12[0]),
  (VTBL_ENTRY)&_ZN6E28x123fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C286E28x12__8G28x12y0[] = {
  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__3C286E28x12__8G28x12y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv)();
extern void ABISELECT(_ZThn40_N6E28x123fooEv,_ZThn32_N6E28x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x12__8G28x12y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6E28x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv),
};
static  VTT_ENTRY vtt_G28x12y0[] = {
  {&(_ZTV8G28x12y0[3]),  3,11},
  {&(_tg__ZTV6E28x12__8G28x12y0[3]),  3,4},
  {&(_tg__ZTV3C286E28x12__8G28x12y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C286E28x12__8G28x12y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E28x12__8G28x12y0[3]),  3,4},
  {&(_ZTV8G28x12y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI8G28x12y0[];
extern  VTBL_ENTRY _ZTV8G28x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x12y0[];
static VTBL_ENTRY alt_thunk_names99[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C283fooEv,_ZThn32_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E28x123fooEv,_ZThn32_N6E28x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E28x123fooEv,_ZThn32_N6E28x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x12y0 = {  "G28x12y0", // class name
  bases_G28x12y0, 6,
  &(vtc_G28x12y0[0]), // expected_vtbl_contents
  &(vtt_G28x12y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G28x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x12y0),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x12y0),6, //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  G28x12y1  : virtual E28x12 , F1 {
  int ff;
  ~G28x12y1(); // tgen
  G28x12y1(); // tgen
};
//SIG(1 G28x12y1) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G28x12y1 ::~G28x12y1(){ note_dtor("G28x12y1", this);} // tgen
G28x12y1 ::G28x12y1(){ note_ctor("G28x12y1", this);} // tgen

static void Test_G28x12y1()
{
  extern Class_Descriptor cd_G28x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x12y1, buf);
    G28x12y1 *dp, &lv = *(dp=new (buf) G28x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x12y1)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x12*), ABISELECT(24,16), "G28x12y1");
    check_base_class_offset(lv, (B1*)(C28*)(E28x12*), ABISELECT(40,32), "G28x12y1");
    check_base_class_offset(lv, (C28*)(E28x12*), ABISELECT(16,12), "G28x12y1");
    check_base_class_offset(lv, (D0*)(E28x12*), ABISELECT(32,24), "G28x12y1");
    check_base_class_offset(lv, (E28x12*), ABISELECT(16,12), "G28x12y1");
    check_base_class_offset(lv, (F1*), 0, "G28x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x12y1.ff");
    test_class_info(&lv, &cd_G28x12y1);
    dp->~G28x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x12y1(Test_G28x12y1, "G28x12y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G28x12y1C1Ev();
extern void _ZN8G28x12y1D1Ev();
Name_Map name_map_G28x12y1[] = {
  NSPAIR(_ZN8G28x12y1C1Ev),
  NSPAIR(_ZN8G28x12y1D1Ev),
  {0,0}
};
extern Class_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_E28x12;
extern VTBL_ENTRY _ZTI6E28x12[];
extern  VTBL_ENTRY _ZTV6E28x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x12y1[] = {
  // 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_E28x12,    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 _ZTI8G28x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E28x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv)();
extern void ABISELECT(_ZThn24_N6E28x123fooEv,_ZThn20_N6E28x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G28x12y1[0]),
  (VTBL_ENTRY)&_ZN6E28x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G28x12y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv),
};
extern VTBL_ENTRY _ZTV8G28x12y1[];
extern void _ZN6E28x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x12__8G28x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x12[0]),
  (VTBL_ENTRY)&_ZN6E28x123fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C286E28x12__8G28x12y1[] = {
  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__3C286E28x12__8G28x12y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv)();
extern void ABISELECT(_ZThn24_N6E28x123fooEv,_ZThn20_N6E28x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x12__8G28x12y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E28x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv),
};
static  VTT_ENTRY vtt_G28x12y1[] = {
  {&(_ZTV8G28x12y1[4]),  4,14},
  {&(_ZTV8G28x12y1[9]),  9,14},
  {&(_ZTV8G28x12y1[13]),  13,14},
  {&(_tg__ZTV6E28x12__8G28x12y1[3]),  3,4},
  {&(_tg__ZTV3C286E28x12__8G28x12y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C286E28x12__8G28x12y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E28x12__8G28x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x12y1[];
extern  VTBL_ENTRY _ZTV8G28x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x12y1[];
static VTBL_ENTRY alt_thunk_names100[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x123fooEv,_ZThn20_N6E28x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x123fooEv,_ZThn20_N6E28x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x12y1 = {  "G28x12y1", // class name
  bases_G28x12y1, 6,
  &(vtc_G28x12y1[0]), // expected_vtbl_contents
  &(vtt_G28x12y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G28x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x12y1),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x12y1),7, //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  G28x12y2  : E28x12 , virtual F1 {
  int ff;
  ~G28x12y2(); // tgen
  G28x12y2(); // tgen
};
//SIG(1 G28x12y2) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G28x12y2 ::~G28x12y2(){ note_dtor("G28x12y2", this);} // tgen
G28x12y2 ::G28x12y2(){ note_ctor("G28x12y2", this);} // tgen

static void Test_G28x12y2()
{
  extern Class_Descriptor cd_G28x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G28x12y2, buf);
    G28x12y2 *dp, &lv = *(dp=new (buf) G28x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G28x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x12y2)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x12*), ABISELECT(8,4), "G28x12y2");
    check_base_class_offset(lv, (B1*)(C28*)(E28x12*), ABISELECT(32,24), "G28x12y2");
    check_base_class_offset(lv, (C28*)(E28x12*), 0, "G28x12y2");
    check_base_class_offset(lv, (D0*)(E28x12*), ABISELECT(16,12), "G28x12y2");
    check_base_class_offset(lv, (E28x12*), 0, "G28x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G28x12y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G28x12y2.ff");
    test_class_info(&lv, &cd_G28x12y2);
    dp->~G28x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x12y2(Test_G28x12y2, "G28x12y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G28x12y2C1Ev();
extern void _ZN8G28x12y2D1Ev();
Name_Map name_map_G28x12y2[] = {
  NSPAIR(_ZN8G28x12y2C1Ev),
  NSPAIR(_ZN8G28x12y2D1Ev),
  {0,0}
};
extern Class_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_E28x12;
extern VTBL_ENTRY _ZTI6E28x12[];
extern  VTBL_ENTRY _ZTV6E28x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x12y2[] = {
  // 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_E28x12,    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 _ZTI8G28x12y2[];
extern void _ZN6E28x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv)();
extern void ABISELECT(_ZThn32_N6E28x123fooEv,_ZThn24_N6E28x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G28x12y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x12y2[0]),
  (VTBL_ENTRY)&_ZN6E28x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G28x12y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G28x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G28x12y2[];
extern void _ZN6E28x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x12__8G28x12y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x12[0]),
  (VTBL_ENTRY)&_ZN6E28x123fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C286E28x12__8G28x12y2[] = {
  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__3C286E28x12__8G28x12y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv)();
extern void ABISELECT(_ZThn32_N6E28x123fooEv,_ZThn24_N6E28x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x12__8G28x12y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E28x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv),
};
static  VTT_ENTRY vtt_G28x12y2[] = {
  {&(_ZTV8G28x12y2[4]),  4,13},
  {&(_tg__ZTV6E28x12__8G28x12y2[3]),  3,4},
  {&(_tg__ZTV3C286E28x12__8G28x12y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C286E28x12__8G28x12y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E28x12__8G28x12y2[3]),  3,4},
  {&(_ZTV8G28x12y2[8]),  8,13},
  {&(_ZTV8G28x12y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI8G28x12y2[];
extern  VTBL_ENTRY _ZTV8G28x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x12y2[];
static VTBL_ENTRY alt_thunk_names101[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x123fooEv,_ZThn24_N6E28x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x123fooEv,_ZThn24_N6E28x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x12y2 = {  "G28x12y2", // class name
  bases_G28x12y2, 6,
  &(vtc_G28x12y2[0]), // expected_vtbl_contents
  &(vtt_G28x12y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G28x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x12y2),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x12y2),7, //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  G28x12y3  : virtual E28x12 , virtual F1 {
  int ff;
  ~G28x12y3(); // tgen
  G28x12y3(); // tgen
};
//SIG(1 G28x12y3) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G28x12y3 ::~G28x12y3(){ note_dtor("G28x12y3", this);} // tgen
G28x12y3 ::G28x12y3(){ note_ctor("G28x12y3", this);} // tgen

static void Test_G28x12y3()
{
  extern Class_Descriptor cd_G28x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G28x12y3, buf);
    G28x12y3 *dp, &lv = *(dp=new (buf) G28x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G28x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x12y3)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x12*), ABISELECT(24,12), "G28x12y3");
    check_base_class_offset(lv, (B1*)(C28*)(E28x12*), ABISELECT(40,28), "G28x12y3");
    check_base_class_offset(lv, (C28*)(E28x12*), ABISELECT(16,8), "G28x12y3");
    check_base_class_offset(lv, (D0*)(E28x12*), ABISELECT(32,20), "G28x12y3");
    check_base_class_offset(lv, (E28x12*), ABISELECT(16,8), "G28x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G28x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G28x12y3.ff");
    test_class_info(&lv, &cd_G28x12y3);
    dp->~G28x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x12y3(Test_G28x12y3, "G28x12y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G28x12y3C1Ev();
extern void _ZN8G28x12y3D1Ev();
Name_Map name_map_G28x12y3[] = {
  NSPAIR(_ZN8G28x12y3C1Ev),
  NSPAIR(_ZN8G28x12y3D1Ev),
  {0,0}
};
extern Class_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_E28x12;
extern VTBL_ENTRY _ZTI6E28x12[];
extern  VTBL_ENTRY _ZTV6E28x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x12y3[] = {
  // 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_E28x12,    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 _ZTI8G28x12y3[];
extern void _ZN6E28x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv)();
extern void ABISELECT(_ZThn24_N6E28x123fooEv,_ZThn20_N6E28x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G28x12y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G28x12y3[0]),
  (VTBL_ENTRY)&_ZN6E28x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G28x12y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G28x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G28x12y3[];
extern void _ZN6E28x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x12__8G28x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x12[0]),
  (VTBL_ENTRY)&_ZN6E28x123fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C286E28x12__8G28x12y3[] = {
  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__3C286E28x12__8G28x12y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv)();
extern void ABISELECT(_ZThn24_N6E28x123fooEv,_ZThn20_N6E28x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x12__8G28x12y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E28x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv),
};
static  VTT_ENTRY vtt_G28x12y3[] = {
  {&(_ZTV8G28x12y3[5]),  5,18},
  {&(_ZTV8G28x12y3[9]),  9,18},
  {&(_ZTV8G28x12y3[13]),  13,18},
  {&(_ZTV8G28x12y3[17]),  17,18},
  {&(_tg__ZTV6E28x12__8G28x12y3[3]),  3,4},
  {&(_tg__ZTV3C286E28x12__8G28x12y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C286E28x12__8G28x12y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E28x12__8G28x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x12y3[];
extern  VTBL_ENTRY _ZTV8G28x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x12y3[];
static VTBL_ENTRY alt_thunk_names102[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x123fooEv,_ZThn20_N6E28x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x123fooEv,_ZThn20_N6E28x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x12y3 = {  "G28x12y3", // class name
  bases_G28x12y3, 6,
  &(vtc_G28x12y3[0]), // expected_vtbl_contents
  &(vtt_G28x12y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G28x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x12y3),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x12y3),8, //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  G28x12y4  : E28x12 , F0 {
  int ff;
  ~G28x12y4(); // tgen
  G28x12y4(); // tgen
};
//SIG(1 G28x12y4) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G28x12y4 ::~G28x12y4(){ note_dtor("G28x12y4", this);} // tgen
G28x12y4 ::G28x12y4(){ note_ctor("G28x12y4", this);} // tgen

static void Test_G28x12y4()
{
  extern Class_Descriptor cd_G28x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G28x12y4, buf);
    G28x12y4 *dp, &lv = *(dp=new (buf) G28x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G28x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x12y4)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x12*), ABISELECT(8,4), "G28x12y4");
    check_base_class_offset(lv, (B1*)(C28*)(E28x12*), ABISELECT(32,28), "G28x12y4");
    check_base_class_offset(lv, (C28*)(E28x12*), 0, "G28x12y4");
    check_base_class_offset(lv, (D0*)(E28x12*), ABISELECT(16,12), "G28x12y4");
    check_base_class_offset(lv, (E28x12*), 0, "G28x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G28x12y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G28x12y4.ff");
    test_class_info(&lv, &cd_G28x12y4);
    dp->~G28x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x12y4(Test_G28x12y4, "G28x12y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G28x12y4C1Ev();
extern void _ZN8G28x12y4D1Ev();
Name_Map name_map_G28x12y4[] = {
  NSPAIR(_ZN8G28x12y4C1Ev),
  NSPAIR(_ZN8G28x12y4D1Ev),
  {0,0}
};
extern Class_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_E28x12;
extern VTBL_ENTRY _ZTI6E28x12[];
extern  VTBL_ENTRY _ZTV6E28x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x12y4[] = {
  // 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_E28x12,    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 _ZTI8G28x12y4[];
extern void _ZN6E28x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv)();
extern void ABISELECT(_ZThn32_N6E28x123fooEv,_ZThn28_N6E28x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x12y4[0]),
  (VTBL_ENTRY)&_ZN6E28x123fooEv,
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G28x12y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv),
};
extern VTBL_ENTRY _ZTV8G28x12y4[];
extern void _ZN6E28x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x12__8G28x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x12[0]),
  (VTBL_ENTRY)&_ZN6E28x123fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C286E28x12__8G28x12y4[] = {
  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__3C286E28x12__8G28x12y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv)();
extern void ABISELECT(_ZThn32_N6E28x123fooEv,_ZThn28_N6E28x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x12__8G28x12y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6E28x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv),
};
static  VTT_ENTRY vtt_G28x12y4[] = {
  {&(_ZTV8G28x12y4[3]),  3,8},
  {&(_tg__ZTV6E28x12__8G28x12y4[3]),  3,4},
  {&(_tg__ZTV3C286E28x12__8G28x12y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C286E28x12__8G28x12y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E28x12__8G28x12y4[3]),  3,4},
  {&(_ZTV8G28x12y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI8G28x12y4[];
extern  VTBL_ENTRY _ZTV8G28x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x12y4[];
static VTBL_ENTRY alt_thunk_names103[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C283fooEv,_ZThn28_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x123fooEv,_ZThn28_N6E28x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x123fooEv,_ZThn28_N6E28x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x12y4 = {  "G28x12y4", // class name
  bases_G28x12y4, 6,
  &(vtc_G28x12y4[0]), // expected_vtbl_contents
  &(vtt_G28x12y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G28x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x12y4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x12y4),6, //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  G28x12y5  : virtual E28x12 , F0 {
  int ff;
  ~G28x12y5(); // tgen
  G28x12y5(); // tgen
};
//SIG(1 G28x12y5) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G28x12y5 ::~G28x12y5(){ note_dtor("G28x12y5", this);} // tgen
G28x12y5 ::G28x12y5(){ note_ctor("G28x12y5", this);} // tgen

static void Test_G28x12y5()
{
  extern Class_Descriptor cd_G28x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x12y5, buf);
    G28x12y5 *dp, &lv = *(dp=new (buf) G28x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x12y5)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x12*), ABISELECT(24,16), "G28x12y5");
    check_base_class_offset(lv, (B1*)(C28*)(E28x12*), ABISELECT(40,32), "G28x12y5");
    check_base_class_offset(lv, (C28*)(E28x12*), ABISELECT(16,12), "G28x12y5");
    check_base_class_offset(lv, (D0*)(E28x12*), ABISELECT(32,24), "G28x12y5");
    check_base_class_offset(lv, (E28x12*), ABISELECT(16,12), "G28x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G28x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x12y5.ff");
    test_class_info(&lv, &cd_G28x12y5);
    dp->~G28x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x12y5(Test_G28x12y5, "G28x12y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G28x12y5C1Ev();
extern void _ZN8G28x12y5D1Ev();
Name_Map name_map_G28x12y5[] = {
  NSPAIR(_ZN8G28x12y5C1Ev),
  NSPAIR(_ZN8G28x12y5D1Ev),
  {0,0}
};
extern Class_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_E28x12;
extern VTBL_ENTRY _ZTI6E28x12[];
extern  VTBL_ENTRY _ZTV6E28x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x12y5[] = {
  // 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_E28x12,    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 _ZTI8G28x12y5[];
extern void _ZN6E28x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv)();
extern void ABISELECT(_ZThn24_N6E28x123fooEv,_ZThn20_N6E28x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G28x12y5[0]),
  (VTBL_ENTRY)&_ZN6E28x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G28x12y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv),
};
extern VTBL_ENTRY _ZTV8G28x12y5[];
extern void _ZN6E28x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x12__8G28x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x12[0]),
  (VTBL_ENTRY)&_ZN6E28x123fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C286E28x12__8G28x12y5[] = {
  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__3C286E28x12__8G28x12y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv)();
extern void ABISELECT(_ZThn24_N6E28x123fooEv,_ZThn20_N6E28x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x12__8G28x12y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E28x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv),
};
static  VTT_ENTRY vtt_G28x12y5[] = {
  {&(_ZTV8G28x12y5[4]),  4,13},
  {&(_ZTV8G28x12y5[8]),  8,13},
  {&(_ZTV8G28x12y5[12]),  12,13},
  {&(_tg__ZTV6E28x12__8G28x12y5[3]),  3,4},
  {&(_tg__ZTV3C286E28x12__8G28x12y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C286E28x12__8G28x12y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E28x12__8G28x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x12y5[];
extern  VTBL_ENTRY _ZTV8G28x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x12y5[];
static VTBL_ENTRY alt_thunk_names104[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x123fooEv,_ZThn20_N6E28x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x123fooEv,_ZThn20_N6E28x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x12y5 = {  "G28x12y5", // class name
  bases_G28x12y5, 6,
  &(vtc_G28x12y5[0]), // expected_vtbl_contents
  &(vtt_G28x12y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G28x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x12y5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x12y5),7, //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  G28x12y6  : E28x12 , virtual F0 {
  int ff;
  ~G28x12y6(); // tgen
  G28x12y6(); // tgen
};
//SIG(1 G28x12y6) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G28x12y6 ::~G28x12y6(){ note_dtor("G28x12y6", this);} // tgen
G28x12y6 ::G28x12y6(){ note_ctor("G28x12y6", this);} // tgen

static void Test_G28x12y6()
{
  extern Class_Descriptor cd_G28x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G28x12y6, buf);
    G28x12y6 *dp, &lv = *(dp=new (buf) G28x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G28x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x12y6)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x12*), ABISELECT(8,4), "G28x12y6");
    check_base_class_offset(lv, (B1*)(C28*)(E28x12*), ABISELECT(32,24), "G28x12y6");
    check_base_class_offset(lv, (C28*)(E28x12*), 0, "G28x12y6");
    check_base_class_offset(lv, (D0*)(E28x12*), ABISELECT(16,12), "G28x12y6");
    check_base_class_offset(lv, (E28x12*), 0, "G28x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G28x12y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G28x12y6.ff");
    test_class_info(&lv, &cd_G28x12y6);
    dp->~G28x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x12y6(Test_G28x12y6, "G28x12y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G28x12y6C1Ev();
extern void _ZN8G28x12y6D1Ev();
Name_Map name_map_G28x12y6[] = {
  NSPAIR(_ZN8G28x12y6C1Ev),
  NSPAIR(_ZN8G28x12y6D1Ev),
  {0,0}
};
extern Class_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_E28x12;
extern VTBL_ENTRY _ZTI6E28x12[];
extern  VTBL_ENTRY _ZTV6E28x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x12y6[] = {
  // 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_E28x12,    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 _ZTI8G28x12y6[];
extern void _ZN6E28x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv)();
extern void ABISELECT(_ZThn32_N6E28x123fooEv,_ZThn24_N6E28x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x12y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x12y6[0]),
  (VTBL_ENTRY)&_ZN6E28x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G28x12y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv),
};
extern VTBL_ENTRY _ZTV8G28x12y6[];
extern void _ZN6E28x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x12__8G28x12y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x12[0]),
  (VTBL_ENTRY)&_ZN6E28x123fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C286E28x12__8G28x12y6[] = {
  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__3C286E28x12__8G28x12y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv)();
extern void ABISELECT(_ZThn32_N6E28x123fooEv,_ZThn24_N6E28x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x12__8G28x12y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E28x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv),
};
static  VTT_ENTRY vtt_G28x12y6[] = {
  {&(_ZTV8G28x12y6[4]),  4,9},
  {&(_tg__ZTV6E28x12__8G28x12y6[3]),  3,4},
  {&(_tg__ZTV3C286E28x12__8G28x12y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C286E28x12__8G28x12y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E28x12__8G28x12y6[3]),  3,4},
  {&(_ZTV8G28x12y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G28x12y6[];
extern  VTBL_ENTRY _ZTV8G28x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x12y6[];
static VTBL_ENTRY alt_thunk_names105[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x123fooEv,_ZThn24_N6E28x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x123fooEv,_ZThn24_N6E28x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x12y6 = {  "G28x12y6", // class name
  bases_G28x12y6, 6,
  &(vtc_G28x12y6[0]), // expected_vtbl_contents
  &(vtt_G28x12y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G28x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x12y6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x12y6),6, //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  G28x12y7  : virtual E28x12 , virtual F0 {
  int ff;
  ~G28x12y7(); // tgen
  G28x12y7(); // tgen
};
//SIG(1 G28x12y7) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G28x12y7 ::~G28x12y7(){ note_dtor("G28x12y7", this);} // tgen
G28x12y7 ::G28x12y7(){ note_ctor("G28x12y7", this);} // tgen

static void Test_G28x12y7()
{
  extern Class_Descriptor cd_G28x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x12y7, buf);
    G28x12y7 *dp, &lv = *(dp=new (buf) G28x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x12y7)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x12*), ABISELECT(24,12), "G28x12y7");
    check_base_class_offset(lv, (B1*)(C28*)(E28x12*), ABISELECT(40,28), "G28x12y7");
    check_base_class_offset(lv, (C28*)(E28x12*), ABISELECT(16,8), "G28x12y7");
    check_base_class_offset(lv, (D0*)(E28x12*), ABISELECT(32,20), "G28x12y7");
    check_base_class_offset(lv, (E28x12*), ABISELECT(16,8), "G28x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G28x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G28x12y7.ff");
    test_class_info(&lv, &cd_G28x12y7);
    dp->~G28x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x12y7(Test_G28x12y7, "G28x12y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G28x12y7C1Ev();
extern void _ZN8G28x12y7D1Ev();
Name_Map name_map_G28x12y7[] = {
  NSPAIR(_ZN8G28x12y7C1Ev),
  NSPAIR(_ZN8G28x12y7D1Ev),
  {0,0}
};
extern Class_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_E28x12;
extern VTBL_ENTRY _ZTI6E28x12[];
extern  VTBL_ENTRY _ZTV6E28x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x12y7[] = {
  // 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_E28x12,    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 _ZTI8G28x12y7[];
extern void _ZN6E28x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv)();
extern void ABISELECT(_ZThn24_N6E28x123fooEv,_ZThn20_N6E28x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x12y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G28x12y7[0]),
  (VTBL_ENTRY)&_ZN6E28x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G28x12y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv),
};
extern VTBL_ENTRY _ZTV8G28x12y7[];
extern void _ZN6E28x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x12__8G28x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x12[0]),
  (VTBL_ENTRY)&_ZN6E28x123fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C286E28x12__8G28x12y7[] = {
  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__3C286E28x12__8G28x12y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv)();
extern void ABISELECT(_ZThn24_N6E28x123fooEv,_ZThn20_N6E28x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x12__8G28x12y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E28x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv),
};
static  VTT_ENTRY vtt_G28x12y7[] = {
  {&(_ZTV8G28x12y7[5]),  5,14},
  {&(_ZTV8G28x12y7[9]),  9,14},
  {&(_ZTV8G28x12y7[13]),  13,14},
  {&(_tg__ZTV6E28x12__8G28x12y7[3]),  3,4},
  {&(_tg__ZTV3C286E28x12__8G28x12y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C286E28x12__8G28x12y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E28x12__8G28x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x12y7[];
extern  VTBL_ENTRY _ZTV8G28x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x12y7[];
static VTBL_ENTRY alt_thunk_names106[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x123fooEv,_ZTv0_n12_N6E28x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x123fooEv,_ZThn20_N6E28x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x123fooEv,_ZThn20_N6E28x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x12y7 = {  "G28x12y7", // class name
  bases_G28x12y7, 6,
  &(vtc_G28x12y7[0]), // expected_vtbl_contents
  &(vtt_G28x12y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G28x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x12y7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x12y7),7, //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  E29x12  : C29 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E29x123fooEv
  ~E29x12(); // tgen
  E29x12(); // tgen
};
//SIG(-1 E29x12) C1{ BC2{ BC3{ v1 Fi} VBC4{ v1 Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E29x12 ::foo(){vfunc_called(this, "_ZN6E29x123fooEv");}
E29x12 ::~E29x12(){ note_dtor("E29x12", this);} // tgen
E29x12 ::E29x12(){ note_ctor("E29x12", this);} // tgen

static void Test_E29x12()
{
  extern Class_Descriptor cd_E29x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E29x12, buf);
    E29x12 *dp, &lv = *(dp=new (buf) E29x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E29x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E29x12)");
    check_base_class_offset(lv, (A1*)(C29*), 0, "E29x12");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(24,20), "E29x12");
    check_base_class_offset(lv, (C29*), 0, "E29x12");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E29x12");
    check_field_offset(lv, fd, ABISELECT(20,16), "E29x12.fd");
    test_class_info(&lv, &cd_E29x12);
    dp->~E29x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE29x12(Test_E29x12, "E29x12", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E29x12C1Ev();
extern void _ZN6E29x12D1Ev();
Name_Map name_map_E29x12[] = {
  NSPAIR(_ZN6E29x12C1Ev),
  NSPAIR(_ZN6E29x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x12[] = {
  // 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 _ZTI6E29x12[];
extern void _ZN6E29x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv)();
extern void ABISELECT(_ZThn24_N6E29x123fooEv,_ZThn20_N6E29x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E29x12[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x12[0]),
  (VTBL_ENTRY)&_ZN6E29x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E29x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv),
};
extern VTBL_ENTRY _ZTV6E29x12[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__6E29x12[] = {
  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__6E29x12[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_E29x12[] = {
  {&(_ZTV6E29x12[3]),  3,8},
  {&(_tg__ZTV3C29__6E29x12[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__6E29x12[3]),  3,4},
  {&(_ZTV6E29x12[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6E29x12[];
extern  VTBL_ENTRY _ZTV6E29x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x12[];
static VTBL_ENTRY alt_thunk_names107[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x123fooEv,_ZThn20_N6E29x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E29x12 = {  "E29x12", // class name
  bases_E29x12, 4,
  &(vtc_E29x12[0]), // expected_vtbl_contents
  &(vtt_E29x12[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E29x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E29x12),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E29x12),4, //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  G29x12y0  : E29x12 , F1 {
  int ff;
  ~G29x12y0(); // tgen
  G29x12y0(); // tgen
};
//SIG(1 G29x12y0) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G29x12y0 ::~G29x12y0(){ note_dtor("G29x12y0", this);} // tgen
G29x12y0 ::G29x12y0(){ note_ctor("G29x12y0", this);} // tgen

static void Test_G29x12y0()
{
  extern Class_Descriptor cd_G29x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x12y0, buf);
    G29x12y0 *dp, &lv = *(dp=new (buf) G29x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x12y0)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x12*), 0, "G29x12y0");
    check_base_class_offset(lv, (B1*)(C29*)(E29x12*), ABISELECT(40,32), "G29x12y0");
    check_base_class_offset(lv, (C29*)(E29x12*), 0, "G29x12y0");
    check_base_class_offset(lv, (D0*)(E29x12*), ABISELECT(16,12), "G29x12y0");
    check_base_class_offset(lv, (E29x12*), 0, "G29x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G29x12y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G29x12y0.ff");
    test_class_info(&lv, &cd_G29x12y0);
    dp->~G29x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x12y0(Test_G29x12y0, "G29x12y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G29x12y0C1Ev();
extern void _ZN8G29x12y0D1Ev();
Name_Map name_map_G29x12y0[] = {
  NSPAIR(_ZN8G29x12y0C1Ev),
  NSPAIR(_ZN8G29x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x12;
extern VTBL_ENTRY _ZTI6E29x12[];
extern  VTBL_ENTRY _ZTV6E29x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x12y0[] = {
  // 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_E29x12,    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 _ZTI8G29x12y0[];
extern void _ZN6E29x123fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv)();
extern void ABISELECT(_ZThn40_N6E29x123fooEv,_ZThn32_N6E29x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x12y0[0]),
  (VTBL_ENTRY)&_ZN6E29x123fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G29x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G29x12y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv),
};
extern VTBL_ENTRY _ZTV8G29x12y0[];
extern void _ZN6E29x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x12__8G29x12y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x12[0]),
  (VTBL_ENTRY)&_ZN6E29x123fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C296E29x12__8G29x12y0[] = {
  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__3C296E29x12__8G29x12y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv)();
extern void ABISELECT(_ZThn40_N6E29x123fooEv,_ZThn32_N6E29x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x12__8G29x12y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6E29x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv),
};
static  VTT_ENTRY vtt_G29x12y0[] = {
  {&(_ZTV8G29x12y0[3]),  3,11},
  {&(_tg__ZTV6E29x12__8G29x12y0[3]),  3,4},
  {&(_tg__ZTV3C296E29x12__8G29x12y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C296E29x12__8G29x12y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E29x12__8G29x12y0[3]),  3,4},
  {&(_ZTV8G29x12y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI8G29x12y0[];
extern  VTBL_ENTRY _ZTV8G29x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x12y0[];
static VTBL_ENTRY alt_thunk_names108[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C293fooEv,_ZThn32_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E29x123fooEv,_ZThn32_N6E29x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E29x123fooEv,_ZThn32_N6E29x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x12y0 = {  "G29x12y0", // class name
  bases_G29x12y0, 6,
  &(vtc_G29x12y0[0]), // expected_vtbl_contents
  &(vtt_G29x12y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G29x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x12y0),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x12y0),6, //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  G29x12y1  : virtual E29x12 , F1 {
  int ff;
  ~G29x12y1(); // tgen
  G29x12y1(); // tgen
};
//SIG(1 G29x12y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G29x12y1 ::~G29x12y1(){ note_dtor("G29x12y1", this);} // tgen
G29x12y1 ::G29x12y1(){ note_ctor("G29x12y1", this);} // tgen

static void Test_G29x12y1()
{
  extern Class_Descriptor cd_G29x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x12y1, buf);
    G29x12y1 *dp, &lv = *(dp=new (buf) G29x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x12y1)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x12*), ABISELECT(16,12), "G29x12y1");
    check_base_class_offset(lv, (B1*)(C29*)(E29x12*), ABISELECT(40,32), "G29x12y1");
    check_base_class_offset(lv, (C29*)(E29x12*), ABISELECT(16,12), "G29x12y1");
    check_base_class_offset(lv, (D0*)(E29x12*), ABISELECT(32,24), "G29x12y1");
    check_base_class_offset(lv, (E29x12*), ABISELECT(16,12), "G29x12y1");
    check_base_class_offset(lv, (F1*), 0, "G29x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x12y1.ff");
    test_class_info(&lv, &cd_G29x12y1);
    dp->~G29x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x12y1(Test_G29x12y1, "G29x12y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G29x12y1C1Ev();
extern void _ZN8G29x12y1D1Ev();
Name_Map name_map_G29x12y1[] = {
  NSPAIR(_ZN8G29x12y1C1Ev),
  NSPAIR(_ZN8G29x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x12;
extern VTBL_ENTRY _ZTI6E29x12[];
extern  VTBL_ENTRY _ZTV6E29x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x12y1[] = {
  // 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_E29x12,    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 _ZTI8G29x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E29x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv)();
extern void ABISELECT(_ZThn24_N6E29x123fooEv,_ZThn20_N6E29x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G29x12y1[0]),
  (VTBL_ENTRY)&_ZN6E29x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G29x12y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv),
};
extern VTBL_ENTRY _ZTV8G29x12y1[];
extern void _ZN6E29x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x12__8G29x12y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x12[0]),
  (VTBL_ENTRY)&_ZN6E29x123fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C296E29x12__8G29x12y1[] = {
  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__3C296E29x12__8G29x12y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv)();
extern void ABISELECT(_ZThn24_N6E29x123fooEv,_ZThn20_N6E29x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x12__8G29x12y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E29x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv),
};
static  VTT_ENTRY vtt_G29x12y1[] = {
  {&(_ZTV8G29x12y1[4]),  4,14},
  {&(_ZTV8G29x12y1[9]),  9,14},
  {&(_ZTV8G29x12y1[13]),  13,14},
  {&(_tg__ZTV6E29x12__8G29x12y1[3]),  3,4},
  {&(_tg__ZTV3C296E29x12__8G29x12y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C296E29x12__8G29x12y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E29x12__8G29x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x12y1[];
extern  VTBL_ENTRY _ZTV8G29x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x12y1[];
static VTBL_ENTRY alt_thunk_names109[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x123fooEv,_ZThn20_N6E29x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x123fooEv,_ZThn20_N6E29x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x12y1 = {  "G29x12y1", // class name
  bases_G29x12y1, 6,
  &(vtc_G29x12y1[0]), // expected_vtbl_contents
  &(vtt_G29x12y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G29x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x12y1),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x12y1),7, //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  G29x12y2  : E29x12 , virtual F1 {
  int ff;
  ~G29x12y2(); // tgen
  G29x12y2(); // tgen
};
//SIG(1 G29x12y2) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G29x12y2 ::~G29x12y2(){ note_dtor("G29x12y2", this);} // tgen
G29x12y2 ::G29x12y2(){ note_ctor("G29x12y2", this);} // tgen

static void Test_G29x12y2()
{
  extern Class_Descriptor cd_G29x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G29x12y2, buf);
    G29x12y2 *dp, &lv = *(dp=new (buf) G29x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G29x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x12y2)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x12*), 0, "G29x12y2");
    check_base_class_offset(lv, (B1*)(C29*)(E29x12*), ABISELECT(32,24), "G29x12y2");
    check_base_class_offset(lv, (C29*)(E29x12*), 0, "G29x12y2");
    check_base_class_offset(lv, (D0*)(E29x12*), ABISELECT(16,12), "G29x12y2");
    check_base_class_offset(lv, (E29x12*), 0, "G29x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G29x12y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G29x12y2.ff");
    test_class_info(&lv, &cd_G29x12y2);
    dp->~G29x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x12y2(Test_G29x12y2, "G29x12y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G29x12y2C1Ev();
extern void _ZN8G29x12y2D1Ev();
Name_Map name_map_G29x12y2[] = {
  NSPAIR(_ZN8G29x12y2C1Ev),
  NSPAIR(_ZN8G29x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x12;
extern VTBL_ENTRY _ZTI6E29x12[];
extern  VTBL_ENTRY _ZTV6E29x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x12y2[] = {
  // 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_E29x12,    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 _ZTI8G29x12y2[];
extern void _ZN6E29x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv)();
extern void ABISELECT(_ZThn32_N6E29x123fooEv,_ZThn24_N6E29x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G29x12y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x12y2[0]),
  (VTBL_ENTRY)&_ZN6E29x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G29x12y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G29x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G29x12y2[];
extern void _ZN6E29x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x12__8G29x12y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x12[0]),
  (VTBL_ENTRY)&_ZN6E29x123fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C296E29x12__8G29x12y2[] = {
  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__3C296E29x12__8G29x12y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv)();
extern void ABISELECT(_ZThn32_N6E29x123fooEv,_ZThn24_N6E29x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x12__8G29x12y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E29x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv),
};
static  VTT_ENTRY vtt_G29x12y2[] = {
  {&(_ZTV8G29x12y2[4]),  4,13},
  {&(_tg__ZTV6E29x12__8G29x12y2[3]),  3,4},
  {&(_tg__ZTV3C296E29x12__8G29x12y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C296E29x12__8G29x12y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E29x12__8G29x12y2[3]),  3,4},
  {&(_ZTV8G29x12y2[8]),  8,13},
  {&(_ZTV8G29x12y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI8G29x12y2[];
extern  VTBL_ENTRY _ZTV8G29x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x12y2[];
static VTBL_ENTRY alt_thunk_names110[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x123fooEv,_ZThn24_N6E29x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x123fooEv,_ZThn24_N6E29x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x12y2 = {  "G29x12y2", // class name
  bases_G29x12y2, 6,
  &(vtc_G29x12y2[0]), // expected_vtbl_contents
  &(vtt_G29x12y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G29x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x12y2),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x12y2),7, //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  G29x12y3  : virtual E29x12 , virtual F1 {
  int ff;
  ~G29x12y3(); // tgen
  G29x12y3(); // tgen
};
//SIG(1 G29x12y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G29x12y3 ::~G29x12y3(){ note_dtor("G29x12y3", this);} // tgen
G29x12y3 ::G29x12y3(){ note_ctor("G29x12y3", this);} // tgen

static void Test_G29x12y3()
{
  extern Class_Descriptor cd_G29x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G29x12y3, buf);
    G29x12y3 *dp, &lv = *(dp=new (buf) G29x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G29x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x12y3)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x12*), ABISELECT(16,8), "G29x12y3");
    check_base_class_offset(lv, (B1*)(C29*)(E29x12*), ABISELECT(40,28), "G29x12y3");
    check_base_class_offset(lv, (C29*)(E29x12*), ABISELECT(16,8), "G29x12y3");
    check_base_class_offset(lv, (D0*)(E29x12*), ABISELECT(32,20), "G29x12y3");
    check_base_class_offset(lv, (E29x12*), ABISELECT(16,8), "G29x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G29x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G29x12y3.ff");
    test_class_info(&lv, &cd_G29x12y3);
    dp->~G29x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x12y3(Test_G29x12y3, "G29x12y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G29x12y3C1Ev();
extern void _ZN8G29x12y3D1Ev();
Name_Map name_map_G29x12y3[] = {
  NSPAIR(_ZN8G29x12y3C1Ev),
  NSPAIR(_ZN8G29x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x12;
extern VTBL_ENTRY _ZTI6E29x12[];
extern  VTBL_ENTRY _ZTV6E29x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x12y3[] = {
  // 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_E29x12,    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 _ZTI8G29x12y3[];
extern void _ZN6E29x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv)();
extern void ABISELECT(_ZThn24_N6E29x123fooEv,_ZThn20_N6E29x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G29x12y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G29x12y3[0]),
  (VTBL_ENTRY)&_ZN6E29x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G29x12y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G29x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G29x12y3[];
extern void _ZN6E29x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x12__8G29x12y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x12[0]),
  (VTBL_ENTRY)&_ZN6E29x123fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C296E29x12__8G29x12y3[] = {
  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__3C296E29x12__8G29x12y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv)();
extern void ABISELECT(_ZThn24_N6E29x123fooEv,_ZThn20_N6E29x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x12__8G29x12y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E29x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv),
};
static  VTT_ENTRY vtt_G29x12y3[] = {
  {&(_ZTV8G29x12y3[5]),  5,18},
  {&(_ZTV8G29x12y3[9]),  9,18},
  {&(_ZTV8G29x12y3[13]),  13,18},
  {&(_ZTV8G29x12y3[17]),  17,18},
  {&(_tg__ZTV6E29x12__8G29x12y3[3]),  3,4},
  {&(_tg__ZTV3C296E29x12__8G29x12y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C296E29x12__8G29x12y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E29x12__8G29x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x12y3[];
extern  VTBL_ENTRY _ZTV8G29x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x12y3[];
static VTBL_ENTRY alt_thunk_names111[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x123fooEv,_ZThn20_N6E29x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x123fooEv,_ZThn20_N6E29x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x12y3 = {  "G29x12y3", // class name
  bases_G29x12y3, 6,
  &(vtc_G29x12y3[0]), // expected_vtbl_contents
  &(vtt_G29x12y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G29x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x12y3),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x12y3),8, //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  G29x12y4  : E29x12 , F0 {
  int ff;
  ~G29x12y4(); // tgen
  G29x12y4(); // tgen
};
//SIG(1 G29x12y4) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G29x12y4 ::~G29x12y4(){ note_dtor("G29x12y4", this);} // tgen
G29x12y4 ::G29x12y4(){ note_ctor("G29x12y4", this);} // tgen

static void Test_G29x12y4()
{
  extern Class_Descriptor cd_G29x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G29x12y4, buf);
    G29x12y4 *dp, &lv = *(dp=new (buf) G29x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G29x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x12y4)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x12*), 0, "G29x12y4");
    check_base_class_offset(lv, (B1*)(C29*)(E29x12*), ABISELECT(32,28), "G29x12y4");
    check_base_class_offset(lv, (C29*)(E29x12*), 0, "G29x12y4");
    check_base_class_offset(lv, (D0*)(E29x12*), ABISELECT(16,12), "G29x12y4");
    check_base_class_offset(lv, (E29x12*), 0, "G29x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G29x12y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G29x12y4.ff");
    test_class_info(&lv, &cd_G29x12y4);
    dp->~G29x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x12y4(Test_G29x12y4, "G29x12y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G29x12y4C1Ev();
extern void _ZN8G29x12y4D1Ev();
Name_Map name_map_G29x12y4[] = {
  NSPAIR(_ZN8G29x12y4C1Ev),
  NSPAIR(_ZN8G29x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x12;
extern VTBL_ENTRY _ZTI6E29x12[];
extern  VTBL_ENTRY _ZTV6E29x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x12y4[] = {
  // 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_E29x12,    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 _ZTI8G29x12y4[];
extern void _ZN6E29x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv)();
extern void ABISELECT(_ZThn32_N6E29x123fooEv,_ZThn28_N6E29x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x12y4[0]),
  (VTBL_ENTRY)&_ZN6E29x123fooEv,
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G29x12y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv),
};
extern VTBL_ENTRY _ZTV8G29x12y4[];
extern void _ZN6E29x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x12__8G29x12y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x12[0]),
  (VTBL_ENTRY)&_ZN6E29x123fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C296E29x12__8G29x12y4[] = {
  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__3C296E29x12__8G29x12y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv)();
extern void ABISELECT(_ZThn32_N6E29x123fooEv,_ZThn28_N6E29x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x12__8G29x12y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6E29x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv),
};
static  VTT_ENTRY vtt_G29x12y4[] = {
  {&(_ZTV8G29x12y4[3]),  3,8},
  {&(_tg__ZTV6E29x12__8G29x12y4[3]),  3,4},
  {&(_tg__ZTV3C296E29x12__8G29x12y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C296E29x12__8G29x12y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E29x12__8G29x12y4[3]),  3,4},
  {&(_ZTV8G29x12y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI8G29x12y4[];
extern  VTBL_ENTRY _ZTV8G29x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x12y4[];
static VTBL_ENTRY alt_thunk_names112[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C293fooEv,_ZThn28_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x123fooEv,_ZThn28_N6E29x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x123fooEv,_ZThn28_N6E29x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x12y4 = {  "G29x12y4", // class name
  bases_G29x12y4, 6,
  &(vtc_G29x12y4[0]), // expected_vtbl_contents
  &(vtt_G29x12y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G29x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x12y4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x12y4),6, //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  G29x12y5  : virtual E29x12 , F0 {
  int ff;
  ~G29x12y5(); // tgen
  G29x12y5(); // tgen
};
//SIG(1 G29x12y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G29x12y5 ::~G29x12y5(){ note_dtor("G29x12y5", this);} // tgen
G29x12y5 ::G29x12y5(){ note_ctor("G29x12y5", this);} // tgen

static void Test_G29x12y5()
{
  extern Class_Descriptor cd_G29x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x12y5, buf);
    G29x12y5 *dp, &lv = *(dp=new (buf) G29x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x12y5)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x12*), ABISELECT(16,12), "G29x12y5");
    check_base_class_offset(lv, (B1*)(C29*)(E29x12*), ABISELECT(40,32), "G29x12y5");
    check_base_class_offset(lv, (C29*)(E29x12*), ABISELECT(16,12), "G29x12y5");
    check_base_class_offset(lv, (D0*)(E29x12*), ABISELECT(32,24), "G29x12y5");
    check_base_class_offset(lv, (E29x12*), ABISELECT(16,12), "G29x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G29x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x12y5.ff");
    test_class_info(&lv, &cd_G29x12y5);
    dp->~G29x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x12y5(Test_G29x12y5, "G29x12y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G29x12y5C1Ev();
extern void _ZN8G29x12y5D1Ev();
Name_Map name_map_G29x12y5[] = {
  NSPAIR(_ZN8G29x12y5C1Ev),
  NSPAIR(_ZN8G29x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x12;
extern VTBL_ENTRY _ZTI6E29x12[];
extern  VTBL_ENTRY _ZTV6E29x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x12y5[] = {
  // 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_E29x12,    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 _ZTI8G29x12y5[];
extern void _ZN6E29x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv)();
extern void ABISELECT(_ZThn24_N6E29x123fooEv,_ZThn20_N6E29x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G29x12y5[0]),
  (VTBL_ENTRY)&_ZN6E29x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G29x12y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv),
};
extern VTBL_ENTRY _ZTV8G29x12y5[];
extern void _ZN6E29x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x12__8G29x12y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x12[0]),
  (VTBL_ENTRY)&_ZN6E29x123fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C296E29x12__8G29x12y5[] = {
  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__3C296E29x12__8G29x12y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv)();
extern void ABISELECT(_ZThn24_N6E29x123fooEv,_ZThn20_N6E29x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x12__8G29x12y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E29x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv),
};
static  VTT_ENTRY vtt_G29x12y5[] = {
  {&(_ZTV8G29x12y5[4]),  4,13},
  {&(_ZTV8G29x12y5[8]),  8,13},
  {&(_ZTV8G29x12y5[12]),  12,13},
  {&(_tg__ZTV6E29x12__8G29x12y5[3]),  3,4},
  {&(_tg__ZTV3C296E29x12__8G29x12y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C296E29x12__8G29x12y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E29x12__8G29x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x12y5[];
extern  VTBL_ENTRY _ZTV8G29x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x12y5[];
static VTBL_ENTRY alt_thunk_names113[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x123fooEv,_ZThn20_N6E29x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x123fooEv,_ZThn20_N6E29x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x12y5 = {  "G29x12y5", // class name
  bases_G29x12y5, 6,
  &(vtc_G29x12y5[0]), // expected_vtbl_contents
  &(vtt_G29x12y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G29x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x12y5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x12y5),7, //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  G29x12y6  : E29x12 , virtual F0 {
  int ff;
  ~G29x12y6(); // tgen
  G29x12y6(); // tgen
};
//SIG(1 G29x12y6) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G29x12y6 ::~G29x12y6(){ note_dtor("G29x12y6", this);} // tgen
G29x12y6 ::G29x12y6(){ note_ctor("G29x12y6", this);} // tgen

static void Test_G29x12y6()
{
  extern Class_Descriptor cd_G29x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G29x12y6, buf);
    G29x12y6 *dp, &lv = *(dp=new (buf) G29x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G29x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x12y6)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x12*), 0, "G29x12y6");
    check_base_class_offset(lv, (B1*)(C29*)(E29x12*), ABISELECT(32,24), "G29x12y6");
    check_base_class_offset(lv, (C29*)(E29x12*), 0, "G29x12y6");
    check_base_class_offset(lv, (D0*)(E29x12*), ABISELECT(16,12), "G29x12y6");
    check_base_class_offset(lv, (E29x12*), 0, "G29x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G29x12y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G29x12y6.ff");
    test_class_info(&lv, &cd_G29x12y6);
    dp->~G29x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x12y6(Test_G29x12y6, "G29x12y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G29x12y6C1Ev();
extern void _ZN8G29x12y6D1Ev();
Name_Map name_map_G29x12y6[] = {
  NSPAIR(_ZN8G29x12y6C1Ev),
  NSPAIR(_ZN8G29x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x12;
extern VTBL_ENTRY _ZTI6E29x12[];
extern  VTBL_ENTRY _ZTV6E29x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x12y6[] = {
  // 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_E29x12,    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 _ZTI8G29x12y6[];
extern void _ZN6E29x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv)();
extern void ABISELECT(_ZThn32_N6E29x123fooEv,_ZThn24_N6E29x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x12y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x12y6[0]),
  (VTBL_ENTRY)&_ZN6E29x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G29x12y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv),
};
extern VTBL_ENTRY _ZTV8G29x12y6[];
extern void _ZN6E29x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x12__8G29x12y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x12[0]),
  (VTBL_ENTRY)&_ZN6E29x123fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C296E29x12__8G29x12y6[] = {
  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__3C296E29x12__8G29x12y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv)();
extern void ABISELECT(_ZThn32_N6E29x123fooEv,_ZThn24_N6E29x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x12__8G29x12y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E29x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv),
};
static  VTT_ENTRY vtt_G29x12y6[] = {
  {&(_ZTV8G29x12y6[4]),  4,9},
  {&(_tg__ZTV6E29x12__8G29x12y6[3]),  3,4},
  {&(_tg__ZTV3C296E29x12__8G29x12y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C296E29x12__8G29x12y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E29x12__8G29x12y6[3]),  3,4},
  {&(_ZTV8G29x12y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G29x12y6[];
extern  VTBL_ENTRY _ZTV8G29x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x12y6[];
static VTBL_ENTRY alt_thunk_names114[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x123fooEv,_ZThn24_N6E29x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x123fooEv,_ZThn24_N6E29x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x12y6 = {  "G29x12y6", // class name
  bases_G29x12y6, 6,
  &(vtc_G29x12y6[0]), // expected_vtbl_contents
  &(vtt_G29x12y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G29x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x12y6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x12y6),6, //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  G29x12y7  : virtual E29x12 , virtual F0 {
  int ff;
  ~G29x12y7(); // tgen
  G29x12y7(); // tgen
};
//SIG(1 G29x12y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G29x12y7 ::~G29x12y7(){ note_dtor("G29x12y7", this);} // tgen
G29x12y7 ::G29x12y7(){ note_ctor("G29x12y7", this);} // tgen

static void Test_G29x12y7()
{
  extern Class_Descriptor cd_G29x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x12y7, buf);
    G29x12y7 *dp, &lv = *(dp=new (buf) G29x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x12y7)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x12*), ABISELECT(16,8), "G29x12y7");
    check_base_class_offset(lv, (B1*)(C29*)(E29x12*), ABISELECT(40,28), "G29x12y7");
    check_base_class_offset(lv, (C29*)(E29x12*), ABISELECT(16,8), "G29x12y7");
    check_base_class_offset(lv, (D0*)(E29x12*), ABISELECT(32,20), "G29x12y7");
    check_base_class_offset(lv, (E29x12*), ABISELECT(16,8), "G29x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G29x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G29x12y7.ff");
    test_class_info(&lv, &cd_G29x12y7);
    dp->~G29x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x12y7(Test_G29x12y7, "G29x12y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G29x12y7C1Ev();
extern void _ZN8G29x12y7D1Ev();
Name_Map name_map_G29x12y7[] = {
  NSPAIR(_ZN8G29x12y7C1Ev),
  NSPAIR(_ZN8G29x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x12;
extern VTBL_ENTRY _ZTI6E29x12[];
extern  VTBL_ENTRY _ZTV6E29x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x12y7[] = {
  // 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_E29x12,    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 _ZTI8G29x12y7[];
extern void _ZN6E29x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv)();
extern void ABISELECT(_ZThn24_N6E29x123fooEv,_ZThn20_N6E29x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x12y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G29x12y7[0]),
  (VTBL_ENTRY)&_ZN6E29x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G29x12y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv),
};
extern VTBL_ENTRY _ZTV8G29x12y7[];
extern void _ZN6E29x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x12__8G29x12y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x12[0]),
  (VTBL_ENTRY)&_ZN6E29x123fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C296E29x12__8G29x12y7[] = {
  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__3C296E29x12__8G29x12y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv)();
extern void ABISELECT(_ZThn24_N6E29x123fooEv,_ZThn20_N6E29x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x12__8G29x12y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E29x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv),
};
static  VTT_ENTRY vtt_G29x12y7[] = {
  {&(_ZTV8G29x12y7[5]),  5,14},
  {&(_ZTV8G29x12y7[9]),  9,14},
  {&(_ZTV8G29x12y7[13]),  13,14},
  {&(_tg__ZTV6E29x12__8G29x12y7[3]),  3,4},
  {&(_tg__ZTV3C296E29x12__8G29x12y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C296E29x12__8G29x12y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E29x12__8G29x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x12y7[];
extern  VTBL_ENTRY _ZTV8G29x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x12y7[];
static VTBL_ENTRY alt_thunk_names115[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x123fooEv,_ZTv0_n12_N6E29x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x123fooEv,_ZThn20_N6E29x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x123fooEv,_ZThn20_N6E29x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x12y7 = {  "G29x12y7", // class name
  bases_G29x12y7, 6,
  &(vtc_G29x12y7[0]), // expected_vtbl_contents
  &(vtt_G29x12y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G29x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x12y7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x12y7),7, //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  E30x12  : C30 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E30x123fooEv
  ~E30x12(); // tgen
  E30x12(); // tgen
};
//SIG(-1 E30x12) C1{ BC2{ VBC3{ Fi} VBC4{ v1 Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E30x12 ::foo(){vfunc_called(this, "_ZN6E30x123fooEv");}
E30x12 ::~E30x12(){ note_dtor("E30x12", this);} // tgen
E30x12 ::E30x12(){ note_ctor("E30x12", this);} // tgen

static void Test_E30x12()
{
  extern Class_Descriptor cd_E30x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E30x12, buf);
    E30x12 *dp, &lv = *(dp=new (buf) E30x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E30x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E30x12)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(20,16), "E30x12");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(24,20), "E30x12");
    check_base_class_offset(lv, (C30*), 0, "E30x12");
    check_base_class_offset(lv, (D0*), ABISELECT(12,8), "E30x12");
    check_field_offset(lv, fd, ABISELECT(16,12), "E30x12.fd");
    test_class_info(&lv, &cd_E30x12);
    dp->~E30x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE30x12(Test_E30x12, "E30x12", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E30x12C1Ev();
extern void _ZN6E30x12D1Ev();
Name_Map name_map_E30x12[] = {
  NSPAIR(_ZN6E30x12C1Ev),
  NSPAIR(_ZN6E30x12D1Ev),
  {0,0}
};
extern Class_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_E30x12[] = {
  // 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 _ZTI6E30x12[];
extern void _ZN6E30x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv)();
extern void ABISELECT(_ZThn24_N6E30x123fooEv,_ZThn20_N6E30x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E30x12[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x12[0]),
  (VTBL_ENTRY)&_ZN6E30x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E30x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv),
};
extern VTBL_ENTRY _ZTV6E30x12[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__6E30x12[] = {
  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__6E30x12[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_E30x12[] = {
  {&(_ZTV6E30x12[4]),  4,9},
  {&(_tg__ZTV3C30__6E30x12[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__6E30x12[3]),  3,4},
  {&(_ZTV6E30x12[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6E30x12[];
extern  VTBL_ENTRY _ZTV6E30x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x12[];
static VTBL_ENTRY alt_thunk_names116[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x123fooEv,_ZThn20_N6E30x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E30x12 = {  "E30x12", // class name
  bases_E30x12, 4,
  &(vtc_E30x12[0]), // expected_vtbl_contents
  &(vtt_E30x12[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E30x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E30x12),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E30x12),4, //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  G30x12y0  : E30x12 , F1 {
  int ff;
  ~G30x12y0(); // tgen
  G30x12y0(); // tgen
};
//SIG(1 G30x12y0) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G30x12y0 ::~G30x12y0(){ note_dtor("G30x12y0", this);} // tgen
G30x12y0 ::G30x12y0(){ note_ctor("G30x12y0", this);} // tgen

static void Test_G30x12y0()
{
  extern Class_Descriptor cd_G30x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G30x12y0, buf);
    G30x12y0 *dp, &lv = *(dp=new (buf) G30x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G30x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x12y0)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x12*), ABISELECT(40,28), "G30x12y0");
    check_base_class_offset(lv, (B1*)(C30*)(E30x12*), ABISELECT(48,32), "G30x12y0");
    check_base_class_offset(lv, (C30*)(E30x12*), 0, "G30x12y0");
    check_base_class_offset(lv, (D0*)(E30x12*), ABISELECT(12,8), "G30x12y0");
    check_base_class_offset(lv, (E30x12*), 0, "G30x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G30x12y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G30x12y0.ff");
    test_class_info(&lv, &cd_G30x12y0);
    dp->~G30x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x12y0(Test_G30x12y0, "G30x12y0", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G30x12y0C1Ev();
extern void _ZN8G30x12y0D1Ev();
Name_Map name_map_G30x12y0[] = {
  NSPAIR(_ZN8G30x12y0C1Ev),
  NSPAIR(_ZN8G30x12y0D1Ev),
  {0,0}
};
extern Class_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_E30x12;
extern VTBL_ENTRY _ZTI6E30x12[];
extern  VTBL_ENTRY _ZTV6E30x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x12y0[] = {
  // 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_E30x12,    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 _ZTI8G30x12y0[];
extern void _ZN6E30x123fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv)();
extern void ABISELECT(_ZThn48_N6E30x123fooEv,_ZThn32_N6E30x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x12y0[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x12y0[0]),
  (VTBL_ENTRY)&_ZN6E30x123fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G30x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G30x12y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv),
};
extern VTBL_ENTRY _ZTV8G30x12y0[];
extern void _ZN6E30x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x12__8G30x12y0[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x12[0]),
  (VTBL_ENTRY)&_ZN6E30x123fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C306E30x12__8G30x12y0[] = {
  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__3C306E30x12__8G30x12y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv)();
extern void ABISELECT(_ZThn48_N6E30x123fooEv,_ZThn32_N6E30x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x12__8G30x12y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6E30x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv),
};
static  VTT_ENTRY vtt_G30x12y0[] = {
  {&(_ZTV8G30x12y0[4]),  4,12},
  {&(_tg__ZTV6E30x12__8G30x12y0[4]),  4,5},
  {&(_tg__ZTV3C306E30x12__8G30x12y0[4]),  4,5},
  {&(_tg__ZTV2B1__3C306E30x12__8G30x12y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E30x12__8G30x12y0[3]),  3,4},
  {&(_ZTV8G30x12y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI8G30x12y0[];
extern  VTBL_ENTRY _ZTV8G30x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x12y0[];
static VTBL_ENTRY alt_thunk_names117[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N3C303fooEv,_ZThn32_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E30x123fooEv,_ZThn32_N6E30x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E30x123fooEv,_ZThn32_N6E30x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x12y0 = {  "G30x12y0", // class name
  bases_G30x12y0, 6,
  &(vtc_G30x12y0[0]), // expected_vtbl_contents
  &(vtt_G30x12y0[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G30x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x12y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x12y0),6, //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  G30x12y1  : virtual E30x12 , F1 {
  int ff;
  ~G30x12y1(); // tgen
  G30x12y1(); // tgen
};
//SIG(1 G30x12y1) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G30x12y1 ::~G30x12y1(){ note_dtor("G30x12y1", this);} // tgen
G30x12y1 ::G30x12y1(){ note_ctor("G30x12y1", this);} // tgen

static void Test_G30x12y1()
{
  extern Class_Descriptor cd_G30x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x12y1, buf);
    G30x12y1 *dp, &lv = *(dp=new (buf) G30x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x12y1)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x12*), ABISELECT(36,28), "G30x12y1");
    check_base_class_offset(lv, (B1*)(C30*)(E30x12*), ABISELECT(40,32), "G30x12y1");
    check_base_class_offset(lv, (C30*)(E30x12*), ABISELECT(16,12), "G30x12y1");
    check_base_class_offset(lv, (D0*)(E30x12*), ABISELECT(28,20), "G30x12y1");
    check_base_class_offset(lv, (E30x12*), ABISELECT(16,12), "G30x12y1");
    check_base_class_offset(lv, (F1*), 0, "G30x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x12y1.ff");
    test_class_info(&lv, &cd_G30x12y1);
    dp->~G30x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x12y1(Test_G30x12y1, "G30x12y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G30x12y1C1Ev();
extern void _ZN8G30x12y1D1Ev();
Name_Map name_map_G30x12y1[] = {
  NSPAIR(_ZN8G30x12y1C1Ev),
  NSPAIR(_ZN8G30x12y1D1Ev),
  {0,0}
};
extern Class_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_E30x12;
extern VTBL_ENTRY _ZTI6E30x12[];
extern  VTBL_ENTRY _ZTV6E30x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x12y1[] = {
  // 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_E30x12,    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 _ZTI8G30x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E30x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv)();
extern void ABISELECT(_ZThn24_N6E30x123fooEv,_ZThn20_N6E30x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x12y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G30x12y1[0]),
  (VTBL_ENTRY)&_ZN6E30x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G30x12y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv),
};
extern VTBL_ENTRY _ZTV8G30x12y1[];
extern void _ZN6E30x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x12__8G30x12y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x12[0]),
  (VTBL_ENTRY)&_ZN6E30x123fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C306E30x12__8G30x12y1[] = {
  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__3C306E30x12__8G30x12y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv)();
extern void ABISELECT(_ZThn24_N6E30x123fooEv,_ZThn20_N6E30x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x12__8G30x12y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E30x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv),
};
static  VTT_ENTRY vtt_G30x12y1[] = {
  {&(_ZTV8G30x12y1[5]),  5,16},
  {&(_ZTV8G30x12y1[11]),  11,16},
  {&(_ZTV8G30x12y1[15]),  15,16},
  {&(_tg__ZTV6E30x12__8G30x12y1[4]),  4,5},
  {&(_tg__ZTV3C306E30x12__8G30x12y1[4]),  4,5},
  {&(_tg__ZTV2B1__3C306E30x12__8G30x12y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E30x12__8G30x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x12y1[];
extern  VTBL_ENTRY _ZTV8G30x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x12y1[];
static VTBL_ENTRY alt_thunk_names118[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x123fooEv,_ZThn20_N6E30x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x123fooEv,_ZThn20_N6E30x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x12y1 = {  "G30x12y1", // class name
  bases_G30x12y1, 6,
  &(vtc_G30x12y1[0]), // expected_vtbl_contents
  &(vtt_G30x12y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G30x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x12y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x12y1),7, //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  G30x12y2  : E30x12 , virtual F1 {
  int ff;
  ~G30x12y2(); // tgen
  G30x12y2(); // tgen
};
//SIG(1 G30x12y2) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G30x12y2 ::~G30x12y2(){ note_dtor("G30x12y2", this);} // tgen
G30x12y2 ::G30x12y2(){ note_ctor("G30x12y2", this);} // tgen

static void Test_G30x12y2()
{
  extern Class_Descriptor cd_G30x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G30x12y2, buf);
    G30x12y2 *dp, &lv = *(dp=new (buf) G30x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G30x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x12y2)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x12*), ABISELECT(24,20), "G30x12y2");
    check_base_class_offset(lv, (B1*)(C30*)(E30x12*), ABISELECT(32,24), "G30x12y2");
    check_base_class_offset(lv, (C30*)(E30x12*), 0, "G30x12y2");
    check_base_class_offset(lv, (D0*)(E30x12*), ABISELECT(12,8), "G30x12y2");
    check_base_class_offset(lv, (E30x12*), 0, "G30x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G30x12y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G30x12y2.ff");
    test_class_info(&lv, &cd_G30x12y2);
    dp->~G30x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x12y2(Test_G30x12y2, "G30x12y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G30x12y2C1Ev();
extern void _ZN8G30x12y2D1Ev();
Name_Map name_map_G30x12y2[] = {
  NSPAIR(_ZN8G30x12y2C1Ev),
  NSPAIR(_ZN8G30x12y2D1Ev),
  {0,0}
};
extern Class_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_E30x12;
extern VTBL_ENTRY _ZTI6E30x12[];
extern  VTBL_ENTRY _ZTV6E30x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x12y2[] = {
  // 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_E30x12,    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 _ZTI8G30x12y2[];
extern void _ZN6E30x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv)();
extern void ABISELECT(_ZThn32_N6E30x123fooEv,_ZThn24_N6E30x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G30x12y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x12y2[0]),
  (VTBL_ENTRY)&_ZN6E30x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G30x12y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G30x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G30x12y2[];
extern void _ZN6E30x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x12__8G30x12y2[] = {
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x12[0]),
  (VTBL_ENTRY)&_ZN6E30x123fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C306E30x12__8G30x12y2[] = {
  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__3C306E30x12__8G30x12y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv)();
extern void ABISELECT(_ZThn32_N6E30x123fooEv,_ZThn24_N6E30x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x12__8G30x12y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E30x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv),
};
static  VTT_ENTRY vtt_G30x12y2[] = {
  {&(_ZTV8G30x12y2[5]),  5,14},
  {&(_tg__ZTV6E30x12__8G30x12y2[4]),  4,5},
  {&(_tg__ZTV3C306E30x12__8G30x12y2[4]),  4,5},
  {&(_tg__ZTV2B1__3C306E30x12__8G30x12y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E30x12__8G30x12y2[3]),  3,4},
  {&(_ZTV8G30x12y2[9]),  9,14},
  {&(_ZTV8G30x12y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI8G30x12y2[];
extern  VTBL_ENTRY _ZTV8G30x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x12y2[];
static VTBL_ENTRY alt_thunk_names119[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x123fooEv,_ZThn24_N6E30x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x123fooEv,_ZThn24_N6E30x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x12y2 = {  "G30x12y2", // class name
  bases_G30x12y2, 6,
  &(vtc_G30x12y2[0]), // expected_vtbl_contents
  &(vtt_G30x12y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G30x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x12y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x12y2),7, //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  G30x12y3  : virtual E30x12 , virtual F1 {
  int ff;
  ~G30x12y3(); // tgen
  G30x12y3(); // tgen
};
//SIG(1 G30x12y3) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G30x12y3 ::~G30x12y3(){ note_dtor("G30x12y3", this);} // tgen
G30x12y3 ::G30x12y3(){ note_ctor("G30x12y3", this);} // tgen

static void Test_G30x12y3()
{
  extern Class_Descriptor cd_G30x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G30x12y3, buf);
    G30x12y3 *dp, &lv = *(dp=new (buf) G30x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G30x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x12y3)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x12*), ABISELECT(36,24), "G30x12y3");
    check_base_class_offset(lv, (B1*)(C30*)(E30x12*), ABISELECT(40,28), "G30x12y3");
    check_base_class_offset(lv, (C30*)(E30x12*), ABISELECT(16,8), "G30x12y3");
    check_base_class_offset(lv, (D0*)(E30x12*), ABISELECT(28,16), "G30x12y3");
    check_base_class_offset(lv, (E30x12*), ABISELECT(16,8), "G30x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G30x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G30x12y3.ff");
    test_class_info(&lv, &cd_G30x12y3);
    dp->~G30x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x12y3(Test_G30x12y3, "G30x12y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G30x12y3C1Ev();
extern void _ZN8G30x12y3D1Ev();
Name_Map name_map_G30x12y3[] = {
  NSPAIR(_ZN8G30x12y3C1Ev),
  NSPAIR(_ZN8G30x12y3D1Ev),
  {0,0}
};
extern Class_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_E30x12;
extern VTBL_ENTRY _ZTI6E30x12[];
extern  VTBL_ENTRY _ZTV6E30x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x12y3[] = {
  // 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_E30x12,    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 _ZTI8G30x12y3[];
extern void _ZN6E30x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv)();
extern void ABISELECT(_ZThn24_N6E30x123fooEv,_ZThn20_N6E30x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G30x12y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x12y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G30x12y3[0]),
  (VTBL_ENTRY)&_ZN6E30x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G30x12y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G30x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G30x12y3[];
extern void _ZN6E30x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x12__8G30x12y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x12[0]),
  (VTBL_ENTRY)&_ZN6E30x123fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C306E30x12__8G30x12y3[] = {
  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__3C306E30x12__8G30x12y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv)();
extern void ABISELECT(_ZThn24_N6E30x123fooEv,_ZThn20_N6E30x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x12__8G30x12y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E30x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv),
};
static  VTT_ENTRY vtt_G30x12y3[] = {
  {&(_ZTV8G30x12y3[6]),  6,20},
  {&(_ZTV8G30x12y3[11]),  11,20},
  {&(_ZTV8G30x12y3[15]),  15,20},
  {&(_ZTV8G30x12y3[19]),  19,20},
  {&(_tg__ZTV6E30x12__8G30x12y3[4]),  4,5},
  {&(_tg__ZTV3C306E30x12__8G30x12y3[4]),  4,5},
  {&(_tg__ZTV2B1__3C306E30x12__8G30x12y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E30x12__8G30x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x12y3[];
extern  VTBL_ENTRY _ZTV8G30x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x12y3[];
static VTBL_ENTRY alt_thunk_names120[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x123fooEv,_ZThn20_N6E30x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x123fooEv,_ZThn20_N6E30x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x12y3 = {  "G30x12y3", // class name
  bases_G30x12y3, 6,
  &(vtc_G30x12y3[0]), // expected_vtbl_contents
  &(vtt_G30x12y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G30x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x12y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x12y3),8, //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  G30x12y4  : E30x12 , F0 {
  int ff;
  ~G30x12y4(); // tgen
  G30x12y4(); // tgen
};
//SIG(1 G30x12y4) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G30x12y4 ::~G30x12y4(){ note_dtor("G30x12y4", this);} // tgen
G30x12y4 ::G30x12y4(){ note_ctor("G30x12y4", this);} // tgen

static void Test_G30x12y4()
{
  extern Class_Descriptor cd_G30x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G30x12y4, buf);
    G30x12y4 *dp, &lv = *(dp=new (buf) G30x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G30x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x12y4)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x12*), ABISELECT(28,24), "G30x12y4");
    check_base_class_offset(lv, (B1*)(C30*)(E30x12*), ABISELECT(32,28), "G30x12y4");
    check_base_class_offset(lv, (C30*)(E30x12*), 0, "G30x12y4");
    check_base_class_offset(lv, (D0*)(E30x12*), ABISELECT(12,8), "G30x12y4");
    check_base_class_offset(lv, (E30x12*), 0, "G30x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G30x12y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G30x12y4.ff");
    test_class_info(&lv, &cd_G30x12y4);
    dp->~G30x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x12y4(Test_G30x12y4, "G30x12y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G30x12y4C1Ev();
extern void _ZN8G30x12y4D1Ev();
Name_Map name_map_G30x12y4[] = {
  NSPAIR(_ZN8G30x12y4C1Ev),
  NSPAIR(_ZN8G30x12y4D1Ev),
  {0,0}
};
extern Class_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_E30x12;
extern VTBL_ENTRY _ZTI6E30x12[];
extern  VTBL_ENTRY _ZTV6E30x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x12y4[] = {
  // 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_E30x12,    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 _ZTI8G30x12y4[];
extern void _ZN6E30x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv)();
extern void ABISELECT(_ZThn32_N6E30x123fooEv,_ZThn28_N6E30x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x12y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x12y4[0]),
  (VTBL_ENTRY)&_ZN6E30x123fooEv,
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G30x12y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv),
};
extern VTBL_ENTRY _ZTV8G30x12y4[];
extern void _ZN6E30x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x12__8G30x12y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x12[0]),
  (VTBL_ENTRY)&_ZN6E30x123fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C306E30x12__8G30x12y4[] = {
  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__3C306E30x12__8G30x12y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv)();
extern void ABISELECT(_ZThn32_N6E30x123fooEv,_ZThn28_N6E30x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x12__8G30x12y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6E30x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv),
};
static  VTT_ENTRY vtt_G30x12y4[] = {
  {&(_ZTV8G30x12y4[4]),  4,9},
  {&(_tg__ZTV6E30x12__8G30x12y4[4]),  4,5},
  {&(_tg__ZTV3C306E30x12__8G30x12y4[4]),  4,5},
  {&(_tg__ZTV2B1__3C306E30x12__8G30x12y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E30x12__8G30x12y4[3]),  3,4},
  {&(_ZTV8G30x12y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G30x12y4[];
extern  VTBL_ENTRY _ZTV8G30x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x12y4[];
static VTBL_ENTRY alt_thunk_names121[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C303fooEv,_ZThn28_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x123fooEv,_ZThn28_N6E30x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x123fooEv,_ZThn28_N6E30x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x12y4 = {  "G30x12y4", // class name
  bases_G30x12y4, 6,
  &(vtc_G30x12y4[0]), // expected_vtbl_contents
  &(vtt_G30x12y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G30x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x12y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x12y4),6, //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  G30x12y5  : virtual E30x12 , F0 {
  int ff;
  ~G30x12y5(); // tgen
  G30x12y5(); // tgen
};
//SIG(1 G30x12y5) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G30x12y5 ::~G30x12y5(){ note_dtor("G30x12y5", this);} // tgen
G30x12y5 ::G30x12y5(){ note_ctor("G30x12y5", this);} // tgen

static void Test_G30x12y5()
{
  extern Class_Descriptor cd_G30x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x12y5, buf);
    G30x12y5 *dp, &lv = *(dp=new (buf) G30x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x12y5)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x12*), ABISELECT(36,28), "G30x12y5");
    check_base_class_offset(lv, (B1*)(C30*)(E30x12*), ABISELECT(40,32), "G30x12y5");
    check_base_class_offset(lv, (C30*)(E30x12*), ABISELECT(16,12), "G30x12y5");
    check_base_class_offset(lv, (D0*)(E30x12*), ABISELECT(28,20), "G30x12y5");
    check_base_class_offset(lv, (E30x12*), ABISELECT(16,12), "G30x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G30x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x12y5.ff");
    test_class_info(&lv, &cd_G30x12y5);
    dp->~G30x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x12y5(Test_G30x12y5, "G30x12y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G30x12y5C1Ev();
extern void _ZN8G30x12y5D1Ev();
Name_Map name_map_G30x12y5[] = {
  NSPAIR(_ZN8G30x12y5C1Ev),
  NSPAIR(_ZN8G30x12y5D1Ev),
  {0,0}
};
extern Class_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_E30x12;
extern VTBL_ENTRY _ZTI6E30x12[];
extern  VTBL_ENTRY _ZTV6E30x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x12y5[] = {
  // 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_E30x12,    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 _ZTI8G30x12y5[];
extern void _ZN6E30x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv)();
extern void ABISELECT(_ZThn24_N6E30x123fooEv,_ZThn20_N6E30x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x12y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x12y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G30x12y5[0]),
  (VTBL_ENTRY)&_ZN6E30x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G30x12y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv),
};
extern VTBL_ENTRY _ZTV8G30x12y5[];
extern void _ZN6E30x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x12__8G30x12y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x12[0]),
  (VTBL_ENTRY)&_ZN6E30x123fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C306E30x12__8G30x12y5[] = {
  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__3C306E30x12__8G30x12y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv)();
extern void ABISELECT(_ZThn24_N6E30x123fooEv,_ZThn20_N6E30x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x12__8G30x12y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E30x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv),
};
static  VTT_ENTRY vtt_G30x12y5[] = {
  {&(_ZTV8G30x12y5[5]),  5,15},
  {&(_ZTV8G30x12y5[10]),  10,15},
  {&(_ZTV8G30x12y5[14]),  14,15},
  {&(_tg__ZTV6E30x12__8G30x12y5[4]),  4,5},
  {&(_tg__ZTV3C306E30x12__8G30x12y5[4]),  4,5},
  {&(_tg__ZTV2B1__3C306E30x12__8G30x12y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E30x12__8G30x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x12y5[];
extern  VTBL_ENTRY _ZTV8G30x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x12y5[];
static VTBL_ENTRY alt_thunk_names122[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x123fooEv,_ZThn20_N6E30x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x123fooEv,_ZThn20_N6E30x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x12y5 = {  "G30x12y5", // class name
  bases_G30x12y5, 6,
  &(vtc_G30x12y5[0]), // expected_vtbl_contents
  &(vtt_G30x12y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G30x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x12y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x12y5),7, //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  G30x12y6  : E30x12 , virtual F0 {
  int ff;
  ~G30x12y6(); // tgen
  G30x12y6(); // tgen
};
//SIG(1 G30x12y6) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G30x12y6 ::~G30x12y6(){ note_dtor("G30x12y6", this);} // tgen
G30x12y6 ::G30x12y6(){ note_ctor("G30x12y6", this);} // tgen

static void Test_G30x12y6()
{
  extern Class_Descriptor cd_G30x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G30x12y6, buf);
    G30x12y6 *dp, &lv = *(dp=new (buf) G30x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G30x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x12y6)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x12*), ABISELECT(24,20), "G30x12y6");
    check_base_class_offset(lv, (B1*)(C30*)(E30x12*), ABISELECT(32,24), "G30x12y6");
    check_base_class_offset(lv, (C30*)(E30x12*), 0, "G30x12y6");
    check_base_class_offset(lv, (D0*)(E30x12*), ABISELECT(12,8), "G30x12y6");
    check_base_class_offset(lv, (E30x12*), 0, "G30x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G30x12y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G30x12y6.ff");
    test_class_info(&lv, &cd_G30x12y6);
    dp->~G30x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x12y6(Test_G30x12y6, "G30x12y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G30x12y6C1Ev();
extern void _ZN8G30x12y6D1Ev();
Name_Map name_map_G30x12y6[] = {
  NSPAIR(_ZN8G30x12y6C1Ev),
  NSPAIR(_ZN8G30x12y6D1Ev),
  {0,0}
};
extern Class_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_E30x12;
extern VTBL_ENTRY _ZTI6E30x12[];
extern  VTBL_ENTRY _ZTV6E30x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x12y6[] = {
  // 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_E30x12,    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 _ZTI8G30x12y6[];
extern void _ZN6E30x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv)();
extern void ABISELECT(_ZThn32_N6E30x123fooEv,_ZThn24_N6E30x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x12y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x12y6[0]),
  (VTBL_ENTRY)&_ZN6E30x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G30x12y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv),
};
extern VTBL_ENTRY _ZTV8G30x12y6[];
extern void _ZN6E30x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x12__8G30x12y6[] = {
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x12[0]),
  (VTBL_ENTRY)&_ZN6E30x123fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C306E30x12__8G30x12y6[] = {
  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__3C306E30x12__8G30x12y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv)();
extern void ABISELECT(_ZThn32_N6E30x123fooEv,_ZThn24_N6E30x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x12__8G30x12y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E30x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv),
};
static  VTT_ENTRY vtt_G30x12y6[] = {
  {&(_ZTV8G30x12y6[5]),  5,10},
  {&(_tg__ZTV6E30x12__8G30x12y6[4]),  4,5},
  {&(_tg__ZTV3C306E30x12__8G30x12y6[4]),  4,5},
  {&(_tg__ZTV2B1__3C306E30x12__8G30x12y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E30x12__8G30x12y6[3]),  3,4},
  {&(_ZTV8G30x12y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G30x12y6[];
extern  VTBL_ENTRY _ZTV8G30x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x12y6[];
static VTBL_ENTRY alt_thunk_names123[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x123fooEv,_ZThn24_N6E30x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x123fooEv,_ZThn24_N6E30x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x12y6 = {  "G30x12y6", // class name
  bases_G30x12y6, 6,
  &(vtc_G30x12y6[0]), // expected_vtbl_contents
  &(vtt_G30x12y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G30x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x12y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x12y6),6, //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  G30x12y7  : virtual E30x12 , virtual F0 {
  int ff;
  ~G30x12y7(); // tgen
  G30x12y7(); // tgen
};
//SIG(1 G30x12y7) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G30x12y7 ::~G30x12y7(){ note_dtor("G30x12y7", this);} // tgen
G30x12y7 ::G30x12y7(){ note_ctor("G30x12y7", this);} // tgen

static void Test_G30x12y7()
{
  extern Class_Descriptor cd_G30x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x12y7, buf);
    G30x12y7 *dp, &lv = *(dp=new (buf) G30x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x12y7)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x12*), ABISELECT(36,24), "G30x12y7");
    check_base_class_offset(lv, (B1*)(C30*)(E30x12*), ABISELECT(40,28), "G30x12y7");
    check_base_class_offset(lv, (C30*)(E30x12*), ABISELECT(16,8), "G30x12y7");
    check_base_class_offset(lv, (D0*)(E30x12*), ABISELECT(28,16), "G30x12y7");
    check_base_class_offset(lv, (E30x12*), ABISELECT(16,8), "G30x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G30x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G30x12y7.ff");
    test_class_info(&lv, &cd_G30x12y7);
    dp->~G30x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x12y7(Test_G30x12y7, "G30x12y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G30x12y7C1Ev();
extern void _ZN8G30x12y7D1Ev();
Name_Map name_map_G30x12y7[] = {
  NSPAIR(_ZN8G30x12y7C1Ev),
  NSPAIR(_ZN8G30x12y7D1Ev),
  {0,0}
};
extern Class_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_E30x12;
extern VTBL_ENTRY _ZTI6E30x12[];
extern  VTBL_ENTRY _ZTV6E30x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x12y7[] = {
  // 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_E30x12,    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 _ZTI8G30x12y7[];
extern void _ZN6E30x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv)();
extern void ABISELECT(_ZThn24_N6E30x123fooEv,_ZThn20_N6E30x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x12y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x12y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G30x12y7[0]),
  (VTBL_ENTRY)&_ZN6E30x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G30x12y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv),
};
extern VTBL_ENTRY _ZTV8G30x12y7[];
extern void _ZN6E30x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x12__8G30x12y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x12[0]),
  (VTBL_ENTRY)&_ZN6E30x123fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C306E30x12__8G30x12y7[] = {
  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__3C306E30x12__8G30x12y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv)();
extern void ABISELECT(_ZThn24_N6E30x123fooEv,_ZThn20_N6E30x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x12__8G30x12y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E30x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv),
};
static  VTT_ENTRY vtt_G30x12y7[] = {
  {&(_ZTV8G30x12y7[6]),  6,16},
  {&(_ZTV8G30x12y7[11]),  11,16},
  {&(_ZTV8G30x12y7[15]),  15,16},
  {&(_tg__ZTV6E30x12__8G30x12y7[4]),  4,5},
  {&(_tg__ZTV3C306E30x12__8G30x12y7[4]),  4,5},
  {&(_tg__ZTV2B1__3C306E30x12__8G30x12y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E30x12__8G30x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x12y7[];
extern  VTBL_ENTRY _ZTV8G30x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x12y7[];
static VTBL_ENTRY alt_thunk_names124[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x123fooEv,_ZTv0_n12_N6E30x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x123fooEv,_ZThn20_N6E30x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x123fooEv,_ZThn20_N6E30x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x12y7 = {  "G30x12y7", // class name
  bases_G30x12y7, 6,
  &(vtc_G30x12y7[0]), // expected_vtbl_contents
  &(vtt_G30x12y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G30x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x12y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x12y7),7, //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  E31x12  : C31 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E31x123fooEv
  ~E31x12(); // tgen
  E31x12(); // tgen
};
//SIG(-1 E31x12) C1{ BC2{ VBC3{ v1 Fi} VBC4{ v1 Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E31x12 ::foo(){vfunc_called(this, "_ZN6E31x123fooEv");}
E31x12 ::~E31x12(){ note_dtor("E31x12", this);} // tgen
E31x12 ::E31x12(){ note_ctor("E31x12", this);} // tgen

static void Test_E31x12()
{
  extern Class_Descriptor cd_E31x12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_E31x12, buf);
    E31x12 *dp, &lv = *(dp=new (buf) E31x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(E31x12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E31x12)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(24,16), "E31x12");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(40,24), "E31x12");
    check_base_class_offset(lv, (C31*), 0, "E31x12");
    check_base_class_offset(lv, (D0*), ABISELECT(12,8), "E31x12");
    check_field_offset(lv, fd, ABISELECT(16,12), "E31x12.fd");
    test_class_info(&lv, &cd_E31x12);
    dp->~E31x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE31x12(Test_E31x12, "E31x12", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN6E31x12C1Ev();
extern void _ZN6E31x12D1Ev();
Name_Map name_map_E31x12[] = {
  NSPAIR(_ZN6E31x12C1Ev),
  NSPAIR(_ZN6E31x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x12[] = {
  // 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 _ZTI6E31x12[];
extern void _ZN6E31x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn16_N6E31x123fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn24_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E31x12[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&_ZN6E31x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
extern VTBL_ENTRY _ZTV6E31x12[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__6E31x12[] = {
  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__6E31x12[] = {
  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__6E31x12[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_E31x12[] = {
  {&(_ZTV6E31x12[4]),  4,13},
  {&(_tg__ZTV3C31__6E31x12[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__6E31x12[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__6E31x12[3]),  3,4},
  {&(_ZTV6E31x12[8]),  8,13},
  {&(_ZTV6E31x12[12]),  12,13},
};
extern VTBL_ENTRY _ZTI6E31x12[];
extern  VTBL_ENTRY _ZTV6E31x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x12[];
static VTBL_ENTRY alt_thunk_names125[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn24_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn16_N6E31x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E31x12 = {  "E31x12", // class name
  bases_E31x12, 4,
  &(vtc_E31x12[0]), // expected_vtbl_contents
  &(vtt_E31x12[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI6E31x12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E31x12),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E31x12),6, //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  G31x12y0  : E31x12 , F1 {
  int ff;
  ~G31x12y0(); // tgen
  G31x12y0(); // tgen
};
//SIG(1 G31x12y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G31x12y0 ::~G31x12y0(){ note_dtor("G31x12y0", this);} // tgen
G31x12y0 ::G31x12y0(){ note_ctor("G31x12y0", this);} // tgen

static void Test_G31x12y0()
{
  extern Class_Descriptor cd_G31x12y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x12y0, buf);
    G31x12y0 *dp, &lv = *(dp=new (buf) G31x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x12y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x12y0)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x12*), ABISELECT(40,28), "G31x12y0");
    check_base_class_offset(lv, (B1*)(C31*)(E31x12*), ABISELECT(56,36), "G31x12y0");
    check_base_class_offset(lv, (C31*)(E31x12*), 0, "G31x12y0");
    check_base_class_offset(lv, (D0*)(E31x12*), ABISELECT(12,8), "G31x12y0");
    check_base_class_offset(lv, (E31x12*), 0, "G31x12y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G31x12y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G31x12y0.ff");
    test_class_info(&lv, &cd_G31x12y0);
    dp->~G31x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x12y0(Test_G31x12y0, "G31x12y0", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G31x12y0C1Ev();
extern void _ZN8G31x12y0D1Ev();
Name_Map name_map_G31x12y0[] = {
  NSPAIR(_ZN8G31x12y0C1Ev),
  NSPAIR(_ZN8G31x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x12;
extern VTBL_ENTRY _ZTI6E31x12[];
extern  VTBL_ENTRY _ZTV6E31x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x12y0[] = {
  // 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_E31x12,    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 _ZTI8G31x12y0[];
extern void _ZN6E31x123fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn28_N6E31x123fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn56_N6E31x123fooEv,_ZThn36_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x12y0[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x12y0[0]),
  (VTBL_ENTRY)&_ZN6E31x123fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G31x12y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G31x12y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
  ABISELECT(-56,-36),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G31x12y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
extern VTBL_ENTRY _ZTV8G31x12y0[];
extern void _ZN6E31x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x12__8G31x12y0[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&_ZN6E31x123fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C316E31x12__8G31x12y0[] = {
  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__3C316E31x12__8G31x12y0[] = {
  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__3C316E31x12__8G31x12y0[] = {
  ABISELECT(-56,-36),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn28_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x12__8G31x12y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn56_N6E31x123fooEv,_ZThn36_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x12__8G31x12y0[] = {
  ABISELECT(-56,-36),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
static  VTT_ENTRY vtt_G31x12y0[] = {
  {&(_ZTV8G31x12y0[4]),  4,16},
  {&(_tg__ZTV6E31x12__8G31x12y0[4]),  4,5},
  {&(_tg__ZTV3C316E31x12__8G31x12y0[4]),  4,5},
  {&(_tg__ZTV2A1__3C316E31x12__8G31x12y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C316E31x12__8G31x12y0[3]),  3,4},
  {&(_tg__ZTV2A1__6E31x12__8G31x12y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x12__8G31x12y0[3]),  3,4},
  {&(_ZTV8G31x12y0[11]),  11,16},
  {&(_ZTV8G31x12y0[15]),  15,16},
};
extern VTBL_ENTRY _ZTI8G31x12y0[];
extern  VTBL_ENTRY _ZTV8G31x12y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x12y0[];
static VTBL_ENTRY alt_thunk_names126[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn56_N3C313fooEv,_ZThn36_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E31x123fooEv,_ZThn36_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn28_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E31x123fooEv,_ZThn36_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn28_N6E31x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x12y0 = {  "G31x12y0", // class name
  bases_G31x12y0, 6,
  &(vtc_G31x12y0[0]), // expected_vtbl_contents
  &(vtt_G31x12y0[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G31x12y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x12y0),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x12y0),9, //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  G31x12y1  : virtual E31x12 , F1 {
  int ff;
  ~G31x12y1(); // tgen
  G31x12y1(); // tgen
};
//SIG(1 G31x12y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G31x12y1 ::~G31x12y1(){ note_dtor("G31x12y1", this);} // tgen
G31x12y1 ::G31x12y1(){ note_ctor("G31x12y1", this);} // tgen

static void Test_G31x12y1()
{
  extern Class_Descriptor cd_G31x12y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x12y1, buf);
    G31x12y1 *dp, &lv = *(dp=new (buf) G31x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x12y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x12y1)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x12*), ABISELECT(40,28), "G31x12y1");
    check_base_class_offset(lv, (B1*)(C31*)(E31x12*), ABISELECT(56,36), "G31x12y1");
    check_base_class_offset(lv, (C31*)(E31x12*), ABISELECT(16,12), "G31x12y1");
    check_base_class_offset(lv, (D0*)(E31x12*), ABISELECT(28,20), "G31x12y1");
    check_base_class_offset(lv, (E31x12*), ABISELECT(16,12), "G31x12y1");
    check_base_class_offset(lv, (F1*), 0, "G31x12y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x12y1.ff");
    test_class_info(&lv, &cd_G31x12y1);
    dp->~G31x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x12y1(Test_G31x12y1, "G31x12y1", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G31x12y1C1Ev();
extern void _ZN8G31x12y1D1Ev();
Name_Map name_map_G31x12y1[] = {
  NSPAIR(_ZN8G31x12y1C1Ev),
  NSPAIR(_ZN8G31x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x12;
extern VTBL_ENTRY _ZTI6E31x12[];
extern  VTBL_ENTRY _ZTV6E31x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x12y1[] = {
  // 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_E31x12,    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 _ZTI8G31x12y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E31x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn16_N6E31x123fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn24_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x12y1[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x12y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(40,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G31x12y1[0]),
  (VTBL_ENTRY)&_ZN6E31x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G31x12y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G31x12y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
extern VTBL_ENTRY _ZTV8G31x12y1[];
extern void _ZN6E31x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x12__8G31x12y1[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&_ZN6E31x123fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C316E31x12__8G31x12y1[] = {
  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__3C316E31x12__8G31x12y1[] = {
  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__3C316E31x12__8G31x12y1[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn16_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x12__8G31x12y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn24_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x12__8G31x12y1[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
static  VTT_ENTRY vtt_G31x12y1[] = {
  {&(_ZTV8G31x12y1[5]),  5,20},
  {&(_ZTV8G31x12y1[11]),  11,20},
  {&(_ZTV8G31x12y1[15]),  15,20},
  {&(_ZTV8G31x12y1[19]),  19,20},
  {&(_tg__ZTV6E31x12__8G31x12y1[4]),  4,5},
  {&(_tg__ZTV3C316E31x12__8G31x12y1[4]),  4,5},
  {&(_tg__ZTV2A1__3C316E31x12__8G31x12y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C316E31x12__8G31x12y1[3]),  3,4},
  {&(_tg__ZTV2A1__6E31x12__8G31x12y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x12__8G31x12y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x12y1[];
extern  VTBL_ENTRY _ZTV8G31x12y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x12y1[];
static VTBL_ENTRY alt_thunk_names127[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn24_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn16_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn24_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn16_N6E31x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x12y1 = {  "G31x12y1", // class name
  bases_G31x12y1, 6,
  &(vtc_G31x12y1[0]), // expected_vtbl_contents
  &(vtt_G31x12y1[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G31x12y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x12y1),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x12y1),10, //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  G31x12y2  : E31x12 , virtual F1 {
  int ff;
  ~G31x12y2(); // tgen
  G31x12y2(); // tgen
};
//SIG(1 G31x12y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G31x12y2 ::~G31x12y2(){ note_dtor("G31x12y2", this);} // tgen
G31x12y2 ::G31x12y2(){ note_ctor("G31x12y2", this);} // tgen

static void Test_G31x12y2()
{
  extern Class_Descriptor cd_G31x12y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x12y2, buf);
    G31x12y2 *dp, &lv = *(dp=new (buf) G31x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x12y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x12y2)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x12*), ABISELECT(24,20), "G31x12y2");
    check_base_class_offset(lv, (B1*)(C31*)(E31x12*), ABISELECT(40,28), "G31x12y2");
    check_base_class_offset(lv, (C31*)(E31x12*), 0, "G31x12y2");
    check_base_class_offset(lv, (D0*)(E31x12*), ABISELECT(12,8), "G31x12y2");
    check_base_class_offset(lv, (E31x12*), 0, "G31x12y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G31x12y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G31x12y2.ff");
    test_class_info(&lv, &cd_G31x12y2);
    dp->~G31x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x12y2(Test_G31x12y2, "G31x12y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G31x12y2C1Ev();
extern void _ZN8G31x12y2D1Ev();
Name_Map name_map_G31x12y2[] = {
  NSPAIR(_ZN8G31x12y2C1Ev),
  NSPAIR(_ZN8G31x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x12;
extern VTBL_ENTRY _ZTI6E31x12[];
extern  VTBL_ENTRY _ZTV6E31x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x12y2[] = {
  // 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_E31x12,    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 _ZTI8G31x12y2[];
extern void _ZN6E31x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn20_N6E31x123fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn28_N6E31x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G31x12y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x12y2[0]),
  (VTBL_ENTRY)&_ZN6E31x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G31x12y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G31x12y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G31x12y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G31x12y2[];
extern void _ZN6E31x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x12__8G31x12y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&_ZN6E31x123fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C316E31x12__8G31x12y2[] = {
  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__3C316E31x12__8G31x12y2[] = {
  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__3C316E31x12__8G31x12y2[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn20_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x12__8G31x12y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn28_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x12__8G31x12y2[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
static  VTT_ENTRY vtt_G31x12y2[] = {
  {&(_ZTV8G31x12y2[5]),  5,18},
  {&(_tg__ZTV6E31x12__8G31x12y2[4]),  4,5},
  {&(_tg__ZTV3C316E31x12__8G31x12y2[4]),  4,5},
  {&(_tg__ZTV2A1__3C316E31x12__8G31x12y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C316E31x12__8G31x12y2[3]),  3,4},
  {&(_tg__ZTV2A1__6E31x12__8G31x12y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x12__8G31x12y2[3]),  3,4},
  {&(_ZTV8G31x12y2[9]),  9,18},
  {&(_ZTV8G31x12y2[13]),  13,18},
  {&(_ZTV8G31x12y2[17]),  17,18},
};
extern VTBL_ENTRY _ZTI8G31x12y2[];
extern  VTBL_ENTRY _ZTV8G31x12y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x12y2[];
static VTBL_ENTRY alt_thunk_names128[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn28_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn20_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn28_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn20_N6E31x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x12y2 = {  "G31x12y2", // class name
  bases_G31x12y2, 6,
  &(vtc_G31x12y2[0]), // expected_vtbl_contents
  &(vtt_G31x12y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G31x12y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x12y2),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x12y2),10, //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  G31x12y3  : virtual E31x12 , virtual F1 {
  int ff;
  ~G31x12y3(); // tgen
  G31x12y3(); // tgen
};
//SIG(1 G31x12y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G31x12y3 ::~G31x12y3(){ note_dtor("G31x12y3", this);} // tgen
G31x12y3 ::G31x12y3(){ note_ctor("G31x12y3", this);} // tgen

static void Test_G31x12y3()
{
  extern Class_Descriptor cd_G31x12y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G31x12y3, buf);
    G31x12y3 *dp, &lv = *(dp=new (buf) G31x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G31x12y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x12y3)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x12*), ABISELECT(40,24), "G31x12y3");
    check_base_class_offset(lv, (B1*)(C31*)(E31x12*), ABISELECT(56,32), "G31x12y3");
    check_base_class_offset(lv, (C31*)(E31x12*), ABISELECT(16,8), "G31x12y3");
    check_base_class_offset(lv, (D0*)(E31x12*), ABISELECT(28,16), "G31x12y3");
    check_base_class_offset(lv, (E31x12*), ABISELECT(16,8), "G31x12y3");
    check_base_class_offset(lv, (F1*), ABISELECT(72,40), "G31x12y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G31x12y3.ff");
    test_class_info(&lv, &cd_G31x12y3);
    dp->~G31x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x12y3(Test_G31x12y3, "G31x12y3", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN8G31x12y3C1Ev();
extern void _ZN8G31x12y3D1Ev();
Name_Map name_map_G31x12y3[] = {
  NSPAIR(_ZN8G31x12y3C1Ev),
  NSPAIR(_ZN8G31x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x12;
extern VTBL_ENTRY _ZTI6E31x12[];
extern  VTBL_ENTRY _ZTV6E31x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x12[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x12y3[] = {
  // 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_E31x12,    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 _ZTI8G31x12y3[];
extern void _ZN6E31x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn16_N6E31x123fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn24_N6E31x123fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G31x12y3[] = {
  ABISELECT(72,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x12y3[0]),
  0,
  ABISELECT(40,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G31x12y3[0]),
  (VTBL_ENTRY)&_ZN6E31x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G31x12y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI8G31x12y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
  0,
  ABISELECT(-72,-40),
  (VTBL_ENTRY)&(_ZTI8G31x12y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G31x12y3[];
extern void _ZN6E31x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x12__8G31x12y3[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&_ZN6E31x123fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C316E31x12__8G31x12y3[] = {
  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__3C316E31x12__8G31x12y3[] = {
  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__3C316E31x12__8G31x12y3[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn16_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x12__8G31x12y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn24_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x12__8G31x12y3[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
static  VTT_ENTRY vtt_G31x12y3[] = {
  {&(_ZTV8G31x12y3[6]),  6,24},
  {&(_ZTV8G31x12y3[11]),  11,24},
  {&(_ZTV8G31x12y3[15]),  15,24},
  {&(_ZTV8G31x12y3[19]),  19,24},
  {&(_ZTV8G31x12y3[23]),  23,24},
  {&(_tg__ZTV6E31x12__8G31x12y3[4]),  4,5},
  {&(_tg__ZTV3C316E31x12__8G31x12y3[4]),  4,5},
  {&(_tg__ZTV2A1__3C316E31x12__8G31x12y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C316E31x12__8G31x12y3[3]),  3,4},
  {&(_tg__ZTV2A1__6E31x12__8G31x12y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x12__8G31x12y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x12y3[];
extern  VTBL_ENTRY _ZTV8G31x12y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x12y3[];
static VTBL_ENTRY alt_thunk_names129[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn24_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn16_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn24_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn16_N6E31x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x12y3 = {  "G31x12y3", // class name
  bases_G31x12y3, 6,
  &(vtc_G31x12y3[0]), // expected_vtbl_contents
  &(vtt_G31x12y3[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI8G31x12y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x12y3),24, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x12y3),11, //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  G31x12y4  : E31x12 , F0 {
  int ff;
  ~G31x12y4(); // tgen
  G31x12y4(); // tgen
};
//SIG(1 G31x12y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G31x12y4 ::~G31x12y4(){ note_dtor("G31x12y4", this);} // tgen
G31x12y4 ::G31x12y4(){ note_ctor("G31x12y4", this);} // tgen

static void Test_G31x12y4()
{
  extern Class_Descriptor cd_G31x12y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G31x12y4, buf);
    G31x12y4 *dp, &lv = *(dp=new (buf) G31x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G31x12y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x12y4)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x12*), ABISELECT(32,24), "G31x12y4");
    check_base_class_offset(lv, (B1*)(C31*)(E31x12*), ABISELECT(48,32), "G31x12y4");
    check_base_class_offset(lv, (C31*)(E31x12*), 0, "G31x12y4");
    check_base_class_offset(lv, (D0*)(E31x12*), ABISELECT(12,8), "G31x12y4");
    check_base_class_offset(lv, (E31x12*), 0, "G31x12y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G31x12y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G31x12y4.ff");
    test_class_info(&lv, &cd_G31x12y4);
    dp->~G31x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x12y4(Test_G31x12y4, "G31x12y4", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G31x12y4C1Ev();
extern void _ZN8G31x12y4D1Ev();
Name_Map name_map_G31x12y4[] = {
  NSPAIR(_ZN8G31x12y4C1Ev),
  NSPAIR(_ZN8G31x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x12;
extern VTBL_ENTRY _ZTI6E31x12[];
extern  VTBL_ENTRY _ZTV6E31x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x12y4[] = {
  // 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_E31x12,    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 _ZTI8G31x12y4[];
extern void _ZN6E31x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn32_N6E31x123fooEv,_ZThn24_N6E31x123fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn48_N6E31x123fooEv,_ZThn32_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x12y4[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x12y4[0]),
  (VTBL_ENTRY)&_ZN6E31x123fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G31x12y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G31x12y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
extern VTBL_ENTRY _ZTV8G31x12y4[];
extern void _ZN6E31x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x12__8G31x12y4[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&_ZN6E31x123fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C316E31x12__8G31x12y4[] = {
  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__3C316E31x12__8G31x12y4[] = {
  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__3C316E31x12__8G31x12y4[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn32_N6E31x123fooEv,_ZThn24_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x12__8G31x12y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn48_N6E31x123fooEv,_ZThn32_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x12__8G31x12y4[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
static  VTT_ENTRY vtt_G31x12y4[] = {
  {&(_ZTV8G31x12y4[4]),  4,13},
  {&(_tg__ZTV6E31x12__8G31x12y4[4]),  4,5},
  {&(_tg__ZTV3C316E31x12__8G31x12y4[4]),  4,5},
  {&(_tg__ZTV2A1__3C316E31x12__8G31x12y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C316E31x12__8G31x12y4[3]),  3,4},
  {&(_tg__ZTV2A1__6E31x12__8G31x12y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x12__8G31x12y4[3]),  3,4},
  {&(_ZTV8G31x12y4[8]),  8,13},
  {&(_ZTV8G31x12y4[12]),  12,13},
};
extern VTBL_ENTRY _ZTI8G31x12y4[];
extern  VTBL_ENTRY _ZTV8G31x12y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x12y4[];
static VTBL_ENTRY alt_thunk_names130[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N3C313fooEv,_ZThn32_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn24_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x123fooEv,_ZThn32_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x123fooEv,_ZThn24_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x123fooEv,_ZThn32_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x123fooEv,_ZThn24_N6E31x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x12y4 = {  "G31x12y4", // class name
  bases_G31x12y4, 6,
  &(vtc_G31x12y4[0]), // expected_vtbl_contents
  &(vtt_G31x12y4[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G31x12y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x12y4),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x12y4),9, //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  G31x12y5  : virtual E31x12 , F0 {
  int ff;
  ~G31x12y5(); // tgen
  G31x12y5(); // tgen
};
//SIG(1 G31x12y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G31x12y5 ::~G31x12y5(){ note_dtor("G31x12y5", this);} // tgen
G31x12y5 ::G31x12y5(){ note_ctor("G31x12y5", this);} // tgen

static void Test_G31x12y5()
{
  extern Class_Descriptor cd_G31x12y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x12y5, buf);
    G31x12y5 *dp, &lv = *(dp=new (buf) G31x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x12y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x12y5)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x12*), ABISELECT(40,28), "G31x12y5");
    check_base_class_offset(lv, (B1*)(C31*)(E31x12*), ABISELECT(56,36), "G31x12y5");
    check_base_class_offset(lv, (C31*)(E31x12*), ABISELECT(16,12), "G31x12y5");
    check_base_class_offset(lv, (D0*)(E31x12*), ABISELECT(28,20), "G31x12y5");
    check_base_class_offset(lv, (E31x12*), ABISELECT(16,12), "G31x12y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G31x12y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x12y5.ff");
    test_class_info(&lv, &cd_G31x12y5);
    dp->~G31x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x12y5(Test_G31x12y5, "G31x12y5", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G31x12y5C1Ev();
extern void _ZN8G31x12y5D1Ev();
Name_Map name_map_G31x12y5[] = {
  NSPAIR(_ZN8G31x12y5C1Ev),
  NSPAIR(_ZN8G31x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x12;
extern VTBL_ENTRY _ZTI6E31x12[];
extern  VTBL_ENTRY _ZTV6E31x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x12y5[] = {
  // 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_E31x12,    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 _ZTI8G31x12y5[];
extern void _ZN6E31x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn16_N6E31x123fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn24_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x12y5[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x12y5[0]),
  0,
  ABISELECT(40,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G31x12y5[0]),
  (VTBL_ENTRY)&_ZN6E31x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G31x12y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G31x12y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
extern VTBL_ENTRY _ZTV8G31x12y5[];
extern void _ZN6E31x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x12__8G31x12y5[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&_ZN6E31x123fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C316E31x12__8G31x12y5[] = {
  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__3C316E31x12__8G31x12y5[] = {
  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__3C316E31x12__8G31x12y5[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn16_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x12__8G31x12y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn24_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x12__8G31x12y5[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
static  VTT_ENTRY vtt_G31x12y5[] = {
  {&(_ZTV8G31x12y5[5]),  5,19},
  {&(_ZTV8G31x12y5[10]),  10,19},
  {&(_ZTV8G31x12y5[14]),  14,19},
  {&(_ZTV8G31x12y5[18]),  18,19},
  {&(_tg__ZTV6E31x12__8G31x12y5[4]),  4,5},
  {&(_tg__ZTV3C316E31x12__8G31x12y5[4]),  4,5},
  {&(_tg__ZTV2A1__3C316E31x12__8G31x12y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C316E31x12__8G31x12y5[3]),  3,4},
  {&(_tg__ZTV2A1__6E31x12__8G31x12y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x12__8G31x12y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x12y5[];
extern  VTBL_ENTRY _ZTV8G31x12y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x12y5[];
static VTBL_ENTRY alt_thunk_names131[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn24_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn16_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn24_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn16_N6E31x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x12y5 = {  "G31x12y5", // class name
  bases_G31x12y5, 6,
  &(vtc_G31x12y5[0]), // expected_vtbl_contents
  &(vtt_G31x12y5[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G31x12y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x12y5),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x12y5),10, //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  G31x12y6  : E31x12 , virtual F0 {
  int ff;
  ~G31x12y6(); // tgen
  G31x12y6(); // tgen
};
//SIG(1 G31x12y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G31x12y6 ::~G31x12y6(){ note_dtor("G31x12y6", this);} // tgen
G31x12y6 ::G31x12y6(){ note_ctor("G31x12y6", this);} // tgen

static void Test_G31x12y6()
{
  extern Class_Descriptor cd_G31x12y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G31x12y6, buf);
    G31x12y6 *dp, &lv = *(dp=new (buf) G31x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G31x12y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x12y6)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x12*), ABISELECT(24,20), "G31x12y6");
    check_base_class_offset(lv, (B1*)(C31*)(E31x12*), ABISELECT(40,28), "G31x12y6");
    check_base_class_offset(lv, (C31*)(E31x12*), 0, "G31x12y6");
    check_base_class_offset(lv, (D0*)(E31x12*), ABISELECT(12,8), "G31x12y6");
    check_base_class_offset(lv, (E31x12*), 0, "G31x12y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G31x12y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G31x12y6.ff");
    test_class_info(&lv, &cd_G31x12y6);
    dp->~G31x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x12y6(Test_G31x12y6, "G31x12y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G31x12y6C1Ev();
extern void _ZN8G31x12y6D1Ev();
Name_Map name_map_G31x12y6[] = {
  NSPAIR(_ZN8G31x12y6C1Ev),
  NSPAIR(_ZN8G31x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x12;
extern VTBL_ENTRY _ZTI6E31x12[];
extern  VTBL_ENTRY _ZTV6E31x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x12y6[] = {
  // 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_E31x12,    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 _ZTI8G31x12y6[];
extern void _ZN6E31x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn20_N6E31x123fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn28_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x12y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x12y6[0]),
  (VTBL_ENTRY)&_ZN6E31x123fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G31x12y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G31x12y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
extern VTBL_ENTRY _ZTV8G31x12y6[];
extern void _ZN6E31x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x12__8G31x12y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&_ZN6E31x123fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C316E31x12__8G31x12y6[] = {
  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__3C316E31x12__8G31x12y6[] = {
  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__3C316E31x12__8G31x12y6[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn20_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x12__8G31x12y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn28_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x12__8G31x12y6[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
static  VTT_ENTRY vtt_G31x12y6[] = {
  {&(_ZTV8G31x12y6[5]),  5,14},
  {&(_tg__ZTV6E31x12__8G31x12y6[4]),  4,5},
  {&(_tg__ZTV3C316E31x12__8G31x12y6[4]),  4,5},
  {&(_tg__ZTV2A1__3C316E31x12__8G31x12y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C316E31x12__8G31x12y6[3]),  3,4},
  {&(_tg__ZTV2A1__6E31x12__8G31x12y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x12__8G31x12y6[3]),  3,4},
  {&(_ZTV8G31x12y6[9]),  9,14},
  {&(_ZTV8G31x12y6[13]),  13,14},
};
extern VTBL_ENTRY _ZTI8G31x12y6[];
extern  VTBL_ENTRY _ZTV8G31x12y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x12y6[];
static VTBL_ENTRY alt_thunk_names132[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn28_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn20_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn28_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn20_N6E31x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x12y6 = {  "G31x12y6", // class name
  bases_G31x12y6, 6,
  &(vtc_G31x12y6[0]), // expected_vtbl_contents
  &(vtt_G31x12y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G31x12y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x12y6),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x12y6),9, //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  G31x12y7  : virtual E31x12 , virtual F0 {
  int ff;
  ~G31x12y7(); // tgen
  G31x12y7(); // tgen
};
//SIG(1 G31x12y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G31x12y7 ::~G31x12y7(){ note_dtor("G31x12y7", this);} // tgen
G31x12y7 ::G31x12y7(){ note_ctor("G31x12y7", this);} // tgen

static void Test_G31x12y7()
{
  extern Class_Descriptor cd_G31x12y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x12y7, buf);
    G31x12y7 *dp, &lv = *(dp=new (buf) G31x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x12y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x12y7)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x12*), ABISELECT(40,24), "G31x12y7");
    check_base_class_offset(lv, (B1*)(C31*)(E31x12*), ABISELECT(56,32), "G31x12y7");
    check_base_class_offset(lv, (C31*)(E31x12*), ABISELECT(16,8), "G31x12y7");
    check_base_class_offset(lv, (D0*)(E31x12*), ABISELECT(28,16), "G31x12y7");
    check_base_class_offset(lv, (E31x12*), ABISELECT(16,8), "G31x12y7");
    check_base_class_offset(lv, (F0*), ABISELECT(68,40), "G31x12y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G31x12y7.ff");
    test_class_info(&lv, &cd_G31x12y7);
    dp->~G31x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x12y7(Test_G31x12y7, "G31x12y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G31x12y7C1Ev();
extern void _ZN8G31x12y7D1Ev();
Name_Map name_map_G31x12y7[] = {
  NSPAIR(_ZN8G31x12y7C1Ev),
  NSPAIR(_ZN8G31x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x12;
extern VTBL_ENTRY _ZTI6E31x12[];
extern  VTBL_ENTRY _ZTV6E31x12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x12[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x12y7[] = {
  // 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_E31x12,    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 _ZTI8G31x12y7[];
extern void _ZN6E31x123fooEv();
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn16_N6E31x123fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn24_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x12y7[] = {
  ABISELECT(68,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x12y7[0]),
  0,
  ABISELECT(40,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G31x12y7[0]),
  (VTBL_ENTRY)&_ZN6E31x123fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G31x12y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI8G31x12y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
extern VTBL_ENTRY _ZTV8G31x12y7[];
extern void _ZN6E31x123fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x12__8G31x12y7[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&_ZN6E31x123fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C316E31x12__8G31x12y7[] = {
  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__3C316E31x12__8G31x12y7[] = {
  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__3C316E31x12__8G31x12y7[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn16_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x12__8G31x12y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv)();
extern void ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn24_N6E31x123fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x12__8G31x12y7[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E31x12[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv),
};
static  VTT_ENTRY vtt_G31x12y7[] = {
  {&(_ZTV8G31x12y7[6]),  6,20},
  {&(_ZTV8G31x12y7[11]),  11,20},
  {&(_ZTV8G31x12y7[15]),  15,20},
  {&(_ZTV8G31x12y7[19]),  19,20},
  {&(_tg__ZTV6E31x12__8G31x12y7[4]),  4,5},
  {&(_tg__ZTV3C316E31x12__8G31x12y7[4]),  4,5},
  {&(_tg__ZTV2A1__3C316E31x12__8G31x12y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C316E31x12__8G31x12y7[3]),  3,4},
  {&(_tg__ZTV2A1__6E31x12__8G31x12y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x12__8G31x12y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x12y7[];
extern  VTBL_ENTRY _ZTV8G31x12y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x12y7[];
static VTBL_ENTRY alt_thunk_names133[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x123fooEv,_ZTv0_n12_N6E31x123fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn24_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn16_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x123fooEv,_ZThn24_N6E31x123fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x123fooEv,_ZThn16_N6E31x123fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x12y7 = {  "G31x12y7", // class name
  bases_G31x12y7, 6,
  &(vtc_G31x12y7[0]), // expected_vtbl_contents
  &(vtt_G31x12y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G31x12y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x12y7),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x12y7),10, //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  E0x13  : virtual C0 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E0x133fooEv
  ~E0x13(); // tgen
  E0x13(); // tgen
};
//SIG(-1 E0x13) C1{ VBC2{ BC3{ Fi} BC4{ Fi} Fi} BC5{ Fi} v1 Fi}


void  E0x13 ::foo(){vfunc_called(this, "_ZN5E0x133fooEv");}
E0x13 ::~E0x13(){ note_dtor("E0x13", this);} // tgen
E0x13 ::E0x13(){ note_ctor("E0x13", this);} // tgen

static void Test_E0x13()
{
  extern Class_Descriptor cd_E0x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E0x13, buf);
    E0x13 *dp, &lv = *(dp=new (buf) E0x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E0x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E0x13)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(16,12), "E0x13");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(20,16), "E0x13");
    check_base_class_offset(lv, (C0*), ABISELECT(16,12), "E0x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E0x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E0x13.fd");
    test_class_info(&lv, &cd_E0x13);
    dp->~E0x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE0x13(Test_E0x13, "E0x13", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E0x13C1Ev();
extern void _ZN5E0x13D1Ev();
Name_Map name_map_E0x13[] = {
  NSPAIR(_ZN5E0x13C1Ev),
  NSPAIR(_ZN5E0x13D1Ev),
  {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_E0x13[] = {
  // 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 _ZTI5E0x13[];
extern void _ZN5E0x133fooEv();
static  VTBL_ENTRY vtc_E0x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x13[0]),
  (VTBL_ENTRY)&_ZN5E0x133fooEv,
};
extern VTBL_ENTRY _ZTV5E0x13[];
static  VTT_ENTRY vtt_E0x13[] = {
  {&(_ZTV5E0x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E0x13[];
extern  VTBL_ENTRY _ZTV5E0x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x13[];
Class_Descriptor cd_E0x13 = {  "E0x13", // class name
  bases_E0x13, 4,
  &(vtc_E0x13[0]), // expected_vtbl_contents
  &(vtt_E0x13[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E0x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E0x13),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E0x13),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  G0x13y0  : E0x13 , F1 {
  int ff;
  ~G0x13y0(); // tgen
  G0x13y0(); // tgen
};
//SIG(1 G0x13y0) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G0x13y0 ::~G0x13y0(){ note_dtor("G0x13y0", this);} // tgen
G0x13y0 ::G0x13y0(){ note_ctor("G0x13y0", this);} // tgen

static void Test_G0x13y0()
{
  extern Class_Descriptor cd_G0x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x13y0, buf);
    G0x13y0 *dp, &lv = *(dp=new (buf) G0x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x13y0)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(32,24), "G0x13y0");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(36,28), "G0x13y0");
    check_base_class_offset(lv, (C0*)(E0x13*), ABISELECT(32,24), "G0x13y0");
    check_base_class_offset(lv, (D0*)(E0x13*), ABISELECT(8,4), "G0x13y0");
    check_base_class_offset(lv, (E0x13*), 0, "G0x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G0x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G0x13y0.ff");
    test_class_info(&lv, &cd_G0x13y0);
    dp->~G0x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x13y0(Test_G0x13y0, "G0x13y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x13y0C1Ev();
extern void _ZN7G0x13y0D1Ev();
Name_Map name_map_G0x13y0[] = {
  NSPAIR(_ZN7G0x13y0C1Ev),
  NSPAIR(_ZN7G0x13y0D1Ev),
  {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_E0x13;
extern VTBL_ENTRY _ZTI5E0x13[];
extern  VTBL_ENTRY _ZTV5E0x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x13y0[] = {
  // 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_E0x13,    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
    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 _ZTI7G0x13y0[];
extern void _ZN5E0x133fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x13y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x13y0[0]),
  (VTBL_ENTRY)&_ZN5E0x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G0x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G0x13y0[];
extern void _ZN5E0x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x13__7G0x13y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x13[0]),
  (VTBL_ENTRY)&_ZN5E0x133fooEv,
};
static  VTT_ENTRY vtt_G0x13y0[] = {
  {&(_ZTV7G0x13y0[3]),  3,7},
  {&(_tg__ZTV5E0x13__7G0x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G0x13y0[];
extern  VTBL_ENTRY _ZTV7G0x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x13y0[];
Class_Descriptor cd_G0x13y0 = {  "G0x13y0", // class name
  bases_G0x13y0, 6,
  &(vtc_G0x13y0[0]), // expected_vtbl_contents
  &(vtt_G0x13y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x13y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x13y0),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  G0x13y1  : virtual E0x13 , F1 {
  int ff;
  ~G0x13y1(); // tgen
  G0x13y1(); // tgen
};
//SIG(1 G0x13y1) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G0x13y1 ::~G0x13y1(){ note_dtor("G0x13y1", this);} // tgen
G0x13y1 ::G0x13y1(){ note_ctor("G0x13y1", this);} // tgen

static void Test_G0x13y1()
{
  extern Class_Descriptor cd_G0x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x13y1, buf);
    G0x13y1 *dp, &lv = *(dp=new (buf) G0x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x13y1)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(32,24), "G0x13y1");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(36,28), "G0x13y1");
    check_base_class_offset(lv, (C0*)(E0x13*), ABISELECT(32,24), "G0x13y1");
    check_base_class_offset(lv, (D0*)(E0x13*), ABISELECT(24,16), "G0x13y1");
    check_base_class_offset(lv, (E0x13*), ABISELECT(16,12), "G0x13y1");
    check_base_class_offset(lv, (F1*), 0, "G0x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x13y1.ff");
    test_class_info(&lv, &cd_G0x13y1);
    dp->~G0x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x13y1(Test_G0x13y1, "G0x13y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x13y1C1Ev();
extern void _ZN7G0x13y1D1Ev();
Name_Map name_map_G0x13y1[] = {
  NSPAIR(_ZN7G0x13y1C1Ev),
  NSPAIR(_ZN7G0x13y1D1Ev),
  {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_E0x13;
extern VTBL_ENTRY _ZTI5E0x13[];
extern  VTBL_ENTRY _ZTV5E0x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x13y1[] = {
  // 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_E0x13,    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_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 _ZTI7G0x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E0x133fooEv();
static  VTBL_ENTRY vtc_G0x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G0x13y1[0]),
  (VTBL_ENTRY)&_ZN5E0x133fooEv,
};
extern VTBL_ENTRY _ZTV7G0x13y1[];
extern void _ZN5E0x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x13__7G0x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x13[0]),
  (VTBL_ENTRY)&_ZN5E0x133fooEv,
};
static  VTT_ENTRY vtt_G0x13y1[] = {
  {&(_ZTV7G0x13y1[4]),  4,10},
  {&(_ZTV7G0x13y1[9]),  9,10},
  {&(_tg__ZTV5E0x13__7G0x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G0x13y1[];
extern  VTBL_ENTRY _ZTV7G0x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x13y1[];
Class_Descriptor cd_G0x13y1 = {  "G0x13y1", // class name
  bases_G0x13y1, 6,
  &(vtc_G0x13y1[0]), // expected_vtbl_contents
  &(vtt_G0x13y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x13y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x13y1),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  G0x13y2  : E0x13 , virtual F1 {
  int ff;
  ~G0x13y2(); // tgen
  G0x13y2(); // tgen
};
//SIG(1 G0x13y2) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G0x13y2 ::~G0x13y2(){ note_dtor("G0x13y2", this);} // tgen
G0x13y2 ::G0x13y2(){ note_ctor("G0x13y2", this);} // tgen

static void Test_G0x13y2()
{
  extern Class_Descriptor cd_G0x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x13y2, buf);
    G0x13y2 *dp, &lv = *(dp=new (buf) G0x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x13y2)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(20,16), "G0x13y2");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(24,20), "G0x13y2");
    check_base_class_offset(lv, (C0*)(E0x13*), ABISELECT(20,16), "G0x13y2");
    check_base_class_offset(lv, (D0*)(E0x13*), ABISELECT(8,4), "G0x13y2");
    check_base_class_offset(lv, (E0x13*), 0, "G0x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G0x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G0x13y2.ff");
    test_class_info(&lv, &cd_G0x13y2);
    dp->~G0x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x13y2(Test_G0x13y2, "G0x13y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x13y2C1Ev();
extern void _ZN7G0x13y2D1Ev();
Name_Map name_map_G0x13y2[] = {
  NSPAIR(_ZN7G0x13y2C1Ev),
  NSPAIR(_ZN7G0x13y2D1Ev),
  {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_E0x13;
extern VTBL_ENTRY _ZTI5E0x13[];
extern  VTBL_ENTRY _ZTV5E0x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x13y2[] = {
  // 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_E0x13,    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
    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 _ZTI7G0x13y2[];
extern void _ZN5E0x133fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x13y2[] = {
  ABISELECT(32,28),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x13y2[0]),
  (VTBL_ENTRY)&_ZN5E0x133fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G0x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G0x13y2[];
extern void _ZN5E0x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x13__7G0x13y2[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x13[0]),
  (VTBL_ENTRY)&_ZN5E0x133fooEv,
};
static  VTT_ENTRY vtt_G0x13y2[] = {
  {&(_ZTV7G0x13y2[4]),  4,9},
  {&(_tg__ZTV5E0x13__7G0x13y2[3]),  3,4},
  {&(_ZTV7G0x13y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G0x13y2[];
extern  VTBL_ENTRY _ZTV7G0x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x13y2[];
Class_Descriptor cd_G0x13y2 = {  "G0x13y2", // class name
  bases_G0x13y2, 6,
  &(vtc_G0x13y2[0]), // expected_vtbl_contents
  &(vtt_G0x13y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x13y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x13y2),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  G0x13y3  : virtual E0x13 , virtual F1 {
  int ff;
  ~G0x13y3(); // tgen
  G0x13y3(); // tgen
};
//SIG(1 G0x13y3) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G0x13y3 ::~G0x13y3(){ note_dtor("G0x13y3", this);} // tgen
G0x13y3 ::G0x13y3(){ note_ctor("G0x13y3", this);} // tgen

static void Test_G0x13y3()
{
  extern Class_Descriptor cd_G0x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G0x13y3, buf);
    G0x13y3 *dp, &lv = *(dp=new (buf) G0x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G0x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x13y3)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(32,20), "G0x13y3");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(36,24), "G0x13y3");
    check_base_class_offset(lv, (C0*)(E0x13*), ABISELECT(32,20), "G0x13y3");
    check_base_class_offset(lv, (D0*)(E0x13*), ABISELECT(24,12), "G0x13y3");
    check_base_class_offset(lv, (E0x13*), ABISELECT(16,8), "G0x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G0x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G0x13y3.ff");
    test_class_info(&lv, &cd_G0x13y3);
    dp->~G0x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x13y3(Test_G0x13y3, "G0x13y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G0x13y3C1Ev();
extern void _ZN7G0x13y3D1Ev();
Name_Map name_map_G0x13y3[] = {
  NSPAIR(_ZN7G0x13y3C1Ev),
  NSPAIR(_ZN7G0x13y3D1Ev),
  {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_E0x13;
extern VTBL_ENTRY _ZTI5E0x13[];
extern  VTBL_ENTRY _ZTV5E0x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x13y3[] = {
  // 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_E0x13,    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
    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 _ZTI7G0x13y3[];
extern void _ZN5E0x133fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x13y3[] = {
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x13y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G0x13y3[0]),
  (VTBL_ENTRY)&_ZN5E0x133fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G0x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G0x13y3[];
extern void _ZN5E0x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x13__7G0x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x13[0]),
  (VTBL_ENTRY)&_ZN5E0x133fooEv,
};
static  VTT_ENTRY vtt_G0x13y3[] = {
  {&(_ZTV7G0x13y3[5]),  5,14},
  {&(_ZTV7G0x13y3[9]),  9,14},
  {&(_ZTV7G0x13y3[13]),  13,14},
  {&(_tg__ZTV5E0x13__7G0x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G0x13y3[];
extern  VTBL_ENTRY _ZTV7G0x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x13y3[];
Class_Descriptor cd_G0x13y3 = {  "G0x13y3", // class name
  bases_G0x13y3, 6,
  &(vtc_G0x13y3[0]), // expected_vtbl_contents
  &(vtt_G0x13y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G0x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x13y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x13y3),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  G0x13y4  : E0x13 , F0 {
  int ff;
  ~G0x13y4(); // tgen
  G0x13y4(); // tgen
};
//SIG(1 G0x13y4) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G0x13y4 ::~G0x13y4(){ note_dtor("G0x13y4", this);} // tgen
G0x13y4 ::G0x13y4(){ note_ctor("G0x13y4", this);} // tgen

static void Test_G0x13y4()
{
  extern Class_Descriptor cd_G0x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G0x13y4, buf);
    G0x13y4 *dp, &lv = *(dp=new (buf) G0x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G0x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x13y4)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(24,20), "G0x13y4");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(28,24), "G0x13y4");
    check_base_class_offset(lv, (C0*)(E0x13*), ABISELECT(24,20), "G0x13y4");
    check_base_class_offset(lv, (D0*)(E0x13*), ABISELECT(8,4), "G0x13y4");
    check_base_class_offset(lv, (E0x13*), 0, "G0x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G0x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G0x13y4.ff");
    test_class_info(&lv, &cd_G0x13y4);
    dp->~G0x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x13y4(Test_G0x13y4, "G0x13y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G0x13y4C1Ev();
extern void _ZN7G0x13y4D1Ev();
Name_Map name_map_G0x13y4[] = {
  NSPAIR(_ZN7G0x13y4C1Ev),
  NSPAIR(_ZN7G0x13y4D1Ev),
  {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_E0x13;
extern VTBL_ENTRY _ZTI5E0x13[];
extern  VTBL_ENTRY _ZTV5E0x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x13y4[] = {
  // 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_E0x13,    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 _ZTI7G0x13y4[];
extern void _ZN5E0x133fooEv();
static  VTBL_ENTRY vtc_G0x13y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x13y4[0]),
  (VTBL_ENTRY)&_ZN5E0x133fooEv,
};
extern VTBL_ENTRY _ZTV7G0x13y4[];
extern void _ZN5E0x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x13__7G0x13y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x13[0]),
  (VTBL_ENTRY)&_ZN5E0x133fooEv,
};
static  VTT_ENTRY vtt_G0x13y4[] = {
  {&(_ZTV7G0x13y4[3]),  3,4},
  {&(_tg__ZTV5E0x13__7G0x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G0x13y4[];
extern  VTBL_ENTRY _ZTV7G0x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x13y4[];
Class_Descriptor cd_G0x13y4 = {  "G0x13y4", // class name
  bases_G0x13y4, 6,
  &(vtc_G0x13y4[0]), // expected_vtbl_contents
  &(vtt_G0x13y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G0x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x13y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x13y4),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  G0x13y5  : virtual E0x13 , F0 {
  int ff;
  ~G0x13y5(); // tgen
  G0x13y5(); // tgen
};
//SIG(1 G0x13y5) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G0x13y5 ::~G0x13y5(){ note_dtor("G0x13y5", this);} // tgen
G0x13y5 ::G0x13y5(){ note_ctor("G0x13y5", this);} // tgen

static void Test_G0x13y5()
{
  extern Class_Descriptor cd_G0x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x13y5, buf);
    G0x13y5 *dp, &lv = *(dp=new (buf) G0x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x13y5)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(32,24), "G0x13y5");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(36,28), "G0x13y5");
    check_base_class_offset(lv, (C0*)(E0x13*), ABISELECT(32,24), "G0x13y5");
    check_base_class_offset(lv, (D0*)(E0x13*), ABISELECT(24,16), "G0x13y5");
    check_base_class_offset(lv, (E0x13*), ABISELECT(16,12), "G0x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G0x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x13y5.ff");
    test_class_info(&lv, &cd_G0x13y5);
    dp->~G0x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x13y5(Test_G0x13y5, "G0x13y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x13y5C1Ev();
extern void _ZN7G0x13y5D1Ev();
Name_Map name_map_G0x13y5[] = {
  NSPAIR(_ZN7G0x13y5C1Ev),
  NSPAIR(_ZN7G0x13y5D1Ev),
  {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_E0x13;
extern VTBL_ENTRY _ZTI5E0x13[];
extern  VTBL_ENTRY _ZTV5E0x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x13y5[] = {
  // 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_E0x13,    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_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 _ZTI7G0x13y5[];
extern void _ZN5E0x133fooEv();
static  VTBL_ENTRY vtc_G0x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x13y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G0x13y5[0]),
  (VTBL_ENTRY)&_ZN5E0x133fooEv,
};
extern VTBL_ENTRY _ZTV7G0x13y5[];
extern void _ZN5E0x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x13__7G0x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x13[0]),
  (VTBL_ENTRY)&_ZN5E0x133fooEv,
};
static  VTT_ENTRY vtt_G0x13y5[] = {
  {&(_ZTV7G0x13y5[4]),  4,9},
  {&(_ZTV7G0x13y5[8]),  8,9},
  {&(_tg__ZTV5E0x13__7G0x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G0x13y5[];
extern  VTBL_ENTRY _ZTV7G0x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x13y5[];
Class_Descriptor cd_G0x13y5 = {  "G0x13y5", // class name
  bases_G0x13y5, 6,
  &(vtc_G0x13y5[0]), // expected_vtbl_contents
  &(vtt_G0x13y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x13y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x13y5),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  G0x13y6  : E0x13 , virtual F0 {
  int ff;
  ~G0x13y6(); // tgen
  G0x13y6(); // tgen
};
//SIG(1 G0x13y6) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G0x13y6 ::~G0x13y6(){ note_dtor("G0x13y6", this);} // tgen
G0x13y6 ::G0x13y6(){ note_ctor("G0x13y6", this);} // tgen

static void Test_G0x13y6()
{
  extern Class_Descriptor cd_G0x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G0x13y6, buf);
    G0x13y6 *dp, &lv = *(dp=new (buf) G0x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G0x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x13y6)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(20,16), "G0x13y6");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(24,20), "G0x13y6");
    check_base_class_offset(lv, (C0*)(E0x13*), ABISELECT(20,16), "G0x13y6");
    check_base_class_offset(lv, (D0*)(E0x13*), ABISELECT(8,4), "G0x13y6");
    check_base_class_offset(lv, (E0x13*), 0, "G0x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G0x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G0x13y6.ff");
    test_class_info(&lv, &cd_G0x13y6);
    dp->~G0x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x13y6(Test_G0x13y6, "G0x13y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G0x13y6C1Ev();
extern void _ZN7G0x13y6D1Ev();
Name_Map name_map_G0x13y6[] = {
  NSPAIR(_ZN7G0x13y6C1Ev),
  NSPAIR(_ZN7G0x13y6D1Ev),
  {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_E0x13;
extern VTBL_ENTRY _ZTI5E0x13[];
extern  VTBL_ENTRY _ZTV5E0x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x13y6[] = {
  // 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_E0x13,    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 _ZTI7G0x13y6[];
extern void _ZN5E0x133fooEv();
static  VTBL_ENTRY vtc_G0x13y6[] = {
  ABISELECT(32,28),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x13y6[0]),
  (VTBL_ENTRY)&_ZN5E0x133fooEv,
};
extern VTBL_ENTRY _ZTV7G0x13y6[];
extern void _ZN5E0x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x13__7G0x13y6[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x13[0]),
  (VTBL_ENTRY)&_ZN5E0x133fooEv,
};
static  VTT_ENTRY vtt_G0x13y6[] = {
  {&(_ZTV7G0x13y6[4]),  4,5},
  {&(_tg__ZTV5E0x13__7G0x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G0x13y6[];
extern  VTBL_ENTRY _ZTV7G0x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x13y6[];
Class_Descriptor cd_G0x13y6 = {  "G0x13y6", // class name
  bases_G0x13y6, 6,
  &(vtc_G0x13y6[0]), // expected_vtbl_contents
  &(vtt_G0x13y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G0x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x13y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x13y6),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  G0x13y7  : virtual E0x13 , virtual F0 {
  int ff;
  ~G0x13y7(); // tgen
  G0x13y7(); // tgen
};
//SIG(1 G0x13y7) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G0x13y7 ::~G0x13y7(){ note_dtor("G0x13y7", this);} // tgen
G0x13y7 ::G0x13y7(){ note_ctor("G0x13y7", this);} // tgen

static void Test_G0x13y7()
{
  extern Class_Descriptor cd_G0x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x13y7, buf);
    G0x13y7 *dp, &lv = *(dp=new (buf) G0x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x13y7)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(32,20), "G0x13y7");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(36,24), "G0x13y7");
    check_base_class_offset(lv, (C0*)(E0x13*), ABISELECT(32,20), "G0x13y7");
    check_base_class_offset(lv, (D0*)(E0x13*), ABISELECT(24,12), "G0x13y7");
    check_base_class_offset(lv, (E0x13*), ABISELECT(16,8), "G0x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G0x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G0x13y7.ff");
    test_class_info(&lv, &cd_G0x13y7);
    dp->~G0x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x13y7(Test_G0x13y7, "G0x13y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x13y7C1Ev();
extern void _ZN7G0x13y7D1Ev();
Name_Map name_map_G0x13y7[] = {
  NSPAIR(_ZN7G0x13y7C1Ev),
  NSPAIR(_ZN7G0x13y7D1Ev),
  {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_E0x13;
extern VTBL_ENTRY _ZTI5E0x13[];
extern  VTBL_ENTRY _ZTV5E0x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x13y7[] = {
  // 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_E0x13,    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_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 _ZTI7G0x13y7[];
extern void _ZN5E0x133fooEv();
static  VTBL_ENTRY vtc_G0x13y7[] = {
  ABISELECT(44,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x13y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G0x13y7[0]),
  (VTBL_ENTRY)&_ZN5E0x133fooEv,
};
extern VTBL_ENTRY _ZTV7G0x13y7[];
extern void _ZN5E0x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x13__7G0x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x13[0]),
  (VTBL_ENTRY)&_ZN5E0x133fooEv,
};
static  VTT_ENTRY vtt_G0x13y7[] = {
  {&(_ZTV7G0x13y7[5]),  5,10},
  {&(_ZTV7G0x13y7[9]),  9,10},
  {&(_tg__ZTV5E0x13__7G0x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G0x13y7[];
extern  VTBL_ENTRY _ZTV7G0x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x13y7[];
Class_Descriptor cd_G0x13y7 = {  "G0x13y7", // class name
  bases_G0x13y7, 6,
  &(vtc_G0x13y7[0]), // expected_vtbl_contents
  &(vtt_G0x13y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x13y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x13y7),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  E1x13  : virtual C1 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E1x133fooEv
  ~E1x13(); // tgen
  E1x13(); // tgen
};
//SIG(-1 E1x13) C1{ VBC2{ BC3{ v1 Fi} BC4{ Fi} Fi} BC5{ Fi} v1 Fi}


void  E1x13 ::foo(){vfunc_called(this, "_ZN5E1x133fooEv");}
E1x13 ::~E1x13(){ note_dtor("E1x13", this);} // tgen
E1x13 ::E1x13(){ note_ctor("E1x13", this);} // tgen

static void Test_E1x13()
{
  extern Class_Descriptor cd_E1x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E1x13, buf);
    E1x13 *dp, &lv = *(dp=new (buf) E1x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E1x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E1x13)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(16,12), "E1x13");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(28,20), "E1x13");
    check_base_class_offset(lv, (C1*), ABISELECT(16,12), "E1x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E1x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E1x13.fd");
    test_class_info(&lv, &cd_E1x13);
    dp->~E1x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE1x13(Test_E1x13, "E1x13", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E1x13C1Ev();
extern void _ZN5E1x13D1Ev();
Name_Map name_map_E1x13[] = {
  NSPAIR(_ZN5E1x13C1Ev),
  NSPAIR(_ZN5E1x13D1Ev),
  {0,0}
};
extern Class_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_E1x13[] = {
  // 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
    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 _ZTI5E1x13[];
extern void _ZN5E1x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv)();
extern void ABISELECT(_ZThn16_N5E1x133fooEv,_ZThn12_N5E1x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E1x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x13[0]),
  (VTBL_ENTRY)&_ZN5E1x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E1x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv),
};
extern VTBL_ENTRY _ZTV5E1x13[];
static  VTT_ENTRY vtt_E1x13[] = {
  {&(_ZTV5E1x13[3]),  3,8},
  {&(_ZTV5E1x13[7]),  7,8},
};
extern VTBL_ENTRY _ZTI5E1x13[];
extern  VTBL_ENTRY _ZTV5E1x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x13[];
static VTBL_ENTRY alt_thunk_names134[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x133fooEv,_ZThn12_N5E1x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E1x13 = {  "E1x13", // class name
  bases_E1x13, 4,
  &(vtc_E1x13[0]), // expected_vtbl_contents
  &(vtt_E1x13[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E1x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E1x13),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E1x13),2, //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  G1x13y0  : E1x13 , F1 {
  int ff;
  ~G1x13y0(); // tgen
  G1x13y0(); // tgen
};
//SIG(1 G1x13y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G1x13y0 ::~G1x13y0(){ note_dtor("G1x13y0", this);} // tgen
G1x13y0 ::G1x13y0(){ note_ctor("G1x13y0", this);} // tgen

static void Test_G1x13y0()
{
  extern Class_Descriptor cd_G1x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G1x13y0, buf);
    G1x13y0 *dp, &lv = *(dp=new (buf) G1x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G1x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x13y0)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,24), "G1x13y0");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,32), "G1x13y0");
    check_base_class_offset(lv, (C1*)(E1x13*), ABISELECT(32,24), "G1x13y0");
    check_base_class_offset(lv, (D0*)(E1x13*), ABISELECT(8,4), "G1x13y0");
    check_base_class_offset(lv, (E1x13*), 0, "G1x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G1x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G1x13y0.ff");
    test_class_info(&lv, &cd_G1x13y0);
    dp->~G1x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x13y0(Test_G1x13y0, "G1x13y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G1x13y0C1Ev();
extern void _ZN7G1x13y0D1Ev();
Name_Map name_map_G1x13y0[] = {
  NSPAIR(_ZN7G1x13y0C1Ev),
  NSPAIR(_ZN7G1x13y0D1Ev),
  {0,0}
};
extern Class_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_E1x13;
extern VTBL_ENTRY _ZTI5E1x13[];
extern  VTBL_ENTRY _ZTV5E1x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x13y0[] = {
  // 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)
    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_E1x13,    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
    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 _ZTI7G1x13y0[];
extern void _ZN5E1x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv)();
extern void ABISELECT(_ZThn32_N5E1x133fooEv,_ZThn24_N5E1x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G1x13y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x13y0[0]),
  (VTBL_ENTRY)&_ZN5E1x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G1x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G1x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv),
};
extern VTBL_ENTRY _ZTV7G1x13y0[];
extern void _ZN5E1x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x13__7G1x13y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x13[0]),
  (VTBL_ENTRY)&_ZN5E1x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv)();
extern void ABISELECT(_ZThn32_N5E1x133fooEv,_ZThn24_N5E1x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C1__5E1x13__7G1x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E1x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv),
};
static  VTT_ENTRY vtt_G1x13y0[] = {
  {&(_ZTV7G1x13y0[3]),  3,11},
  {&(_tg__ZTV5E1x13__7G1x13y0[3]),  3,4},
  {&(_tg__ZTV2A12C1__5E1x13__7G1x13y0[3]),  3,4},
  {&(_ZTV7G1x13y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G1x13y0[];
extern  VTBL_ENTRY _ZTV7G1x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x13y0[];
static VTBL_ENTRY alt_thunk_names135[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E1x133fooEv,_ZThn24_N5E1x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E1x133fooEv,_ZThn24_N5E1x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G1x13y0 = {  "G1x13y0", // class name
  bases_G1x13y0, 6,
  &(vtc_G1x13y0[0]), // expected_vtbl_contents
  &(vtt_G1x13y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G1x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x13y0),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x13y0),4, //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  G1x13y1  : virtual E1x13 , F1 {
  int ff;
  ~G1x13y1(); // tgen
  G1x13y1(); // tgen
};
//SIG(1 G1x13y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G1x13y1 ::~G1x13y1(){ note_dtor("G1x13y1", this);} // tgen
G1x13y1 ::G1x13y1(){ note_ctor("G1x13y1", this);} // tgen

static void Test_G1x13y1()
{
  extern Class_Descriptor cd_G1x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G1x13y1, buf);
    G1x13y1 *dp, &lv = *(dp=new (buf) G1x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G1x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x13y1)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,24), "G1x13y1");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,32), "G1x13y1");
    check_base_class_offset(lv, (C1*)(E1x13*), ABISELECT(32,24), "G1x13y1");
    check_base_class_offset(lv, (D0*)(E1x13*), ABISELECT(24,16), "G1x13y1");
    check_base_class_offset(lv, (E1x13*), ABISELECT(16,12), "G1x13y1");
    check_base_class_offset(lv, (F1*), 0, "G1x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x13y1.ff");
    test_class_info(&lv, &cd_G1x13y1);
    dp->~G1x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x13y1(Test_G1x13y1, "G1x13y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G1x13y1C1Ev();
extern void _ZN7G1x13y1D1Ev();
Name_Map name_map_G1x13y1[] = {
  NSPAIR(_ZN7G1x13y1C1Ev),
  NSPAIR(_ZN7G1x13y1D1Ev),
  {0,0}
};
extern Class_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_E1x13;
extern VTBL_ENTRY _ZTI5E1x13[];
extern  VTBL_ENTRY _ZTV5E1x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x13y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //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,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //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_E1x13,    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 _ZTI7G1x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E1x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv)();
extern void ABISELECT(_ZThn16_N5E1x133fooEv,_ZThn12_N5E1x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G1x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G1x13y1[0]),
  (VTBL_ENTRY)&_ZN5E1x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G1x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv),
};
extern VTBL_ENTRY _ZTV7G1x13y1[];
extern void _ZN5E1x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x13__7G1x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x13[0]),
  (VTBL_ENTRY)&_ZN5E1x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv)();
extern void ABISELECT(_ZThn16_N5E1x133fooEv,_ZThn12_N5E1x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C1__5E1x13__7G1x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E1x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv),
};
static  VTT_ENTRY vtt_G1x13y1[] = {
  {&(_ZTV7G1x13y1[4]),  4,14},
  {&(_ZTV7G1x13y1[9]),  9,14},
  {&(_ZTV7G1x13y1[13]),  13,14},
  {&(_tg__ZTV5E1x13__7G1x13y1[3]),  3,4},
  {&(_tg__ZTV2A12C1__5E1x13__7G1x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G1x13y1[];
extern  VTBL_ENTRY _ZTV7G1x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x13y1[];
static VTBL_ENTRY alt_thunk_names136[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x133fooEv,_ZThn12_N5E1x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x133fooEv,_ZThn12_N5E1x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G1x13y1 = {  "G1x13y1", // class name
  bases_G1x13y1, 6,
  &(vtc_G1x13y1[0]), // expected_vtbl_contents
  &(vtt_G1x13y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G1x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x13y1),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x13y1),5, //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  G1x13y2  : E1x13 , virtual F1 {
  int ff;
  ~G1x13y2(); // tgen
  G1x13y2(); // tgen
};
//SIG(1 G1x13y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G1x13y2 ::~G1x13y2(){ note_dtor("G1x13y2", this);} // tgen
G1x13y2 ::G1x13y2(){ note_ctor("G1x13y2", this);} // tgen

static void Test_G1x13y2()
{
  extern Class_Descriptor cd_G1x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G1x13y2, buf);
    G1x13y2 *dp, &lv = *(dp=new (buf) G1x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G1x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x13y2)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(24,16), "G1x13y2");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(36,24), "G1x13y2");
    check_base_class_offset(lv, (C1*)(E1x13*), ABISELECT(24,16), "G1x13y2");
    check_base_class_offset(lv, (D0*)(E1x13*), ABISELECT(8,4), "G1x13y2");
    check_base_class_offset(lv, (E1x13*), 0, "G1x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G1x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G1x13y2.ff");
    test_class_info(&lv, &cd_G1x13y2);
    dp->~G1x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x13y2(Test_G1x13y2, "G1x13y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G1x13y2C1Ev();
extern void _ZN7G1x13y2D1Ev();
Name_Map name_map_G1x13y2[] = {
  NSPAIR(_ZN7G1x13y2C1Ev),
  NSPAIR(_ZN7G1x13y2D1Ev),
  {0,0}
};
extern Class_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_E1x13;
extern VTBL_ENTRY _ZTI5E1x13[];
extern  VTBL_ENTRY _ZTV5E1x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x13y2[] = {
  // 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)
    0, //bcp->index_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_E1x13,    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)
    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 _ZTI7G1x13y2[];
extern void _ZN5E1x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv)();
extern void ABISELECT(_ZThn24_N5E1x133fooEv,_ZThn16_N5E1x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x13y2[] = {
  ABISELECT(48,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x13y2[0]),
  (VTBL_ENTRY)&_ZN5E1x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G1x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G1x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G1x13y2[];
extern void _ZN5E1x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x13__7G1x13y2[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x13[0]),
  (VTBL_ENTRY)&_ZN5E1x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv)();
extern void ABISELECT(_ZThn24_N5E1x133fooEv,_ZThn16_N5E1x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C1__5E1x13__7G1x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E1x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv),
};
static  VTT_ENTRY vtt_G1x13y2[] = {
  {&(_ZTV7G1x13y2[4]),  4,13},
  {&(_tg__ZTV5E1x13__7G1x13y2[3]),  3,4},
  {&(_tg__ZTV2A12C1__5E1x13__7G1x13y2[3]),  3,4},
  {&(_ZTV7G1x13y2[8]),  8,13},
  {&(_ZTV7G1x13y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G1x13y2[];
extern  VTBL_ENTRY _ZTV7G1x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x13y2[];
static VTBL_ENTRY alt_thunk_names137[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E1x133fooEv,_ZThn16_N5E1x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E1x133fooEv,_ZThn16_N5E1x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G1x13y2 = {  "G1x13y2", // class name
  bases_G1x13y2, 6,
  &(vtc_G1x13y2[0]), // expected_vtbl_contents
  &(vtt_G1x13y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G1x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x13y2),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x13y2),5, //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  G1x13y3  : virtual E1x13 , virtual F1 {
  int ff;
  ~G1x13y3(); // tgen
  G1x13y3(); // tgen
};
//SIG(1 G1x13y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G1x13y3 ::~G1x13y3(){ note_dtor("G1x13y3", this);} // tgen
G1x13y3 ::G1x13y3(){ note_ctor("G1x13y3", this);} // tgen

static void Test_G1x13y3()
{
  extern Class_Descriptor cd_G1x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G1x13y3, buf);
    G1x13y3 *dp, &lv = *(dp=new (buf) G1x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G1x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x13y3)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,20), "G1x13y3");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,28), "G1x13y3");
    check_base_class_offset(lv, (C1*)(E1x13*), ABISELECT(32,20), "G1x13y3");
    check_base_class_offset(lv, (D0*)(E1x13*), ABISELECT(24,12), "G1x13y3");
    check_base_class_offset(lv, (E1x13*), ABISELECT(16,8), "G1x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G1x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G1x13y3.ff");
    test_class_info(&lv, &cd_G1x13y3);
    dp->~G1x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x13y3(Test_G1x13y3, "G1x13y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G1x13y3C1Ev();
extern void _ZN7G1x13y3D1Ev();
Name_Map name_map_G1x13y3[] = {
  NSPAIR(_ZN7G1x13y3C1Ev),
  NSPAIR(_ZN7G1x13y3D1Ev),
  {0,0}
};
extern Class_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_E1x13;
extern VTBL_ENTRY _ZTI5E1x13[];
extern  VTBL_ENTRY _ZTV5E1x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x13y3[] = {
  // 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(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_E1x13,    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 _ZTI7G1x13y3[];
extern void _ZN5E1x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv)();
extern void ABISELECT(_ZThn16_N5E1x133fooEv,_ZThn12_N5E1x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x13y3[] = {
  ABISELECT(56,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x13y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G1x13y3[0]),
  (VTBL_ENTRY)&_ZN5E1x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G1x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G1x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G1x13y3[];
extern void _ZN5E1x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x13__7G1x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x13[0]),
  (VTBL_ENTRY)&_ZN5E1x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv)();
extern void ABISELECT(_ZThn16_N5E1x133fooEv,_ZThn12_N5E1x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C1__5E1x13__7G1x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E1x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv),
};
static  VTT_ENTRY vtt_G1x13y3[] = {
  {&(_ZTV7G1x13y3[5]),  5,18},
  {&(_ZTV7G1x13y3[9]),  9,18},
  {&(_ZTV7G1x13y3[13]),  13,18},
  {&(_ZTV7G1x13y3[17]),  17,18},
  {&(_tg__ZTV5E1x13__7G1x13y3[3]),  3,4},
  {&(_tg__ZTV2A12C1__5E1x13__7G1x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G1x13y3[];
extern  VTBL_ENTRY _ZTV7G1x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x13y3[];
static VTBL_ENTRY alt_thunk_names138[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x133fooEv,_ZThn12_N5E1x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x133fooEv,_ZThn12_N5E1x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G1x13y3 = {  "G1x13y3", // class name
  bases_G1x13y3, 6,
  &(vtc_G1x13y3[0]), // expected_vtbl_contents
  &(vtt_G1x13y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G1x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x13y3),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x13y3),6, //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  G1x13y4  : E1x13 , F0 {
  int ff;
  ~G1x13y4(); // tgen
  G1x13y4(); // tgen
};
//SIG(1 G1x13y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G1x13y4 ::~G1x13y4(){ note_dtor("G1x13y4", this);} // tgen
G1x13y4 ::G1x13y4(){ note_ctor("G1x13y4", this);} // tgen

static void Test_G1x13y4()
{
  extern Class_Descriptor cd_G1x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x13y4, buf);
    G1x13y4 *dp, &lv = *(dp=new (buf) G1x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x13y4)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(24,20), "G1x13y4");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(36,28), "G1x13y4");
    check_base_class_offset(lv, (C1*)(E1x13*), ABISELECT(24,20), "G1x13y4");
    check_base_class_offset(lv, (D0*)(E1x13*), ABISELECT(8,4), "G1x13y4");
    check_base_class_offset(lv, (E1x13*), 0, "G1x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G1x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G1x13y4.ff");
    test_class_info(&lv, &cd_G1x13y4);
    dp->~G1x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x13y4(Test_G1x13y4, "G1x13y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G1x13y4C1Ev();
extern void _ZN7G1x13y4D1Ev();
Name_Map name_map_G1x13y4[] = {
  NSPAIR(_ZN7G1x13y4C1Ev),
  NSPAIR(_ZN7G1x13y4D1Ev),
  {0,0}
};
extern Class_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_E1x13;
extern VTBL_ENTRY _ZTI5E1x13[];
extern  VTBL_ENTRY _ZTV5E1x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x13y4[] = {
  // 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)
    0, //bcp->index_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_E1x13,    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 _ZTI7G1x13y4[];
extern void _ZN5E1x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv)();
extern void ABISELECT(_ZThn24_N5E1x133fooEv,_ZThn20_N5E1x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G1x13y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x13y4[0]),
  (VTBL_ENTRY)&_ZN5E1x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G1x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv),
};
extern VTBL_ENTRY _ZTV7G1x13y4[];
extern void _ZN5E1x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x13__7G1x13y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x13[0]),
  (VTBL_ENTRY)&_ZN5E1x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv)();
extern void ABISELECT(_ZThn24_N5E1x133fooEv,_ZThn20_N5E1x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C1__5E1x13__7G1x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E1x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv),
};
static  VTT_ENTRY vtt_G1x13y4[] = {
  {&(_ZTV7G1x13y4[3]),  3,8},
  {&(_tg__ZTV5E1x13__7G1x13y4[3]),  3,4},
  {&(_tg__ZTV2A12C1__5E1x13__7G1x13y4[3]),  3,4},
  {&(_ZTV7G1x13y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G1x13y4[];
extern  VTBL_ENTRY _ZTV7G1x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x13y4[];
static VTBL_ENTRY alt_thunk_names139[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E1x133fooEv,_ZThn20_N5E1x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E1x133fooEv,_ZThn20_N5E1x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G1x13y4 = {  "G1x13y4", // class name
  bases_G1x13y4, 6,
  &(vtc_G1x13y4[0]), // expected_vtbl_contents
  &(vtt_G1x13y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G1x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x13y4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x13y4),4, //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  G1x13y5  : virtual E1x13 , F0 {
  int ff;
  ~G1x13y5(); // tgen
  G1x13y5(); // tgen
};
//SIG(1 G1x13y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G1x13y5 ::~G1x13y5(){ note_dtor("G1x13y5", this);} // tgen
G1x13y5 ::G1x13y5(){ note_ctor("G1x13y5", this);} // tgen

static void Test_G1x13y5()
{
  extern Class_Descriptor cd_G1x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G1x13y5, buf);
    G1x13y5 *dp, &lv = *(dp=new (buf) G1x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G1x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x13y5)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,24), "G1x13y5");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,32), "G1x13y5");
    check_base_class_offset(lv, (C1*)(E1x13*), ABISELECT(32,24), "G1x13y5");
    check_base_class_offset(lv, (D0*)(E1x13*), ABISELECT(24,16), "G1x13y5");
    check_base_class_offset(lv, (E1x13*), ABISELECT(16,12), "G1x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G1x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x13y5.ff");
    test_class_info(&lv, &cd_G1x13y5);
    dp->~G1x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x13y5(Test_G1x13y5, "G1x13y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G1x13y5C1Ev();
extern void _ZN7G1x13y5D1Ev();
Name_Map name_map_G1x13y5[] = {
  NSPAIR(_ZN7G1x13y5C1Ev),
  NSPAIR(_ZN7G1x13y5D1Ev),
  {0,0}
};
extern Class_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_E1x13;
extern VTBL_ENTRY _ZTI5E1x13[];
extern  VTBL_ENTRY _ZTV5E1x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x13y5[] = {
  // 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)
    0, //bcp->index_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_E1x13,    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 _ZTI7G1x13y5[];
extern void _ZN5E1x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv)();
extern void ABISELECT(_ZThn16_N5E1x133fooEv,_ZThn12_N5E1x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G1x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x13y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G1x13y5[0]),
  (VTBL_ENTRY)&_ZN5E1x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G1x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv),
};
extern VTBL_ENTRY _ZTV7G1x13y5[];
extern void _ZN5E1x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x13__7G1x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x13[0]),
  (VTBL_ENTRY)&_ZN5E1x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv)();
extern void ABISELECT(_ZThn16_N5E1x133fooEv,_ZThn12_N5E1x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C1__5E1x13__7G1x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E1x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv),
};
static  VTT_ENTRY vtt_G1x13y5[] = {
  {&(_ZTV7G1x13y5[4]),  4,13},
  {&(_ZTV7G1x13y5[8]),  8,13},
  {&(_ZTV7G1x13y5[12]),  12,13},
  {&(_tg__ZTV5E1x13__7G1x13y5[3]),  3,4},
  {&(_tg__ZTV2A12C1__5E1x13__7G1x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G1x13y5[];
extern  VTBL_ENTRY _ZTV7G1x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x13y5[];
static VTBL_ENTRY alt_thunk_names140[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x133fooEv,_ZThn12_N5E1x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x133fooEv,_ZThn12_N5E1x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G1x13y5 = {  "G1x13y5", // class name
  bases_G1x13y5, 6,
  &(vtc_G1x13y5[0]), // expected_vtbl_contents
  &(vtt_G1x13y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G1x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x13y5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x13y5),5, //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  G1x13y6  : E1x13 , virtual F0 {
  int ff;
  ~G1x13y6(); // tgen
  G1x13y6(); // tgen
};
//SIG(1 G1x13y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G1x13y6 ::~G1x13y6(){ note_dtor("G1x13y6", this);} // tgen
G1x13y6 ::G1x13y6(){ note_ctor("G1x13y6", this);} // tgen

static void Test_G1x13y6()
{
  extern Class_Descriptor cd_G1x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x13y6, buf);
    G1x13y6 *dp, &lv = *(dp=new (buf) G1x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x13y6)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(24,16), "G1x13y6");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(36,24), "G1x13y6");
    check_base_class_offset(lv, (C1*)(E1x13*), ABISELECT(24,16), "G1x13y6");
    check_base_class_offset(lv, (D0*)(E1x13*), ABISELECT(8,4), "G1x13y6");
    check_base_class_offset(lv, (E1x13*), 0, "G1x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G1x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G1x13y6.ff");
    test_class_info(&lv, &cd_G1x13y6);
    dp->~G1x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x13y6(Test_G1x13y6, "G1x13y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G1x13y6C1Ev();
extern void _ZN7G1x13y6D1Ev();
Name_Map name_map_G1x13y6[] = {
  NSPAIR(_ZN7G1x13y6C1Ev),
  NSPAIR(_ZN7G1x13y6D1Ev),
  {0,0}
};
extern Class_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_E1x13;
extern VTBL_ENTRY _ZTI5E1x13[];
extern  VTBL_ENTRY _ZTV5E1x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x13y6[] = {
  // 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)
    0, //bcp->index_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_E1x13,    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 _ZTI7G1x13y6[];
extern void _ZN5E1x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv)();
extern void ABISELECT(_ZThn24_N5E1x133fooEv,_ZThn16_N5E1x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G1x13y6[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x13y6[0]),
  (VTBL_ENTRY)&_ZN5E1x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G1x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv),
};
extern VTBL_ENTRY _ZTV7G1x13y6[];
extern void _ZN5E1x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x13__7G1x13y6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x13[0]),
  (VTBL_ENTRY)&_ZN5E1x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv)();
extern void ABISELECT(_ZThn24_N5E1x133fooEv,_ZThn16_N5E1x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C1__5E1x13__7G1x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E1x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv),
};
static  VTT_ENTRY vtt_G1x13y6[] = {
  {&(_ZTV7G1x13y6[4]),  4,9},
  {&(_tg__ZTV5E1x13__7G1x13y6[3]),  3,4},
  {&(_tg__ZTV2A12C1__5E1x13__7G1x13y6[3]),  3,4},
  {&(_ZTV7G1x13y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G1x13y6[];
extern  VTBL_ENTRY _ZTV7G1x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x13y6[];
static VTBL_ENTRY alt_thunk_names141[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E1x133fooEv,_ZThn16_N5E1x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E1x133fooEv,_ZThn16_N5E1x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G1x13y6 = {  "G1x13y6", // class name
  bases_G1x13y6, 6,
  &(vtc_G1x13y6[0]), // expected_vtbl_contents
  &(vtt_G1x13y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G1x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x13y6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x13y6),4, //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  G1x13y7  : virtual E1x13 , virtual F0 {
  int ff;
  ~G1x13y7(); // tgen
  G1x13y7(); // tgen
};
//SIG(1 G1x13y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G1x13y7 ::~G1x13y7(){ note_dtor("G1x13y7", this);} // tgen
G1x13y7 ::G1x13y7(){ note_ctor("G1x13y7", this);} // tgen

static void Test_G1x13y7()
{
  extern Class_Descriptor cd_G1x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G1x13y7, buf);
    G1x13y7 *dp, &lv = *(dp=new (buf) G1x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G1x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x13y7)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,20), "G1x13y7");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,28), "G1x13y7");
    check_base_class_offset(lv, (C1*)(E1x13*), ABISELECT(32,20), "G1x13y7");
    check_base_class_offset(lv, (D0*)(E1x13*), ABISELECT(24,12), "G1x13y7");
    check_base_class_offset(lv, (E1x13*), ABISELECT(16,8), "G1x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G1x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G1x13y7.ff");
    test_class_info(&lv, &cd_G1x13y7);
    dp->~G1x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x13y7(Test_G1x13y7, "G1x13y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G1x13y7C1Ev();
extern void _ZN7G1x13y7D1Ev();
Name_Map name_map_G1x13y7[] = {
  NSPAIR(_ZN7G1x13y7C1Ev),
  NSPAIR(_ZN7G1x13y7D1Ev),
  {0,0}
};
extern Class_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_E1x13;
extern VTBL_ENTRY _ZTI5E1x13[];
extern  VTBL_ENTRY _ZTV5E1x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x13y7[] = {
  // 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(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_E1x13,    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 _ZTI7G1x13y7[];
extern void _ZN5E1x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv)();
extern void ABISELECT(_ZThn16_N5E1x133fooEv,_ZThn12_N5E1x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G1x13y7[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x13y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G1x13y7[0]),
  (VTBL_ENTRY)&_ZN5E1x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G1x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv),
};
extern VTBL_ENTRY _ZTV7G1x13y7[];
extern void _ZN5E1x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x13__7G1x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x13[0]),
  (VTBL_ENTRY)&_ZN5E1x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv)();
extern void ABISELECT(_ZThn16_N5E1x133fooEv,_ZThn12_N5E1x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C1__5E1x13__7G1x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E1x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv),
};
static  VTT_ENTRY vtt_G1x13y7[] = {
  {&(_ZTV7G1x13y7[5]),  5,14},
  {&(_ZTV7G1x13y7[9]),  9,14},
  {&(_ZTV7G1x13y7[13]),  13,14},
  {&(_tg__ZTV5E1x13__7G1x13y7[3]),  3,4},
  {&(_tg__ZTV2A12C1__5E1x13__7G1x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G1x13y7[];
extern  VTBL_ENTRY _ZTV7G1x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x13y7[];
static VTBL_ENTRY alt_thunk_names142[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E1x133fooEv,_ZTv0_n12_N5E1x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x133fooEv,_ZThn12_N5E1x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x133fooEv,_ZThn12_N5E1x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G1x13y7 = {  "G1x13y7", // class name
  bases_G1x13y7, 6,
  &(vtc_G1x13y7[0]), // expected_vtbl_contents
  &(vtt_G1x13y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G1x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x13y7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x13y7),5, //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  E2x13  : virtual C2 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E2x133fooEv
  ~E2x13(); // tgen
  E2x13(); // tgen
};
//SIG(-1 E2x13) C1{ VBC2{ VBC3{ Fi} BC4{ Fi} Fi} BC5{ Fi} v1 Fi}


void  E2x13 ::foo(){vfunc_called(this, "_ZN5E2x133fooEv");}
E2x13 ::~E2x13(){ note_dtor("E2x13", this);} // tgen
E2x13 ::E2x13(){ note_ctor("E2x13", this);} // tgen

static void Test_E2x13()
{
  extern Class_Descriptor cd_E2x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E2x13, buf);
    E2x13 *dp, &lv = *(dp=new (buf) E2x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E2x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E2x13)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(32,24), "E2x13");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(24,16), "E2x13");
    check_base_class_offset(lv, (C2*), ABISELECT(16,12), "E2x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E2x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E2x13.fd");
    test_class_info(&lv, &cd_E2x13);
    dp->~E2x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE2x13(Test_E2x13, "E2x13", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E2x13C1Ev();
extern void _ZN5E2x13D1Ev();
Name_Map name_map_E2x13[] = {
  NSPAIR(_ZN5E2x13C1Ev),
  NSPAIR(_ZN5E2x13D1Ev),
  {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_E2x13[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E2x13[];
extern void _ZN5E2x133fooEv();
static  VTBL_ENTRY vtc_E2x13[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x13[0]),
  (VTBL_ENTRY)&_ZN5E2x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E2x13[0]),
};
extern VTBL_ENTRY _ZTV5E2x13[];
static  VTBL_ENTRY _tg__ZTV2C2__5E2x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_E2x13[] = {
  {&(_ZTV5E2x13[4]),  4,8},
  {&(_ZTV5E2x13[8]),  8,8},
  {&(_tg__ZTV2C2__5E2x13[3]),  3,3},
};
extern VTBL_ENTRY _ZTI5E2x13[];
extern  VTBL_ENTRY _ZTV5E2x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x13[];
Class_Descriptor cd_E2x13 = {  "E2x13", // class name
  bases_E2x13, 4,
  &(vtc_E2x13[0]), // expected_vtbl_contents
  &(vtt_E2x13[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E2x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E2x13),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E2x13),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  G2x13y0  : E2x13 , F1 {
  int ff;
  ~G2x13y0(); // tgen
  G2x13y0(); // tgen
};
//SIG(1 G2x13y0) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G2x13y0 ::~G2x13y0(){ note_dtor("G2x13y0", this);} // tgen
G2x13y0 ::G2x13y0(){ note_ctor("G2x13y0", this);} // tgen

static void Test_G2x13y0()
{
  extern Class_Descriptor cd_G2x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G2x13y0, buf);
    G2x13y0 *dp, &lv = *(dp=new (buf) G2x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G2x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x13y0)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,36), "G2x13y0");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,28), "G2x13y0");
    check_base_class_offset(lv, (C2*)(E2x13*), ABISELECT(32,24), "G2x13y0");
    check_base_class_offset(lv, (D0*)(E2x13*), ABISELECT(8,4), "G2x13y0");
    check_base_class_offset(lv, (E2x13*), 0, "G2x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G2x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G2x13y0.ff");
    test_class_info(&lv, &cd_G2x13y0);
    dp->~G2x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x13y0(Test_G2x13y0, "G2x13y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G2x13y0C1Ev();
extern void _ZN7G2x13y0D1Ev();
Name_Map name_map_G2x13y0[] = {
  NSPAIR(_ZN7G2x13y0C1Ev),
  NSPAIR(_ZN7G2x13y0D1Ev),
  {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_E2x13;
extern VTBL_ENTRY _ZTI5E2x13[];
extern  VTBL_ENTRY _ZTV5E2x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x13y0[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E2x13,    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
    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 _ZTI7G2x13y0[];
extern void _ZN5E2x133fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x13y0[0]),
  (VTBL_ENTRY)&_ZN5E2x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G2x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G2x13y0[0]),
};
extern VTBL_ENTRY _ZTV7G2x13y0[];
extern void _ZN5E2x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x13__7G2x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x13[0]),
  (VTBL_ENTRY)&_ZN5E2x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C2__5E2x13__7G2x13y0[] = {
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E2x13[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__7G2x13y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x13y0[] = {
  {&(_ZTV7G2x13y0[4]),  4,11},
  {&(_tg__ZTV5E2x13__7G2x13y0[4]),  4,5},
  {&(_tg__ZTV2C2__5E2x13__7G2x13y0[3]),  3,3},
  {&(_ZTV7G2x13y0[11]),  11,11},
  {&(_tg__ZTV2C2__7G2x13y0[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x13y0[];
extern  VTBL_ENTRY _ZTV7G2x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x13y0[];
Class_Descriptor cd_G2x13y0 = {  "G2x13y0", // class name
  bases_G2x13y0, 6,
  &(vtc_G2x13y0[0]), // expected_vtbl_contents
  &(vtt_G2x13y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G2x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x13y0),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x13y0),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  G2x13y1  : virtual E2x13 , F1 {
  int ff;
  ~G2x13y1(); // tgen
  G2x13y1(); // tgen
};
//SIG(1 G2x13y1) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G2x13y1 ::~G2x13y1(){ note_dtor("G2x13y1", this);} // tgen
G2x13y1 ::G2x13y1(){ note_ctor("G2x13y1", this);} // tgen

static void Test_G2x13y1()
{
  extern Class_Descriptor cd_G2x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G2x13y1, buf);
    G2x13y1 *dp, &lv = *(dp=new (buf) G2x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G2x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x13y1)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,36), "G2x13y1");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,28), "G2x13y1");
    check_base_class_offset(lv, (C2*)(E2x13*), ABISELECT(32,24), "G2x13y1");
    check_base_class_offset(lv, (D0*)(E2x13*), ABISELECT(24,16), "G2x13y1");
    check_base_class_offset(lv, (E2x13*), ABISELECT(16,12), "G2x13y1");
    check_base_class_offset(lv, (F1*), 0, "G2x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x13y1.ff");
    test_class_info(&lv, &cd_G2x13y1);
    dp->~G2x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x13y1(Test_G2x13y1, "G2x13y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G2x13y1C1Ev();
extern void _ZN7G2x13y1D1Ev();
Name_Map name_map_G2x13y1[] = {
  NSPAIR(_ZN7G2x13y1C1Ev),
  NSPAIR(_ZN7G2x13y1D1Ev),
  {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_E2x13;
extern VTBL_ENTRY _ZTI5E2x13[];
extern  VTBL_ENTRY _ZTV5E2x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x13y1[] = {
  // 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
    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(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_E2x13,    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_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 _ZTI7G2x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E2x133fooEv();
static  VTBL_ENTRY vtc_G2x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G2x13y1[0]),
  (VTBL_ENTRY)&_ZN5E2x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G2x13y1[0]),
};
extern VTBL_ENTRY _ZTV7G2x13y1[];
extern void _ZN5E2x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x13__7G2x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x13[0]),
  (VTBL_ENTRY)&_ZN5E2x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C2__5E2x13__7G2x13y1[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E2x13[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__7G2x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x13y1[] = {
  {&(_ZTV7G2x13y1[5]),  5,15},
  {&(_ZTV7G2x13y1[11]),  11,15},
  {&(_ZTV7G2x13y1[15]),  15,15},
  {&(_tg__ZTV5E2x13__7G2x13y1[4]),  4,5},
  {&(_tg__ZTV2C2__5E2x13__7G2x13y1[3]),  3,3},
  {&(_tg__ZTV2C2__7G2x13y1[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x13y1[];
extern  VTBL_ENTRY _ZTV7G2x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x13y1[];
Class_Descriptor cd_G2x13y1 = {  "G2x13y1", // class name
  bases_G2x13y1, 6,
  &(vtc_G2x13y1[0]), // expected_vtbl_contents
  &(vtt_G2x13y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G2x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x13y1),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x13y1),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  G2x13y2  : E2x13 , virtual F1 {
  int ff;
  ~G2x13y2(); // tgen
  G2x13y2(); // tgen
};
//SIG(1 G2x13y2) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G2x13y2 ::~G2x13y2(){ note_dtor("G2x13y2", this);} // tgen
G2x13y2 ::G2x13y2(){ note_ctor("G2x13y2", this);} // tgen

static void Test_G2x13y2()
{
  extern Class_Descriptor cd_G2x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G2x13y2, buf);
    G2x13y2 *dp, &lv = *(dp=new (buf) G2x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G2x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x13y2)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(40,28), "G2x13y2");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(32,20), "G2x13y2");
    check_base_class_offset(lv, (C2*)(E2x13*), ABISELECT(24,16), "G2x13y2");
    check_base_class_offset(lv, (D0*)(E2x13*), ABISELECT(8,4), "G2x13y2");
    check_base_class_offset(lv, (E2x13*), 0, "G2x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G2x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G2x13y2.ff");
    test_class_info(&lv, &cd_G2x13y2);
    dp->~G2x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x13y2(Test_G2x13y2, "G2x13y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G2x13y2C1Ev();
extern void _ZN7G2x13y2D1Ev();
Name_Map name_map_G2x13y2[] = {
  NSPAIR(_ZN7G2x13y2C1Ev),
  NSPAIR(_ZN7G2x13y2D1Ev),
  {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_E2x13;
extern VTBL_ENTRY _ZTI5E2x13[];
extern  VTBL_ENTRY _ZTV5E2x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x13y2[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E2x13,    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
    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 _ZTI7G2x13y2[];
extern void _ZN5E2x133fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x13y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x13y2[0]),
  (VTBL_ENTRY)&_ZN5E2x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G2x13y2[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G2x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G2x13y2[];
extern void _ZN5E2x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x13__7G2x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x13[0]),
  (VTBL_ENTRY)&_ZN5E2x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C2__5E2x13__7G2x13y2[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E2x13[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__7G2x13y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x13y2[] = {
  {&(_ZTV7G2x13y2[5]),  5,13},
  {&(_tg__ZTV5E2x13__7G2x13y2[4]),  4,5},
  {&(_tg__ZTV2C2__5E2x13__7G2x13y2[3]),  3,3},
  {&(_ZTV7G2x13y2[9]),  9,13},
  {&(_ZTV7G2x13y2[12]),  12,13},
  {&(_tg__ZTV2C2__7G2x13y2[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x13y2[];
extern  VTBL_ENTRY _ZTV7G2x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x13y2[];
Class_Descriptor cd_G2x13y2 = {  "G2x13y2", // class name
  bases_G2x13y2, 6,
  &(vtc_G2x13y2[0]), // expected_vtbl_contents
  &(vtt_G2x13y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G2x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x13y2),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x13y2),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  G2x13y3  : virtual E2x13 , virtual F1 {
  int ff;
  ~G2x13y3(); // tgen
  G2x13y3(); // tgen
};
//SIG(1 G2x13y3) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G2x13y3 ::~G2x13y3(){ note_dtor("G2x13y3", this);} // tgen
G2x13y3 ::G2x13y3(){ note_ctor("G2x13y3", this);} // tgen

static void Test_G2x13y3()
{
  extern Class_Descriptor cd_G2x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G2x13y3, buf);
    G2x13y3 *dp, &lv = *(dp=new (buf) G2x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G2x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x13y3)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,32), "G2x13y3");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,24), "G2x13y3");
    check_base_class_offset(lv, (C2*)(E2x13*), ABISELECT(32,20), "G2x13y3");
    check_base_class_offset(lv, (D0*)(E2x13*), ABISELECT(24,12), "G2x13y3");
    check_base_class_offset(lv, (E2x13*), ABISELECT(16,8), "G2x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G2x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G2x13y3.ff");
    test_class_info(&lv, &cd_G2x13y3);
    dp->~G2x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x13y3(Test_G2x13y3, "G2x13y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G2x13y3C1Ev();
extern void _ZN7G2x13y3D1Ev();
Name_Map name_map_G2x13y3[] = {
  NSPAIR(_ZN7G2x13y3C1Ev),
  NSPAIR(_ZN7G2x13y3D1Ev),
  {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_E2x13;
extern VTBL_ENTRY _ZTI5E2x13[];
extern  VTBL_ENTRY _ZTV5E2x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x13y3[] = {
  // 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
    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_E2x13,    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
    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 _ZTI7G2x13y3[];
extern void _ZN5E2x133fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x13y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G2x13y3[0]),
  (VTBL_ENTRY)&_ZN5E2x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G2x13y3[0]),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G2x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G2x13y3[];
extern void _ZN5E2x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x13__7G2x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x13[0]),
  (VTBL_ENTRY)&_ZN5E2x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C2__5E2x13__7G2x13y3[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E2x13[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__7G2x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x13y3[] = {
  {&(_ZTV7G2x13y3[6]),  6,19},
  {&(_ZTV7G2x13y3[11]),  11,19},
  {&(_ZTV7G2x13y3[15]),  15,19},
  {&(_ZTV7G2x13y3[18]),  18,19},
  {&(_tg__ZTV5E2x13__7G2x13y3[4]),  4,5},
  {&(_tg__ZTV2C2__5E2x13__7G2x13y3[3]),  3,3},
  {&(_tg__ZTV2C2__7G2x13y3[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x13y3[];
extern  VTBL_ENTRY _ZTV7G2x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x13y3[];
Class_Descriptor cd_G2x13y3 = {  "G2x13y3", // class name
  bases_G2x13y3, 6,
  &(vtc_G2x13y3[0]), // expected_vtbl_contents
  &(vtt_G2x13y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G2x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x13y3),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x13y3),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  G2x13y4  : E2x13 , F0 {
  int ff;
  ~G2x13y4(); // tgen
  G2x13y4(); // tgen
};
//SIG(1 G2x13y4) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G2x13y4 ::~G2x13y4(){ note_dtor("G2x13y4", this);} // tgen
G2x13y4 ::G2x13y4(){ note_ctor("G2x13y4", this);} // tgen

static void Test_G2x13y4()
{
  extern Class_Descriptor cd_G2x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x13y4, buf);
    G2x13y4 *dp, &lv = *(dp=new (buf) G2x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x13y4)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(40,32), "G2x13y4");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(32,24), "G2x13y4");
    check_base_class_offset(lv, (C2*)(E2x13*), ABISELECT(24,20), "G2x13y4");
    check_base_class_offset(lv, (D0*)(E2x13*), ABISELECT(8,4), "G2x13y4");
    check_base_class_offset(lv, (E2x13*), 0, "G2x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G2x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G2x13y4.ff");
    test_class_info(&lv, &cd_G2x13y4);
    dp->~G2x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x13y4(Test_G2x13y4, "G2x13y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G2x13y4C1Ev();
extern void _ZN7G2x13y4D1Ev();
Name_Map name_map_G2x13y4[] = {
  NSPAIR(_ZN7G2x13y4C1Ev),
  NSPAIR(_ZN7G2x13y4D1Ev),
  {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_E2x13;
extern VTBL_ENTRY _ZTI5E2x13[];
extern  VTBL_ENTRY _ZTV5E2x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x13y4[] = {
  // 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
    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_E2x13,    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 _ZTI7G2x13y4[];
extern void _ZN5E2x133fooEv();
static  VTBL_ENTRY vtc_G2x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x13y4[0]),
  (VTBL_ENTRY)&_ZN5E2x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G2x13y4[0]),
};
extern VTBL_ENTRY _ZTV7G2x13y4[];
extern void _ZN5E2x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x13__7G2x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x13[0]),
  (VTBL_ENTRY)&_ZN5E2x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C2__5E2x13__7G2x13y4[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E2x13[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__7G2x13y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x13y4[] = {
  {&(_ZTV7G2x13y4[4]),  4,8},
  {&(_tg__ZTV5E2x13__7G2x13y4[4]),  4,5},
  {&(_tg__ZTV2C2__5E2x13__7G2x13y4[3]),  3,3},
  {&(_ZTV7G2x13y4[8]),  8,8},
  {&(_tg__ZTV2C2__7G2x13y4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x13y4[];
extern  VTBL_ENTRY _ZTV7G2x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x13y4[];
Class_Descriptor cd_G2x13y4 = {  "G2x13y4", // class name
  bases_G2x13y4, 6,
  &(vtc_G2x13y4[0]), // expected_vtbl_contents
  &(vtt_G2x13y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G2x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x13y4),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x13y4),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  G2x13y5  : virtual E2x13 , F0 {
  int ff;
  ~G2x13y5(); // tgen
  G2x13y5(); // tgen
};
//SIG(1 G2x13y5) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G2x13y5 ::~G2x13y5(){ note_dtor("G2x13y5", this);} // tgen
G2x13y5 ::G2x13y5(){ note_ctor("G2x13y5", this);} // tgen

static void Test_G2x13y5()
{
  extern Class_Descriptor cd_G2x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G2x13y5, buf);
    G2x13y5 *dp, &lv = *(dp=new (buf) G2x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G2x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x13y5)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,36), "G2x13y5");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,28), "G2x13y5");
    check_base_class_offset(lv, (C2*)(E2x13*), ABISELECT(32,24), "G2x13y5");
    check_base_class_offset(lv, (D0*)(E2x13*), ABISELECT(24,16), "G2x13y5");
    check_base_class_offset(lv, (E2x13*), ABISELECT(16,12), "G2x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G2x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x13y5.ff");
    test_class_info(&lv, &cd_G2x13y5);
    dp->~G2x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x13y5(Test_G2x13y5, "G2x13y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G2x13y5C1Ev();
extern void _ZN7G2x13y5D1Ev();
Name_Map name_map_G2x13y5[] = {
  NSPAIR(_ZN7G2x13y5C1Ev),
  NSPAIR(_ZN7G2x13y5D1Ev),
  {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_E2x13;
extern VTBL_ENTRY _ZTI5E2x13[];
extern  VTBL_ENTRY _ZTV5E2x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x13y5[] = {
  // 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
    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(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_E2x13,    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_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 _ZTI7G2x13y5[];
extern void _ZN5E2x133fooEv();
static  VTBL_ENTRY vtc_G2x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G2x13y5[0]),
  (VTBL_ENTRY)&_ZN5E2x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G2x13y5[0]),
};
extern VTBL_ENTRY _ZTV7G2x13y5[];
extern void _ZN5E2x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x13__7G2x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x13[0]),
  (VTBL_ENTRY)&_ZN5E2x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C2__5E2x13__7G2x13y5[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E2x13[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__7G2x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x13y5[] = {
  {&(_ZTV7G2x13y5[5]),  5,14},
  {&(_ZTV7G2x13y5[10]),  10,14},
  {&(_ZTV7G2x13y5[14]),  14,14},
  {&(_tg__ZTV5E2x13__7G2x13y5[4]),  4,5},
  {&(_tg__ZTV2C2__5E2x13__7G2x13y5[3]),  3,3},
  {&(_tg__ZTV2C2__7G2x13y5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x13y5[];
extern  VTBL_ENTRY _ZTV7G2x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x13y5[];
Class_Descriptor cd_G2x13y5 = {  "G2x13y5", // class name
  bases_G2x13y5, 6,
  &(vtc_G2x13y5[0]), // expected_vtbl_contents
  &(vtt_G2x13y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G2x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x13y5),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x13y5),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  G2x13y6  : E2x13 , virtual F0 {
  int ff;
  ~G2x13y6(); // tgen
  G2x13y6(); // tgen
};
//SIG(1 G2x13y6) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G2x13y6 ::~G2x13y6(){ note_dtor("G2x13y6", this);} // tgen
G2x13y6 ::G2x13y6(){ note_ctor("G2x13y6", this);} // tgen

static void Test_G2x13y6()
{
  extern Class_Descriptor cd_G2x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x13y6, buf);
    G2x13y6 *dp, &lv = *(dp=new (buf) G2x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x13y6)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(40,28), "G2x13y6");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(32,20), "G2x13y6");
    check_base_class_offset(lv, (C2*)(E2x13*), ABISELECT(24,16), "G2x13y6");
    check_base_class_offset(lv, (D0*)(E2x13*), ABISELECT(8,4), "G2x13y6");
    check_base_class_offset(lv, (E2x13*), 0, "G2x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G2x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G2x13y6.ff");
    test_class_info(&lv, &cd_G2x13y6);
    dp->~G2x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x13y6(Test_G2x13y6, "G2x13y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G2x13y6C1Ev();
extern void _ZN7G2x13y6D1Ev();
Name_Map name_map_G2x13y6[] = {
  NSPAIR(_ZN7G2x13y6C1Ev),
  NSPAIR(_ZN7G2x13y6D1Ev),
  {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_E2x13;
extern VTBL_ENTRY _ZTI5E2x13[];
extern  VTBL_ENTRY _ZTV5E2x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x13y6[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E2x13,    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 _ZTI7G2x13y6[];
extern void _ZN5E2x133fooEv();
static  VTBL_ENTRY vtc_G2x13y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x13y6[0]),
  (VTBL_ENTRY)&_ZN5E2x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G2x13y6[0]),
};
extern VTBL_ENTRY _ZTV7G2x13y6[];
extern void _ZN5E2x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x13__7G2x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x13[0]),
  (VTBL_ENTRY)&_ZN5E2x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C2__5E2x13__7G2x13y6[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E2x13[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__7G2x13y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x13y6[] = {
  {&(_ZTV7G2x13y6[5]),  5,9},
  {&(_tg__ZTV5E2x13__7G2x13y6[4]),  4,5},
  {&(_tg__ZTV2C2__5E2x13__7G2x13y6[3]),  3,3},
  {&(_ZTV7G2x13y6[9]),  9,9},
  {&(_tg__ZTV2C2__7G2x13y6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x13y6[];
extern  VTBL_ENTRY _ZTV7G2x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x13y6[];
Class_Descriptor cd_G2x13y6 = {  "G2x13y6", // class name
  bases_G2x13y6, 6,
  &(vtc_G2x13y6[0]), // expected_vtbl_contents
  &(vtt_G2x13y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G2x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x13y6),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x13y6),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  G2x13y7  : virtual E2x13 , virtual F0 {
  int ff;
  ~G2x13y7(); // tgen
  G2x13y7(); // tgen
};
//SIG(1 G2x13y7) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G2x13y7 ::~G2x13y7(){ note_dtor("G2x13y7", this);} // tgen
G2x13y7 ::G2x13y7(){ note_ctor("G2x13y7", this);} // tgen

static void Test_G2x13y7()
{
  extern Class_Descriptor cd_G2x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G2x13y7, buf);
    G2x13y7 *dp, &lv = *(dp=new (buf) G2x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G2x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x13y7)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,32), "G2x13y7");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,24), "G2x13y7");
    check_base_class_offset(lv, (C2*)(E2x13*), ABISELECT(32,20), "G2x13y7");
    check_base_class_offset(lv, (D0*)(E2x13*), ABISELECT(24,12), "G2x13y7");
    check_base_class_offset(lv, (E2x13*), ABISELECT(16,8), "G2x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G2x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G2x13y7.ff");
    test_class_info(&lv, &cd_G2x13y7);
    dp->~G2x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x13y7(Test_G2x13y7, "G2x13y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G2x13y7C1Ev();
extern void _ZN7G2x13y7D1Ev();
Name_Map name_map_G2x13y7[] = {
  NSPAIR(_ZN7G2x13y7C1Ev),
  NSPAIR(_ZN7G2x13y7D1Ev),
  {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_E2x13;
extern VTBL_ENTRY _ZTI5E2x13[];
extern  VTBL_ENTRY _ZTV5E2x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x13y7[] = {
  // 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(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_E2x13,    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_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 _ZTI7G2x13y7[];
extern void _ZN5E2x133fooEv();
static  VTBL_ENTRY vtc_G2x13y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G2x13y7[0]),
  (VTBL_ENTRY)&_ZN5E2x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G2x13y7[0]),
};
extern VTBL_ENTRY _ZTV7G2x13y7[];
extern void _ZN5E2x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x13__7G2x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x13[0]),
  (VTBL_ENTRY)&_ZN5E2x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C2__5E2x13__7G2x13y7[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E2x13[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__7G2x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x13y7[] = {
  {&(_ZTV7G2x13y7[6]),  6,15},
  {&(_ZTV7G2x13y7[11]),  11,15},
  {&(_ZTV7G2x13y7[15]),  15,15},
  {&(_tg__ZTV5E2x13__7G2x13y7[4]),  4,5},
  {&(_tg__ZTV2C2__5E2x13__7G2x13y7[3]),  3,3},
  {&(_tg__ZTV2C2__7G2x13y7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x13y7[];
extern  VTBL_ENTRY _ZTV7G2x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x13y7[];
Class_Descriptor cd_G2x13y7 = {  "G2x13y7", // class name
  bases_G2x13y7, 6,
  &(vtc_G2x13y7[0]), // expected_vtbl_contents
  &(vtt_G2x13y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G2x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x13y7),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x13y7),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  E3x13  : virtual C3 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E3x133fooEv
  ~E3x13(); // tgen
  E3x13(); // tgen
};
//SIG(-1 E3x13) C1{ VBC2{ VBC3{ v1 Fi} BC4{ Fi} Fi} BC5{ Fi} v1 Fi}


void  E3x13 ::foo(){vfunc_called(this, "_ZN5E3x133fooEv");}
E3x13 ::~E3x13(){ note_dtor("E3x13", this);} // tgen
E3x13 ::E3x13(){ note_ctor("E3x13", this);} // tgen

static void Test_E3x13()
{
  extern Class_Descriptor cd_E3x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E3x13, buf);
    E3x13 *dp, &lv = *(dp=new (buf) E3x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E3x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E3x13)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(32,24), "E3x13");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(24,16), "E3x13");
    check_base_class_offset(lv, (C3*), ABISELECT(16,12), "E3x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E3x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E3x13.fd");
    test_class_info(&lv, &cd_E3x13);
    dp->~E3x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE3x13(Test_E3x13, "E3x13", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E3x13C1Ev();
extern void _ZN5E3x13D1Ev();
Name_Map name_map_E3x13[] = {
  NSPAIR(_ZN5E3x13C1Ev),
  NSPAIR(_ZN5E3x13D1Ev),
  {0,0}
};
extern Class_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_E3x13[] = {
  // 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)
    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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E3x13[];
extern void _ZN5E3x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv)();
extern void ABISELECT(_ZThn32_N5E3x133fooEv,_ZThn24_N5E3x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E3x13[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
  (VTBL_ENTRY)&_ZN5E3x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv),
};
extern VTBL_ENTRY _ZTV5E3x13[];
static  VTBL_ENTRY _tg__ZTV2C3__5E3x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__5E3x13[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E3x13[] = {
  {&(_ZTV5E3x13[4]),  4,12},
  {&(_ZTV5E3x13[8]),  8,12},
  {&(_ZTV5E3x13[11]),  11,12},
  {&(_tg__ZTV2C3__5E3x13[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__5E3x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E3x13[];
extern  VTBL_ENTRY _ZTV5E3x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x13[];
static VTBL_ENTRY alt_thunk_names143[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x133fooEv,_ZThn24_N5E3x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E3x13 = {  "E3x13", // class name
  bases_E3x13, 4,
  &(vtc_E3x13[0]), // expected_vtbl_contents
  &(vtt_E3x13[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E3x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E3x13),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E3x13),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names143,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x13y0  : E3x13 , F1 {
  int ff;
  ~G3x13y0(); // tgen
  G3x13y0(); // tgen
};
//SIG(1 G3x13y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G3x13y0 ::~G3x13y0(){ note_dtor("G3x13y0", this);} // tgen
G3x13y0 ::G3x13y0(){ note_ctor("G3x13y0", this);} // tgen

static void Test_G3x13y0()
{
  extern Class_Descriptor cd_G3x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G3x13y0, buf);
    G3x13y0 *dp, &lv = *(dp=new (buf) G3x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G3x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x13y0)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,36), "G3x13y0");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,28), "G3x13y0");
    check_base_class_offset(lv, (C3*)(E3x13*), ABISELECT(32,24), "G3x13y0");
    check_base_class_offset(lv, (D0*)(E3x13*), ABISELECT(8,4), "G3x13y0");
    check_base_class_offset(lv, (E3x13*), 0, "G3x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G3x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G3x13y0.ff");
    test_class_info(&lv, &cd_G3x13y0);
    dp->~G3x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x13y0(Test_G3x13y0, "G3x13y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G3x13y0C1Ev();
extern void _ZN7G3x13y0D1Ev();
Name_Map name_map_G3x13y0[] = {
  NSPAIR(_ZN7G3x13y0C1Ev),
  NSPAIR(_ZN7G3x13y0D1Ev),
  {0,0}
};
extern Class_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_E3x13;
extern VTBL_ENTRY _ZTI5E3x13[];
extern  VTBL_ENTRY _ZTV5E3x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x13y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,36), //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,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E3x13,    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
    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 _ZTI7G3x13y0[];
extern void _ZN5E3x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv)();
extern void ABISELECT(_ZThn48_N5E3x133fooEv,_ZThn36_N5E3x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x13y0[0]),
  (VTBL_ENTRY)&_ZN5E3x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G3x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G3x13y0[0]),
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G3x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv),
};
extern VTBL_ENTRY _ZTV7G3x13y0[];
extern void _ZN5E3x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x13__7G3x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
  (VTBL_ENTRY)&_ZN5E3x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__5E3x13__7G3x13y0[] = {
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv)();
extern void ABISELECT(_ZThn48_N5E3x133fooEv,_ZThn36_N5E3x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x13__7G3x13y0[] = {
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV2C3__7G3x13y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__7G3x13y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x13y0[] = {
  {&(_ZTV7G3x13y0[4]),  4,15},
  {&(_tg__ZTV5E3x13__7G3x13y0[4]),  4,5},
  {&(_tg__ZTV2C3__5E3x13__7G3x13y0[3]),  3,3},
  {&(_tg__ZTV2A1__5E3x13__7G3x13y0[3]),  3,4},
  {&(_ZTV7G3x13y0[11]),  11,15},
  {&(_ZTV7G3x13y0[14]),  14,15},
  {&(_tg__ZTV2C3__7G3x13y0[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__7G3x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x13y0[];
extern  VTBL_ENTRY _ZTV7G3x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x13y0[];
static VTBL_ENTRY alt_thunk_names144[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N5E3x133fooEv,_ZThn36_N5E3x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N5E3x133fooEv,_ZThn36_N5E3x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x13y0 = {  "G3x13y0", // class name
  bases_G3x13y0, 6,
  &(vtc_G3x13y0[0]), // expected_vtbl_contents
  &(vtt_G3x13y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G3x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x13y0),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x13y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names144,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x13y1  : virtual E3x13 , F1 {
  int ff;
  ~G3x13y1(); // tgen
  G3x13y1(); // tgen
};
//SIG(1 G3x13y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G3x13y1 ::~G3x13y1(){ note_dtor("G3x13y1", this);} // tgen
G3x13y1 ::G3x13y1(){ note_ctor("G3x13y1", this);} // tgen

static void Test_G3x13y1()
{
  extern Class_Descriptor cd_G3x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G3x13y1, buf);
    G3x13y1 *dp, &lv = *(dp=new (buf) G3x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G3x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x13y1)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,36), "G3x13y1");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,28), "G3x13y1");
    check_base_class_offset(lv, (C3*)(E3x13*), ABISELECT(32,24), "G3x13y1");
    check_base_class_offset(lv, (D0*)(E3x13*), ABISELECT(24,16), "G3x13y1");
    check_base_class_offset(lv, (E3x13*), ABISELECT(16,12), "G3x13y1");
    check_base_class_offset(lv, (F1*), 0, "G3x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x13y1.ff");
    test_class_info(&lv, &cd_G3x13y1);
    dp->~G3x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x13y1(Test_G3x13y1, "G3x13y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G3x13y1C1Ev();
extern void _ZN7G3x13y1D1Ev();
Name_Map name_map_G3x13y1[] = {
  NSPAIR(_ZN7G3x13y1C1Ev),
  NSPAIR(_ZN7G3x13y1D1Ev),
  {0,0}
};
extern Class_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_E3x13;
extern VTBL_ENTRY _ZTI5E3x13[];
extern  VTBL_ENTRY _ZTV5E3x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x13y1[] = {
  // 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_C3,    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
    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_E3x13,    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_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 _ZTI7G3x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E3x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv)();
extern void ABISELECT(_ZThn32_N5E3x133fooEv,_ZThn24_N5E3x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G3x13y1[0]),
  (VTBL_ENTRY)&_ZN5E3x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G3x13y1[0]),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G3x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv),
};
extern VTBL_ENTRY _ZTV7G3x13y1[];
extern void _ZN5E3x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x13__7G3x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
  (VTBL_ENTRY)&_ZN5E3x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__5E3x13__7G3x13y1[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv)();
extern void ABISELECT(_ZThn32_N5E3x133fooEv,_ZThn24_N5E3x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x13__7G3x13y1[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV2C3__7G3x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__7G3x13y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x13y1[] = {
  {&(_ZTV7G3x13y1[5]),  5,19},
  {&(_ZTV7G3x13y1[11]),  11,19},
  {&(_ZTV7G3x13y1[15]),  15,19},
  {&(_ZTV7G3x13y1[18]),  18,19},
  {&(_tg__ZTV5E3x13__7G3x13y1[4]),  4,5},
  {&(_tg__ZTV2C3__5E3x13__7G3x13y1[3]),  3,3},
  {&(_tg__ZTV2A1__5E3x13__7G3x13y1[3]),  3,4},
  {&(_tg__ZTV2C3__7G3x13y1[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__7G3x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x13y1[];
extern  VTBL_ENTRY _ZTV7G3x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x13y1[];
static VTBL_ENTRY alt_thunk_names145[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x133fooEv,_ZThn24_N5E3x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x133fooEv,_ZThn24_N5E3x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x13y1 = {  "G3x13y1", // class name
  bases_G3x13y1, 6,
  &(vtc_G3x13y1[0]), // expected_vtbl_contents
  &(vtt_G3x13y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G3x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x13y1),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x13y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names145,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x13y2  : E3x13 , virtual F1 {
  int ff;
  ~G3x13y2(); // tgen
  G3x13y2(); // tgen
};
//SIG(1 G3x13y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G3x13y2 ::~G3x13y2(){ note_dtor("G3x13y2", this);} // tgen
G3x13y2 ::G3x13y2(){ note_ctor("G3x13y2", this);} // tgen

static void Test_G3x13y2()
{
  extern Class_Descriptor cd_G3x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G3x13y2, buf);
    G3x13y2 *dp, &lv = *(dp=new (buf) G3x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G3x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x13y2)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(40,28), "G3x13y2");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(32,20), "G3x13y2");
    check_base_class_offset(lv, (C3*)(E3x13*), ABISELECT(24,16), "G3x13y2");
    check_base_class_offset(lv, (D0*)(E3x13*), ABISELECT(8,4), "G3x13y2");
    check_base_class_offset(lv, (E3x13*), 0, "G3x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G3x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G3x13y2.ff");
    test_class_info(&lv, &cd_G3x13y2);
    dp->~G3x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x13y2(Test_G3x13y2, "G3x13y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G3x13y2C1Ev();
extern void _ZN7G3x13y2D1Ev();
Name_Map name_map_G3x13y2[] = {
  NSPAIR(_ZN7G3x13y2C1Ev),
  NSPAIR(_ZN7G3x13y2D1Ev),
  {0,0}
};
extern Class_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_E3x13;
extern VTBL_ENTRY _ZTI5E3x13[];
extern  VTBL_ENTRY _ZTV5E3x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x13y2[] = {
  // 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(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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E3x13,    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
    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 _ZTI7G3x13y2[];
extern void _ZN5E3x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv)();
extern void ABISELECT(_ZThn40_N5E3x133fooEv,_ZThn28_N5E3x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G3x13y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x13y2[0]),
  (VTBL_ENTRY)&_ZN5E3x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G3x13y2[0]),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G3x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G3x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G3x13y2[];
extern void _ZN5E3x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x13__7G3x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
  (VTBL_ENTRY)&_ZN5E3x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__5E3x13__7G3x13y2[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv)();
extern void ABISELECT(_ZThn40_N5E3x133fooEv,_ZThn28_N5E3x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x13__7G3x13y2[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV2C3__7G3x13y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__7G3x13y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x13y2[] = {
  {&(_ZTV7G3x13y2[5]),  5,17},
  {&(_tg__ZTV5E3x13__7G3x13y2[4]),  4,5},
  {&(_tg__ZTV2C3__5E3x13__7G3x13y2[3]),  3,3},
  {&(_tg__ZTV2A1__5E3x13__7G3x13y2[3]),  3,4},
  {&(_ZTV7G3x13y2[9]),  9,17},
  {&(_ZTV7G3x13y2[12]),  12,17},
  {&(_ZTV7G3x13y2[16]),  16,17},
  {&(_tg__ZTV2C3__7G3x13y2[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__7G3x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x13y2[];
extern  VTBL_ENTRY _ZTV7G3x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x13y2[];
static VTBL_ENTRY alt_thunk_names146[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E3x133fooEv,_ZThn28_N5E3x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E3x133fooEv,_ZThn28_N5E3x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x13y2 = {  "G3x13y2", // class name
  bases_G3x13y2, 6,
  &(vtc_G3x13y2[0]), // expected_vtbl_contents
  &(vtt_G3x13y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G3x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x13y2),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x13y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names146,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x13y3  : virtual E3x13 , virtual F1 {
  int ff;
  ~G3x13y3(); // tgen
  G3x13y3(); // tgen
};
//SIG(1 G3x13y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G3x13y3 ::~G3x13y3(){ note_dtor("G3x13y3", this);} // tgen
G3x13y3 ::G3x13y3(){ note_ctor("G3x13y3", this);} // tgen

static void Test_G3x13y3()
{
  extern Class_Descriptor cd_G3x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G3x13y3, buf);
    G3x13y3 *dp, &lv = *(dp=new (buf) G3x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G3x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x13y3)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,32), "G3x13y3");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,24), "G3x13y3");
    check_base_class_offset(lv, (C3*)(E3x13*), ABISELECT(32,20), "G3x13y3");
    check_base_class_offset(lv, (D0*)(E3x13*), ABISELECT(24,12), "G3x13y3");
    check_base_class_offset(lv, (E3x13*), ABISELECT(16,8), "G3x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G3x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G3x13y3.ff");
    test_class_info(&lv, &cd_G3x13y3);
    dp->~G3x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x13y3(Test_G3x13y3, "G3x13y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G3x13y3C1Ev();
extern void _ZN7G3x13y3D1Ev();
Name_Map name_map_G3x13y3[] = {
  NSPAIR(_ZN7G3x13y3C1Ev),
  NSPAIR(_ZN7G3x13y3D1Ev),
  {0,0}
};
extern Class_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_E3x13;
extern VTBL_ENTRY _ZTI5E3x13[];
extern  VTBL_ENTRY _ZTV5E3x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x13y3[] = {
  // 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
    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_E3x13,    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
    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 _ZTI7G3x13y3[];
extern void _ZN5E3x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv)();
extern void ABISELECT(_ZThn32_N5E3x133fooEv,_ZThn24_N5E3x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G3x13y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G3x13y3[0]),
  (VTBL_ENTRY)&_ZN5E3x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G3x13y3[0]),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G3x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G3x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G3x13y3[];
extern void _ZN5E3x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x13__7G3x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
  (VTBL_ENTRY)&_ZN5E3x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__5E3x13__7G3x13y3[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv)();
extern void ABISELECT(_ZThn32_N5E3x133fooEv,_ZThn24_N5E3x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x13__7G3x13y3[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV2C3__7G3x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__7G3x13y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x13y3[] = {
  {&(_ZTV7G3x13y3[6]),  6,23},
  {&(_ZTV7G3x13y3[11]),  11,23},
  {&(_ZTV7G3x13y3[15]),  15,23},
  {&(_ZTV7G3x13y3[18]),  18,23},
  {&(_ZTV7G3x13y3[22]),  22,23},
  {&(_tg__ZTV5E3x13__7G3x13y3[4]),  4,5},
  {&(_tg__ZTV2C3__5E3x13__7G3x13y3[3]),  3,3},
  {&(_tg__ZTV2A1__5E3x13__7G3x13y3[3]),  3,4},
  {&(_tg__ZTV2C3__7G3x13y3[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__7G3x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x13y3[];
extern  VTBL_ENTRY _ZTV7G3x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x13y3[];
static VTBL_ENTRY alt_thunk_names147[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x133fooEv,_ZThn24_N5E3x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x133fooEv,_ZThn24_N5E3x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x13y3 = {  "G3x13y3", // class name
  bases_G3x13y3, 6,
  &(vtc_G3x13y3[0]), // expected_vtbl_contents
  &(vtt_G3x13y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G3x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x13y3),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x13y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names147,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x13y4  : E3x13 , F0 {
  int ff;
  ~G3x13y4(); // tgen
  G3x13y4(); // tgen
};
//SIG(1 G3x13y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G3x13y4 ::~G3x13y4(){ note_dtor("G3x13y4", this);} // tgen
G3x13y4 ::G3x13y4(){ note_ctor("G3x13y4", this);} // tgen

static void Test_G3x13y4()
{
  extern Class_Descriptor cd_G3x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x13y4, buf);
    G3x13y4 *dp, &lv = *(dp=new (buf) G3x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x13y4)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(40,32), "G3x13y4");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(32,24), "G3x13y4");
    check_base_class_offset(lv, (C3*)(E3x13*), ABISELECT(24,20), "G3x13y4");
    check_base_class_offset(lv, (D0*)(E3x13*), ABISELECT(8,4), "G3x13y4");
    check_base_class_offset(lv, (E3x13*), 0, "G3x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G3x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G3x13y4.ff");
    test_class_info(&lv, &cd_G3x13y4);
    dp->~G3x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x13y4(Test_G3x13y4, "G3x13y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G3x13y4C1Ev();
extern void _ZN7G3x13y4D1Ev();
Name_Map name_map_G3x13y4[] = {
  NSPAIR(_ZN7G3x13y4C1Ev),
  NSPAIR(_ZN7G3x13y4D1Ev),
  {0,0}
};
extern Class_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_E3x13;
extern VTBL_ENTRY _ZTI5E3x13[];
extern  VTBL_ENTRY _ZTV5E3x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x13y4[] = {
  // 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)
    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
    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_E3x13,    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 _ZTI7G3x13y4[];
extern void _ZN5E3x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv)();
extern void ABISELECT(_ZThn40_N5E3x133fooEv,_ZThn32_N5E3x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x13y4[0]),
  (VTBL_ENTRY)&_ZN5E3x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G3x13y4[0]),
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G3x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv),
};
extern VTBL_ENTRY _ZTV7G3x13y4[];
extern void _ZN5E3x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x13__7G3x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
  (VTBL_ENTRY)&_ZN5E3x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__5E3x13__7G3x13y4[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv)();
extern void ABISELECT(_ZThn40_N5E3x133fooEv,_ZThn32_N5E3x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x13__7G3x13y4[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV2C3__7G3x13y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__7G3x13y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x13y4[] = {
  {&(_ZTV7G3x13y4[4]),  4,12},
  {&(_tg__ZTV5E3x13__7G3x13y4[4]),  4,5},
  {&(_tg__ZTV2C3__5E3x13__7G3x13y4[3]),  3,3},
  {&(_tg__ZTV2A1__5E3x13__7G3x13y4[3]),  3,4},
  {&(_ZTV7G3x13y4[8]),  8,12},
  {&(_ZTV7G3x13y4[11]),  11,12},
  {&(_tg__ZTV2C3__7G3x13y4[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__7G3x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x13y4[];
extern  VTBL_ENTRY _ZTV7G3x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x13y4[];
static VTBL_ENTRY alt_thunk_names148[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E3x133fooEv,_ZThn32_N5E3x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E3x133fooEv,_ZThn32_N5E3x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x13y4 = {  "G3x13y4", // class name
  bases_G3x13y4, 6,
  &(vtc_G3x13y4[0]), // expected_vtbl_contents
  &(vtt_G3x13y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G3x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x13y4),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x13y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names148,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x13y5  : virtual E3x13 , F0 {
  int ff;
  ~G3x13y5(); // tgen
  G3x13y5(); // tgen
};
//SIG(1 G3x13y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G3x13y5 ::~G3x13y5(){ note_dtor("G3x13y5", this);} // tgen
G3x13y5 ::G3x13y5(){ note_ctor("G3x13y5", this);} // tgen

static void Test_G3x13y5()
{
  extern Class_Descriptor cd_G3x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G3x13y5, buf);
    G3x13y5 *dp, &lv = *(dp=new (buf) G3x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G3x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x13y5)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,36), "G3x13y5");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,28), "G3x13y5");
    check_base_class_offset(lv, (C3*)(E3x13*), ABISELECT(32,24), "G3x13y5");
    check_base_class_offset(lv, (D0*)(E3x13*), ABISELECT(24,16), "G3x13y5");
    check_base_class_offset(lv, (E3x13*), ABISELECT(16,12), "G3x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G3x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x13y5.ff");
    test_class_info(&lv, &cd_G3x13y5);
    dp->~G3x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x13y5(Test_G3x13y5, "G3x13y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G3x13y5C1Ev();
extern void _ZN7G3x13y5D1Ev();
Name_Map name_map_G3x13y5[] = {
  NSPAIR(_ZN7G3x13y5C1Ev),
  NSPAIR(_ZN7G3x13y5D1Ev),
  {0,0}
};
extern Class_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_E3x13;
extern VTBL_ENTRY _ZTI5E3x13[];
extern  VTBL_ENTRY _ZTV5E3x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x13y5[] = {
  // 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_C3,    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
    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_E3x13,    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_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 _ZTI7G3x13y5[];
extern void _ZN5E3x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv)();
extern void ABISELECT(_ZThn32_N5E3x133fooEv,_ZThn24_N5E3x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G3x13y5[0]),
  (VTBL_ENTRY)&_ZN5E3x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G3x13y5[0]),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G3x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv),
};
extern VTBL_ENTRY _ZTV7G3x13y5[];
extern void _ZN5E3x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x13__7G3x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
  (VTBL_ENTRY)&_ZN5E3x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__5E3x13__7G3x13y5[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv)();
extern void ABISELECT(_ZThn32_N5E3x133fooEv,_ZThn24_N5E3x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x13__7G3x13y5[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV2C3__7G3x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__7G3x13y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x13y5[] = {
  {&(_ZTV7G3x13y5[5]),  5,18},
  {&(_ZTV7G3x13y5[10]),  10,18},
  {&(_ZTV7G3x13y5[14]),  14,18},
  {&(_ZTV7G3x13y5[17]),  17,18},
  {&(_tg__ZTV5E3x13__7G3x13y5[4]),  4,5},
  {&(_tg__ZTV2C3__5E3x13__7G3x13y5[3]),  3,3},
  {&(_tg__ZTV2A1__5E3x13__7G3x13y5[3]),  3,4},
  {&(_tg__ZTV2C3__7G3x13y5[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__7G3x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x13y5[];
extern  VTBL_ENTRY _ZTV7G3x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x13y5[];
static VTBL_ENTRY alt_thunk_names149[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x133fooEv,_ZThn24_N5E3x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x133fooEv,_ZThn24_N5E3x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x13y5 = {  "G3x13y5", // class name
  bases_G3x13y5, 6,
  &(vtc_G3x13y5[0]), // expected_vtbl_contents
  &(vtt_G3x13y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G3x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x13y5),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x13y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names149,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x13y6  : E3x13 , virtual F0 {
  int ff;
  ~G3x13y6(); // tgen
  G3x13y6(); // tgen
};
//SIG(1 G3x13y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G3x13y6 ::~G3x13y6(){ note_dtor("G3x13y6", this);} // tgen
G3x13y6 ::G3x13y6(){ note_ctor("G3x13y6", this);} // tgen

static void Test_G3x13y6()
{
  extern Class_Descriptor cd_G3x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x13y6, buf);
    G3x13y6 *dp, &lv = *(dp=new (buf) G3x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x13y6)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(40,28), "G3x13y6");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(32,20), "G3x13y6");
    check_base_class_offset(lv, (C3*)(E3x13*), ABISELECT(24,16), "G3x13y6");
    check_base_class_offset(lv, (D0*)(E3x13*), ABISELECT(8,4), "G3x13y6");
    check_base_class_offset(lv, (E3x13*), 0, "G3x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G3x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G3x13y6.ff");
    test_class_info(&lv, &cd_G3x13y6);
    dp->~G3x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x13y6(Test_G3x13y6, "G3x13y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G3x13y6C1Ev();
extern void _ZN7G3x13y6D1Ev();
Name_Map name_map_G3x13y6[] = {
  NSPAIR(_ZN7G3x13y6C1Ev),
  NSPAIR(_ZN7G3x13y6D1Ev),
  {0,0}
};
extern Class_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_E3x13;
extern VTBL_ENTRY _ZTI5E3x13[];
extern  VTBL_ENTRY _ZTV5E3x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x13y6[] = {
  // 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(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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E3x13,    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 _ZTI7G3x13y6[];
extern void _ZN5E3x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv)();
extern void ABISELECT(_ZThn40_N5E3x133fooEv,_ZThn28_N5E3x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x13y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x13y6[0]),
  (VTBL_ENTRY)&_ZN5E3x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G3x13y6[0]),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G3x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv),
};
extern VTBL_ENTRY _ZTV7G3x13y6[];
extern void _ZN5E3x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x13__7G3x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
  (VTBL_ENTRY)&_ZN5E3x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__5E3x13__7G3x13y6[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv)();
extern void ABISELECT(_ZThn40_N5E3x133fooEv,_ZThn28_N5E3x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x13__7G3x13y6[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV2C3__7G3x13y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__7G3x13y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x13y6[] = {
  {&(_ZTV7G3x13y6[5]),  5,13},
  {&(_tg__ZTV5E3x13__7G3x13y6[4]),  4,5},
  {&(_tg__ZTV2C3__5E3x13__7G3x13y6[3]),  3,3},
  {&(_tg__ZTV2A1__5E3x13__7G3x13y6[3]),  3,4},
  {&(_ZTV7G3x13y6[9]),  9,13},
  {&(_ZTV7G3x13y6[12]),  12,13},
  {&(_tg__ZTV2C3__7G3x13y6[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__7G3x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x13y6[];
extern  VTBL_ENTRY _ZTV7G3x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x13y6[];
static VTBL_ENTRY alt_thunk_names150[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E3x133fooEv,_ZThn28_N5E3x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E3x133fooEv,_ZThn28_N5E3x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x13y6 = {  "G3x13y6", // class name
  bases_G3x13y6, 6,
  &(vtc_G3x13y6[0]), // expected_vtbl_contents
  &(vtt_G3x13y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G3x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x13y6),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x13y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names150,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x13y7  : virtual E3x13 , virtual F0 {
  int ff;
  ~G3x13y7(); // tgen
  G3x13y7(); // tgen
};
//SIG(1 G3x13y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G3x13y7 ::~G3x13y7(){ note_dtor("G3x13y7", this);} // tgen
G3x13y7 ::G3x13y7(){ note_ctor("G3x13y7", this);} // tgen

static void Test_G3x13y7()
{
  extern Class_Descriptor cd_G3x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G3x13y7, buf);
    G3x13y7 *dp, &lv = *(dp=new (buf) G3x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G3x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x13y7)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,32), "G3x13y7");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,24), "G3x13y7");
    check_base_class_offset(lv, (C3*)(E3x13*), ABISELECT(32,20), "G3x13y7");
    check_base_class_offset(lv, (D0*)(E3x13*), ABISELECT(24,12), "G3x13y7");
    check_base_class_offset(lv, (E3x13*), ABISELECT(16,8), "G3x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G3x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G3x13y7.ff");
    test_class_info(&lv, &cd_G3x13y7);
    dp->~G3x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x13y7(Test_G3x13y7, "G3x13y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G3x13y7C1Ev();
extern void _ZN7G3x13y7D1Ev();
Name_Map name_map_G3x13y7[] = {
  NSPAIR(_ZN7G3x13y7C1Ev),
  NSPAIR(_ZN7G3x13y7D1Ev),
  {0,0}
};
extern Class_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_E3x13;
extern VTBL_ENTRY _ZTI5E3x13[];
extern  VTBL_ENTRY _ZTV5E3x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x13y7[] = {
  // 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(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_E3x13,    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_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 _ZTI7G3x13y7[];
extern void _ZN5E3x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv)();
extern void ABISELECT(_ZThn32_N5E3x133fooEv,_ZThn24_N5E3x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x13y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G3x13y7[0]),
  (VTBL_ENTRY)&_ZN5E3x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G3x13y7[0]),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G3x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv),
};
extern VTBL_ENTRY _ZTV7G3x13y7[];
extern void _ZN5E3x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x13__7G3x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
  (VTBL_ENTRY)&_ZN5E3x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__5E3x13__7G3x13y7[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv)();
extern void ABISELECT(_ZThn32_N5E3x133fooEv,_ZThn24_N5E3x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x13__7G3x13y7[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E3x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV2C3__7G3x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__7G3x13y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x13y7[] = {
  {&(_ZTV7G3x13y7[6]),  6,19},
  {&(_ZTV7G3x13y7[11]),  11,19},
  {&(_ZTV7G3x13y7[15]),  15,19},
  {&(_ZTV7G3x13y7[18]),  18,19},
  {&(_tg__ZTV5E3x13__7G3x13y7[4]),  4,5},
  {&(_tg__ZTV2C3__5E3x13__7G3x13y7[3]),  3,3},
  {&(_tg__ZTV2A1__5E3x13__7G3x13y7[3]),  3,4},
  {&(_tg__ZTV2C3__7G3x13y7[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__7G3x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x13y7[];
extern  VTBL_ENTRY _ZTV7G3x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x13y7[];
static VTBL_ENTRY alt_thunk_names151[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x133fooEv,_ZTv0_n12_N5E3x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x133fooEv,_ZThn24_N5E3x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x133fooEv,_ZThn24_N5E3x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x13y7 = {  "G3x13y7", // class name
  bases_G3x13y7, 6,
  &(vtc_G3x13y7[0]), // expected_vtbl_contents
  &(vtt_G3x13y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G3x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x13y7),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x13y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names151,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E4x13  : virtual C4 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E4x133fooEv
  ~E4x13(); // tgen
  E4x13(); // tgen
};
//SIG(-1 E4x13) C1{ VBC2{ BC3{ Fi} BC4{ v1 Fi} Fi} BC5{ Fi} v1 Fi}


void  E4x13 ::foo(){vfunc_called(this, "_ZN5E4x133fooEv");}
E4x13 ::~E4x13(){ note_dtor("E4x13", this);} // tgen
E4x13 ::E4x13(){ note_ctor("E4x13", this);} // tgen

static void Test_E4x13()
{
  extern Class_Descriptor cd_E4x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E4x13, buf);
    E4x13 *dp, &lv = *(dp=new (buf) E4x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E4x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E4x13)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(28,20), "E4x13");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(16,12), "E4x13");
    check_base_class_offset(lv, (C4*), ABISELECT(16,12), "E4x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E4x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E4x13.fd");
    test_class_info(&lv, &cd_E4x13);
    dp->~E4x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE4x13(Test_E4x13, "E4x13", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E4x13C1Ev();
extern void _ZN5E4x13D1Ev();
Name_Map name_map_E4x13[] = {
  NSPAIR(_ZN5E4x13C1Ev),
  NSPAIR(_ZN5E4x13D1Ev),
  {0,0}
};
extern Class_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_E4x13[] = {
  // 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
    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 _ZTI5E4x13[];
extern void _ZN5E4x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv)();
extern void ABISELECT(_ZThn16_N5E4x133fooEv,_ZThn12_N5E4x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E4x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x13[0]),
  (VTBL_ENTRY)&_ZN5E4x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E4x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv),
};
extern VTBL_ENTRY _ZTV5E4x13[];
static  VTT_ENTRY vtt_E4x13[] = {
  {&(_ZTV5E4x13[3]),  3,8},
  {&(_ZTV5E4x13[7]),  7,8},
};
extern VTBL_ENTRY _ZTI5E4x13[];
extern  VTBL_ENTRY _ZTV5E4x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x13[];
static VTBL_ENTRY alt_thunk_names152[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x133fooEv,_ZThn12_N5E4x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E4x13 = {  "E4x13", // class name
  bases_E4x13, 4,
  &(vtc_E4x13[0]), // expected_vtbl_contents
  &(vtt_E4x13[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E4x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E4x13),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E4x13),2, //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  G4x13y0  : E4x13 , F1 {
  int ff;
  ~G4x13y0(); // tgen
  G4x13y0(); // tgen
};
//SIG(1 G4x13y0) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G4x13y0 ::~G4x13y0(){ note_dtor("G4x13y0", this);} // tgen
G4x13y0 ::G4x13y0(){ note_ctor("G4x13y0", this);} // tgen

static void Test_G4x13y0()
{
  extern Class_Descriptor cd_G4x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G4x13y0, buf);
    G4x13y0 *dp, &lv = *(dp=new (buf) G4x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G4x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x13y0)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,32), "G4x13y0");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,24), "G4x13y0");
    check_base_class_offset(lv, (C4*)(E4x13*), ABISELECT(32,24), "G4x13y0");
    check_base_class_offset(lv, (D0*)(E4x13*), ABISELECT(8,4), "G4x13y0");
    check_base_class_offset(lv, (E4x13*), 0, "G4x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G4x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G4x13y0.ff");
    test_class_info(&lv, &cd_G4x13y0);
    dp->~G4x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x13y0(Test_G4x13y0, "G4x13y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G4x13y0C1Ev();
extern void _ZN7G4x13y0D1Ev();
Name_Map name_map_G4x13y0[] = {
  NSPAIR(_ZN7G4x13y0C1Ev),
  NSPAIR(_ZN7G4x13y0D1Ev),
  {0,0}
};
extern Class_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_E4x13;
extern VTBL_ENTRY _ZTI5E4x13[];
extern  VTBL_ENTRY _ZTV5E4x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x13y0[] = {
  // 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)
    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_E4x13,    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
    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 _ZTI7G4x13y0[];
extern void _ZN5E4x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv)();
extern void ABISELECT(_ZThn32_N5E4x133fooEv,_ZThn24_N5E4x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G4x13y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x13y0[0]),
  (VTBL_ENTRY)&_ZN5E4x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G4x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G4x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv),
};
extern VTBL_ENTRY _ZTV7G4x13y0[];
extern void _ZN5E4x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x13__7G4x13y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x13[0]),
  (VTBL_ENTRY)&_ZN5E4x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv)();
extern void ABISELECT(_ZThn32_N5E4x133fooEv,_ZThn24_N5E4x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B12C4__5E4x13__7G4x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E4x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv),
};
static  VTT_ENTRY vtt_G4x13y0[] = {
  {&(_ZTV7G4x13y0[3]),  3,11},
  {&(_tg__ZTV5E4x13__7G4x13y0[3]),  3,4},
  {&(_tg__ZTV2B12C4__5E4x13__7G4x13y0[3]),  3,4},
  {&(_ZTV7G4x13y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G4x13y0[];
extern  VTBL_ENTRY _ZTV7G4x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x13y0[];
static VTBL_ENTRY alt_thunk_names153[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E4x133fooEv,_ZThn24_N5E4x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E4x133fooEv,_ZThn24_N5E4x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G4x13y0 = {  "G4x13y0", // class name
  bases_G4x13y0, 6,
  &(vtc_G4x13y0[0]), // expected_vtbl_contents
  &(vtt_G4x13y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G4x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x13y0),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x13y0),4, //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  G4x13y1  : virtual E4x13 , F1 {
  int ff;
  ~G4x13y1(); // tgen
  G4x13y1(); // tgen
};
//SIG(1 G4x13y1) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G4x13y1 ::~G4x13y1(){ note_dtor("G4x13y1", this);} // tgen
G4x13y1 ::G4x13y1(){ note_ctor("G4x13y1", this);} // tgen

static void Test_G4x13y1()
{
  extern Class_Descriptor cd_G4x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G4x13y1, buf);
    G4x13y1 *dp, &lv = *(dp=new (buf) G4x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G4x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x13y1)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,32), "G4x13y1");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,24), "G4x13y1");
    check_base_class_offset(lv, (C4*)(E4x13*), ABISELECT(32,24), "G4x13y1");
    check_base_class_offset(lv, (D0*)(E4x13*), ABISELECT(24,16), "G4x13y1");
    check_base_class_offset(lv, (E4x13*), ABISELECT(16,12), "G4x13y1");
    check_base_class_offset(lv, (F1*), 0, "G4x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x13y1.ff");
    test_class_info(&lv, &cd_G4x13y1);
    dp->~G4x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x13y1(Test_G4x13y1, "G4x13y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G4x13y1C1Ev();
extern void _ZN7G4x13y1D1Ev();
Name_Map name_map_G4x13y1[] = {
  NSPAIR(_ZN7G4x13y1C1Ev),
  NSPAIR(_ZN7G4x13y1D1Ev),
  {0,0}
};
extern Class_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_E4x13;
extern VTBL_ENTRY _ZTI5E4x13[];
extern  VTBL_ENTRY _ZTV5E4x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x13y1[] = {
  // 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
    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,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_E4x13,    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 _ZTI7G4x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E4x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv)();
extern void ABISELECT(_ZThn16_N5E4x133fooEv,_ZThn12_N5E4x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G4x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G4x13y1[0]),
  (VTBL_ENTRY)&_ZN5E4x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G4x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv),
};
extern VTBL_ENTRY _ZTV7G4x13y1[];
extern void _ZN5E4x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x13__7G4x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x13[0]),
  (VTBL_ENTRY)&_ZN5E4x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv)();
extern void ABISELECT(_ZThn16_N5E4x133fooEv,_ZThn12_N5E4x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B12C4__5E4x13__7G4x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E4x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv),
};
static  VTT_ENTRY vtt_G4x13y1[] = {
  {&(_ZTV7G4x13y1[4]),  4,14},
  {&(_ZTV7G4x13y1[9]),  9,14},
  {&(_ZTV7G4x13y1[13]),  13,14},
  {&(_tg__ZTV5E4x13__7G4x13y1[3]),  3,4},
  {&(_tg__ZTV2B12C4__5E4x13__7G4x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G4x13y1[];
extern  VTBL_ENTRY _ZTV7G4x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x13y1[];
static VTBL_ENTRY alt_thunk_names154[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x133fooEv,_ZThn12_N5E4x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x133fooEv,_ZThn12_N5E4x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G4x13y1 = {  "G4x13y1", // class name
  bases_G4x13y1, 6,
  &(vtc_G4x13y1[0]), // expected_vtbl_contents
  &(vtt_G4x13y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G4x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x13y1),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x13y1),5, //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  G4x13y2  : E4x13 , virtual F1 {
  int ff;
  ~G4x13y2(); // tgen
  G4x13y2(); // tgen
};
//SIG(1 G4x13y2) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G4x13y2 ::~G4x13y2(){ note_dtor("G4x13y2", this);} // tgen
G4x13y2 ::G4x13y2(){ note_ctor("G4x13y2", this);} // tgen

static void Test_G4x13y2()
{
  extern Class_Descriptor cd_G4x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G4x13y2, buf);
    G4x13y2 *dp, &lv = *(dp=new (buf) G4x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G4x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x13y2)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(36,24), "G4x13y2");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(24,16), "G4x13y2");
    check_base_class_offset(lv, (C4*)(E4x13*), ABISELECT(24,16), "G4x13y2");
    check_base_class_offset(lv, (D0*)(E4x13*), ABISELECT(8,4), "G4x13y2");
    check_base_class_offset(lv, (E4x13*), 0, "G4x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G4x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G4x13y2.ff");
    test_class_info(&lv, &cd_G4x13y2);
    dp->~G4x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x13y2(Test_G4x13y2, "G4x13y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G4x13y2C1Ev();
extern void _ZN7G4x13y2D1Ev();
Name_Map name_map_G4x13y2[] = {
  NSPAIR(_ZN7G4x13y2C1Ev),
  NSPAIR(_ZN7G4x13y2D1Ev),
  {0,0}
};
extern Class_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_E4x13;
extern VTBL_ENTRY _ZTI5E4x13[];
extern  VTBL_ENTRY _ZTV5E4x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x13y2[] = {
  // 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
    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(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_E4x13,    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)
    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 _ZTI7G4x13y2[];
extern void _ZN5E4x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv)();
extern void ABISELECT(_ZThn24_N5E4x133fooEv,_ZThn16_N5E4x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x13y2[] = {
  ABISELECT(48,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x13y2[0]),
  (VTBL_ENTRY)&_ZN5E4x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G4x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G4x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G4x13y2[];
extern void _ZN5E4x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x13__7G4x13y2[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x13[0]),
  (VTBL_ENTRY)&_ZN5E4x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv)();
extern void ABISELECT(_ZThn24_N5E4x133fooEv,_ZThn16_N5E4x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B12C4__5E4x13__7G4x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E4x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv),
};
static  VTT_ENTRY vtt_G4x13y2[] = {
  {&(_ZTV7G4x13y2[4]),  4,13},
  {&(_tg__ZTV5E4x13__7G4x13y2[3]),  3,4},
  {&(_tg__ZTV2B12C4__5E4x13__7G4x13y2[3]),  3,4},
  {&(_ZTV7G4x13y2[8]),  8,13},
  {&(_ZTV7G4x13y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G4x13y2[];
extern  VTBL_ENTRY _ZTV7G4x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x13y2[];
static VTBL_ENTRY alt_thunk_names155[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E4x133fooEv,_ZThn16_N5E4x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E4x133fooEv,_ZThn16_N5E4x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G4x13y2 = {  "G4x13y2", // class name
  bases_G4x13y2, 6,
  &(vtc_G4x13y2[0]), // expected_vtbl_contents
  &(vtt_G4x13y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G4x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x13y2),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x13y2),5, //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  G4x13y3  : virtual E4x13 , virtual F1 {
  int ff;
  ~G4x13y3(); // tgen
  G4x13y3(); // tgen
};
//SIG(1 G4x13y3) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G4x13y3 ::~G4x13y3(){ note_dtor("G4x13y3", this);} // tgen
G4x13y3 ::G4x13y3(){ note_ctor("G4x13y3", this);} // tgen

static void Test_G4x13y3()
{
  extern Class_Descriptor cd_G4x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G4x13y3, buf);
    G4x13y3 *dp, &lv = *(dp=new (buf) G4x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G4x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x13y3)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,28), "G4x13y3");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,20), "G4x13y3");
    check_base_class_offset(lv, (C4*)(E4x13*), ABISELECT(32,20), "G4x13y3");
    check_base_class_offset(lv, (D0*)(E4x13*), ABISELECT(24,12), "G4x13y3");
    check_base_class_offset(lv, (E4x13*), ABISELECT(16,8), "G4x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G4x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G4x13y3.ff");
    test_class_info(&lv, &cd_G4x13y3);
    dp->~G4x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x13y3(Test_G4x13y3, "G4x13y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G4x13y3C1Ev();
extern void _ZN7G4x13y3D1Ev();
Name_Map name_map_G4x13y3[] = {
  NSPAIR(_ZN7G4x13y3C1Ev),
  NSPAIR(_ZN7G4x13y3D1Ev),
  {0,0}
};
extern Class_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_E4x13;
extern VTBL_ENTRY _ZTI5E4x13[];
extern  VTBL_ENTRY _ZTV5E4x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x13y3[] = {
  // 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(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_E4x13,    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 _ZTI7G4x13y3[];
extern void _ZN5E4x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv)();
extern void ABISELECT(_ZThn16_N5E4x133fooEv,_ZThn12_N5E4x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x13y3[] = {
  ABISELECT(56,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x13y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G4x13y3[0]),
  (VTBL_ENTRY)&_ZN5E4x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G4x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G4x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G4x13y3[];
extern void _ZN5E4x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x13__7G4x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x13[0]),
  (VTBL_ENTRY)&_ZN5E4x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv)();
extern void ABISELECT(_ZThn16_N5E4x133fooEv,_ZThn12_N5E4x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B12C4__5E4x13__7G4x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E4x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv),
};
static  VTT_ENTRY vtt_G4x13y3[] = {
  {&(_ZTV7G4x13y3[5]),  5,18},
  {&(_ZTV7G4x13y3[9]),  9,18},
  {&(_ZTV7G4x13y3[13]),  13,18},
  {&(_ZTV7G4x13y3[17]),  17,18},
  {&(_tg__ZTV5E4x13__7G4x13y3[3]),  3,4},
  {&(_tg__ZTV2B12C4__5E4x13__7G4x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G4x13y3[];
extern  VTBL_ENTRY _ZTV7G4x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x13y3[];
static VTBL_ENTRY alt_thunk_names156[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x133fooEv,_ZThn12_N5E4x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x133fooEv,_ZThn12_N5E4x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G4x13y3 = {  "G4x13y3", // class name
  bases_G4x13y3, 6,
  &(vtc_G4x13y3[0]), // expected_vtbl_contents
  &(vtt_G4x13y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G4x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x13y3),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x13y3),6, //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  G4x13y4  : E4x13 , F0 {
  int ff;
  ~G4x13y4(); // tgen
  G4x13y4(); // tgen
};
//SIG(1 G4x13y4) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G4x13y4 ::~G4x13y4(){ note_dtor("G4x13y4", this);} // tgen
G4x13y4 ::G4x13y4(){ note_ctor("G4x13y4", this);} // tgen

static void Test_G4x13y4()
{
  extern Class_Descriptor cd_G4x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x13y4, buf);
    G4x13y4 *dp, &lv = *(dp=new (buf) G4x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x13y4)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(36,28), "G4x13y4");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(24,20), "G4x13y4");
    check_base_class_offset(lv, (C4*)(E4x13*), ABISELECT(24,20), "G4x13y4");
    check_base_class_offset(lv, (D0*)(E4x13*), ABISELECT(8,4), "G4x13y4");
    check_base_class_offset(lv, (E4x13*), 0, "G4x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G4x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G4x13y4.ff");
    test_class_info(&lv, &cd_G4x13y4);
    dp->~G4x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x13y4(Test_G4x13y4, "G4x13y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G4x13y4C1Ev();
extern void _ZN7G4x13y4D1Ev();
Name_Map name_map_G4x13y4[] = {
  NSPAIR(_ZN7G4x13y4C1Ev),
  NSPAIR(_ZN7G4x13y4D1Ev),
  {0,0}
};
extern Class_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_E4x13;
extern VTBL_ENTRY _ZTI5E4x13[];
extern  VTBL_ENTRY _ZTV5E4x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x13y4[] = {
  // 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
    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,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_E4x13,    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 _ZTI7G4x13y4[];
extern void _ZN5E4x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv)();
extern void ABISELECT(_ZThn24_N5E4x133fooEv,_ZThn20_N5E4x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G4x13y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x13y4[0]),
  (VTBL_ENTRY)&_ZN5E4x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G4x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv),
};
extern VTBL_ENTRY _ZTV7G4x13y4[];
extern void _ZN5E4x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x13__7G4x13y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x13[0]),
  (VTBL_ENTRY)&_ZN5E4x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv)();
extern void ABISELECT(_ZThn24_N5E4x133fooEv,_ZThn20_N5E4x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B12C4__5E4x13__7G4x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E4x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv),
};
static  VTT_ENTRY vtt_G4x13y4[] = {
  {&(_ZTV7G4x13y4[3]),  3,8},
  {&(_tg__ZTV5E4x13__7G4x13y4[3]),  3,4},
  {&(_tg__ZTV2B12C4__5E4x13__7G4x13y4[3]),  3,4},
  {&(_ZTV7G4x13y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G4x13y4[];
extern  VTBL_ENTRY _ZTV7G4x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x13y4[];
static VTBL_ENTRY alt_thunk_names157[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E4x133fooEv,_ZThn20_N5E4x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E4x133fooEv,_ZThn20_N5E4x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G4x13y4 = {  "G4x13y4", // class name
  bases_G4x13y4, 6,
  &(vtc_G4x13y4[0]), // expected_vtbl_contents
  &(vtt_G4x13y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G4x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x13y4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x13y4),4, //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  G4x13y5  : virtual E4x13 , F0 {
  int ff;
  ~G4x13y5(); // tgen
  G4x13y5(); // tgen
};
//SIG(1 G4x13y5) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G4x13y5 ::~G4x13y5(){ note_dtor("G4x13y5", this);} // tgen
G4x13y5 ::G4x13y5(){ note_ctor("G4x13y5", this);} // tgen

static void Test_G4x13y5()
{
  extern Class_Descriptor cd_G4x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G4x13y5, buf);
    G4x13y5 *dp, &lv = *(dp=new (buf) G4x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G4x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x13y5)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,32), "G4x13y5");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,24), "G4x13y5");
    check_base_class_offset(lv, (C4*)(E4x13*), ABISELECT(32,24), "G4x13y5");
    check_base_class_offset(lv, (D0*)(E4x13*), ABISELECT(24,16), "G4x13y5");
    check_base_class_offset(lv, (E4x13*), ABISELECT(16,12), "G4x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G4x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x13y5.ff");
    test_class_info(&lv, &cd_G4x13y5);
    dp->~G4x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x13y5(Test_G4x13y5, "G4x13y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G4x13y5C1Ev();
extern void _ZN7G4x13y5D1Ev();
Name_Map name_map_G4x13y5[] = {
  NSPAIR(_ZN7G4x13y5C1Ev),
  NSPAIR(_ZN7G4x13y5D1Ev),
  {0,0}
};
extern Class_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_E4x13;
extern VTBL_ENTRY _ZTI5E4x13[];
extern  VTBL_ENTRY _ZTV5E4x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x13y5[] = {
  // 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
    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,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_E4x13,    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 _ZTI7G4x13y5[];
extern void _ZN5E4x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv)();
extern void ABISELECT(_ZThn16_N5E4x133fooEv,_ZThn12_N5E4x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G4x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x13y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G4x13y5[0]),
  (VTBL_ENTRY)&_ZN5E4x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G4x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv),
};
extern VTBL_ENTRY _ZTV7G4x13y5[];
extern void _ZN5E4x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x13__7G4x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x13[0]),
  (VTBL_ENTRY)&_ZN5E4x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv)();
extern void ABISELECT(_ZThn16_N5E4x133fooEv,_ZThn12_N5E4x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B12C4__5E4x13__7G4x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E4x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv),
};
static  VTT_ENTRY vtt_G4x13y5[] = {
  {&(_ZTV7G4x13y5[4]),  4,13},
  {&(_ZTV7G4x13y5[8]),  8,13},
  {&(_ZTV7G4x13y5[12]),  12,13},
  {&(_tg__ZTV5E4x13__7G4x13y5[3]),  3,4},
  {&(_tg__ZTV2B12C4__5E4x13__7G4x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G4x13y5[];
extern  VTBL_ENTRY _ZTV7G4x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x13y5[];
static VTBL_ENTRY alt_thunk_names158[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x133fooEv,_ZThn12_N5E4x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x133fooEv,_ZThn12_N5E4x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G4x13y5 = {  "G4x13y5", // class name
  bases_G4x13y5, 6,
  &(vtc_G4x13y5[0]), // expected_vtbl_contents
  &(vtt_G4x13y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G4x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x13y5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x13y5),5, //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  G4x13y6  : E4x13 , virtual F0 {
  int ff;
  ~G4x13y6(); // tgen
  G4x13y6(); // tgen
};
//SIG(1 G4x13y6) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G4x13y6 ::~G4x13y6(){ note_dtor("G4x13y6", this);} // tgen
G4x13y6 ::G4x13y6(){ note_ctor("G4x13y6", this);} // tgen

static void Test_G4x13y6()
{
  extern Class_Descriptor cd_G4x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x13y6, buf);
    G4x13y6 *dp, &lv = *(dp=new (buf) G4x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x13y6)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(36,24), "G4x13y6");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(24,16), "G4x13y6");
    check_base_class_offset(lv, (C4*)(E4x13*), ABISELECT(24,16), "G4x13y6");
    check_base_class_offset(lv, (D0*)(E4x13*), ABISELECT(8,4), "G4x13y6");
    check_base_class_offset(lv, (E4x13*), 0, "G4x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G4x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G4x13y6.ff");
    test_class_info(&lv, &cd_G4x13y6);
    dp->~G4x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x13y6(Test_G4x13y6, "G4x13y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G4x13y6C1Ev();
extern void _ZN7G4x13y6D1Ev();
Name_Map name_map_G4x13y6[] = {
  NSPAIR(_ZN7G4x13y6C1Ev),
  NSPAIR(_ZN7G4x13y6D1Ev),
  {0,0}
};
extern Class_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_E4x13;
extern VTBL_ENTRY _ZTI5E4x13[];
extern  VTBL_ENTRY _ZTV5E4x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x13y6[] = {
  // 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
    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(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_E4x13,    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 _ZTI7G4x13y6[];
extern void _ZN5E4x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv)();
extern void ABISELECT(_ZThn24_N5E4x133fooEv,_ZThn16_N5E4x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G4x13y6[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x13y6[0]),
  (VTBL_ENTRY)&_ZN5E4x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G4x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv),
};
extern VTBL_ENTRY _ZTV7G4x13y6[];
extern void _ZN5E4x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x13__7G4x13y6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x13[0]),
  (VTBL_ENTRY)&_ZN5E4x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv)();
extern void ABISELECT(_ZThn24_N5E4x133fooEv,_ZThn16_N5E4x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B12C4__5E4x13__7G4x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E4x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv),
};
static  VTT_ENTRY vtt_G4x13y6[] = {
  {&(_ZTV7G4x13y6[4]),  4,9},
  {&(_tg__ZTV5E4x13__7G4x13y6[3]),  3,4},
  {&(_tg__ZTV2B12C4__5E4x13__7G4x13y6[3]),  3,4},
  {&(_ZTV7G4x13y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G4x13y6[];
extern  VTBL_ENTRY _ZTV7G4x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x13y6[];
static VTBL_ENTRY alt_thunk_names159[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E4x133fooEv,_ZThn16_N5E4x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E4x133fooEv,_ZThn16_N5E4x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G4x13y6 = {  "G4x13y6", // class name
  bases_G4x13y6, 6,
  &(vtc_G4x13y6[0]), // expected_vtbl_contents
  &(vtt_G4x13y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G4x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x13y6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x13y6),4, //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  G4x13y7  : virtual E4x13 , virtual F0 {
  int ff;
  ~G4x13y7(); // tgen
  G4x13y7(); // tgen
};
//SIG(1 G4x13y7) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G4x13y7 ::~G4x13y7(){ note_dtor("G4x13y7", this);} // tgen
G4x13y7 ::G4x13y7(){ note_ctor("G4x13y7", this);} // tgen

static void Test_G4x13y7()
{
  extern Class_Descriptor cd_G4x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G4x13y7, buf);
    G4x13y7 *dp, &lv = *(dp=new (buf) G4x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G4x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x13y7)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,28), "G4x13y7");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,20), "G4x13y7");
    check_base_class_offset(lv, (C4*)(E4x13*), ABISELECT(32,20), "G4x13y7");
    check_base_class_offset(lv, (D0*)(E4x13*), ABISELECT(24,12), "G4x13y7");
    check_base_class_offset(lv, (E4x13*), ABISELECT(16,8), "G4x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G4x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G4x13y7.ff");
    test_class_info(&lv, &cd_G4x13y7);
    dp->~G4x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x13y7(Test_G4x13y7, "G4x13y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G4x13y7C1Ev();
extern void _ZN7G4x13y7D1Ev();
Name_Map name_map_G4x13y7[] = {
  NSPAIR(_ZN7G4x13y7C1Ev),
  NSPAIR(_ZN7G4x13y7D1Ev),
  {0,0}
};
extern Class_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_E4x13;
extern VTBL_ENTRY _ZTI5E4x13[];
extern  VTBL_ENTRY _ZTV5E4x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x13y7[] = {
  // 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(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_E4x13,    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 _ZTI7G4x13y7[];
extern void _ZN5E4x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv)();
extern void ABISELECT(_ZThn16_N5E4x133fooEv,_ZThn12_N5E4x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G4x13y7[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x13y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G4x13y7[0]),
  (VTBL_ENTRY)&_ZN5E4x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G4x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv),
};
extern VTBL_ENTRY _ZTV7G4x13y7[];
extern void _ZN5E4x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x13__7G4x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x13[0]),
  (VTBL_ENTRY)&_ZN5E4x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv)();
extern void ABISELECT(_ZThn16_N5E4x133fooEv,_ZThn12_N5E4x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B12C4__5E4x13__7G4x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E4x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv),
};
static  VTT_ENTRY vtt_G4x13y7[] = {
  {&(_ZTV7G4x13y7[5]),  5,14},
  {&(_ZTV7G4x13y7[9]),  9,14},
  {&(_ZTV7G4x13y7[13]),  13,14},
  {&(_tg__ZTV5E4x13__7G4x13y7[3]),  3,4},
  {&(_tg__ZTV2B12C4__5E4x13__7G4x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G4x13y7[];
extern  VTBL_ENTRY _ZTV7G4x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x13y7[];
static VTBL_ENTRY alt_thunk_names160[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E4x133fooEv,_ZTv0_n12_N5E4x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x133fooEv,_ZThn12_N5E4x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x133fooEv,_ZThn12_N5E4x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G4x13y7 = {  "G4x13y7", // class name
  bases_G4x13y7, 6,
  &(vtc_G4x13y7[0]), // expected_vtbl_contents
  &(vtt_G4x13y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G4x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x13y7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x13y7),5, //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  E5x13  : virtual C5 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E5x133fooEv
  ~E5x13(); // tgen
  E5x13(); // tgen
};
//SIG(-1 E5x13) C1{ VBC2{ BC3{ v1 Fi} BC4{ v1 Fi} Fi} BC5{ Fi} v1 Fi}


void  E5x13 ::foo(){vfunc_called(this, "_ZN5E5x133fooEv");}
E5x13 ::~E5x13(){ note_dtor("E5x13", this);} // tgen
E5x13 ::E5x13(){ note_ctor("E5x13", this);} // tgen

static void Test_E5x13()
{
  extern Class_Descriptor cd_E5x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E5x13, buf);
    E5x13 *dp, &lv = *(dp=new (buf) E5x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E5x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E5x13)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(16,12), "E5x13");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(32,20), "E5x13");
    check_base_class_offset(lv, (C5*), ABISELECT(16,12), "E5x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E5x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E5x13.fd");
    test_class_info(&lv, &cd_E5x13);
    dp->~E5x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE5x13(Test_E5x13, "E5x13", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E5x13C1Ev();
extern void _ZN5E5x13D1Ev();
Name_Map name_map_E5x13[] = {
  NSPAIR(_ZN5E5x13C1Ev),
  NSPAIR(_ZN5E5x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x13[] = {
  // 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
    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 _ZTI5E5x13[];
extern void _ZN5E5x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv)();
extern void ABISELECT(_ZThn16_N5E5x133fooEv,_ZThn12_N5E5x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv)();
static  VTBL_ENTRY vtc_E5x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&_ZN5E5x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv),
};
extern VTBL_ENTRY _ZTV5E5x13[];
static  VTT_ENTRY vtt_E5x13[] = {
  {&(_ZTV5E5x13[3]),  3,11},
  {&(_ZTV5E5x13[7]),  7,11},
  {&(_ZTV5E5x13[10]),  10,11},
};
extern VTBL_ENTRY _ZTI5E5x13[];
extern  VTBL_ENTRY _ZTV5E5x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x13[];
static VTBL_ENTRY alt_thunk_names161[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x133fooEv,_ZThn12_N5E5x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E5x13 = {  "E5x13", // class name
  bases_E5x13, 4,
  &(vtc_E5x13[0]), // expected_vtbl_contents
  &(vtt_E5x13[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E5x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E5x13),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E5x13),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names161,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x13y0  : E5x13 , F1 {
  int ff;
  ~G5x13y0(); // tgen
  G5x13y0(); // tgen
};
//SIG(1 G5x13y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G5x13y0 ::~G5x13y0(){ note_dtor("G5x13y0", this);} // tgen
G5x13y0 ::G5x13y0(){ note_ctor("G5x13y0", this);} // tgen

static void Test_G5x13y0()
{
  extern Class_Descriptor cd_G5x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G5x13y0, buf);
    G5x13y0 *dp, &lv = *(dp=new (buf) G5x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G5x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x13y0)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,24), "G5x13y0");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,32), "G5x13y0");
    check_base_class_offset(lv, (C5*)(E5x13*), ABISELECT(32,24), "G5x13y0");
    check_base_class_offset(lv, (D0*)(E5x13*), ABISELECT(8,4), "G5x13y0");
    check_base_class_offset(lv, (E5x13*), 0, "G5x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G5x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G5x13y0.ff");
    test_class_info(&lv, &cd_G5x13y0);
    dp->~G5x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x13y0(Test_G5x13y0, "G5x13y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G5x13y0C1Ev();
extern void _ZN7G5x13y0D1Ev();
Name_Map name_map_G5x13y0[] = {
  NSPAIR(_ZN7G5x13y0C1Ev),
  NSPAIR(_ZN7G5x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x13;
extern VTBL_ENTRY _ZTI5E5x13[];
extern  VTBL_ENTRY _ZTV5E5x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x13y0[] = {
  // 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)
    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_E5x13,    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
    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 _ZTI7G5x13y0[];
extern void _ZN5E5x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv)();
extern void ABISELECT(_ZThn32_N5E5x133fooEv,_ZThn24_N5E5x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv)();
static  VTBL_ENTRY vtc_G5x13y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x13y0[0]),
  (VTBL_ENTRY)&_ZN5E5x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G5x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G5x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G5x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv),
};
extern VTBL_ENTRY _ZTV7G5x13y0[];
extern void _ZN5E5x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x13__7G5x13y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&_ZN5E5x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv)();
extern void ABISELECT(_ZThn32_N5E5x133fooEv,_ZThn24_N5E5x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C5__5E5x13__7G5x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv)();
static  VTBL_ENTRY _tg__ZTV2B12C5__5E5x13__7G5x13y0[] = {
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv),
};
static  VTT_ENTRY vtt_G5x13y0[] = {
  {&(_ZTV7G5x13y0[3]),  3,14},
  {&(_tg__ZTV5E5x13__7G5x13y0[3]),  3,4},
  {&(_tg__ZTV2A12C5__5E5x13__7G5x13y0[3]),  3,4},
  {&(_tg__ZTV2B12C5__5E5x13__7G5x13y0[2]),  2,3},
  {&(_ZTV7G5x13y0[10]),  10,14},
  {&(_ZTV7G5x13y0[13]),  13,14},
};
extern VTBL_ENTRY _ZTI7G5x13y0[];
extern  VTBL_ENTRY _ZTV7G5x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x13y0[];
static VTBL_ENTRY alt_thunk_names162[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E5x133fooEv,_ZThn24_N5E5x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E5x133fooEv,_ZThn24_N5E5x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G5x13y0 = {  "G5x13y0", // class name
  bases_G5x13y0, 6,
  &(vtc_G5x13y0[0]), // expected_vtbl_contents
  &(vtt_G5x13y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G5x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x13y0),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x13y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names162,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x13y1  : virtual E5x13 , F1 {
  int ff;
  ~G5x13y1(); // tgen
  G5x13y1(); // tgen
};
//SIG(1 G5x13y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G5x13y1 ::~G5x13y1(){ note_dtor("G5x13y1", this);} // tgen
G5x13y1 ::G5x13y1(){ note_ctor("G5x13y1", this);} // tgen

static void Test_G5x13y1()
{
  extern Class_Descriptor cd_G5x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G5x13y1, buf);
    G5x13y1 *dp, &lv = *(dp=new (buf) G5x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G5x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x13y1)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,24), "G5x13y1");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,32), "G5x13y1");
    check_base_class_offset(lv, (C5*)(E5x13*), ABISELECT(32,24), "G5x13y1");
    check_base_class_offset(lv, (D0*)(E5x13*), ABISELECT(24,16), "G5x13y1");
    check_base_class_offset(lv, (E5x13*), ABISELECT(16,12), "G5x13y1");
    check_base_class_offset(lv, (F1*), 0, "G5x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x13y1.ff");
    test_class_info(&lv, &cd_G5x13y1);
    dp->~G5x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x13y1(Test_G5x13y1, "G5x13y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G5x13y1C1Ev();
extern void _ZN7G5x13y1D1Ev();
Name_Map name_map_G5x13y1[] = {
  NSPAIR(_ZN7G5x13y1C1Ev),
  NSPAIR(_ZN7G5x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x13;
extern VTBL_ENTRY _ZTI5E5x13[];
extern  VTBL_ENTRY _ZTV5E5x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x13y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //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,32), //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,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_E5x13,    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_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 _ZTI7G5x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E5x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv)();
extern void ABISELECT(_ZThn16_N5E5x133fooEv,_ZThn12_N5E5x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv)();
static  VTBL_ENTRY vtc_G5x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G5x13y1[0]),
  (VTBL_ENTRY)&_ZN5E5x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G5x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G5x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv),
};
extern VTBL_ENTRY _ZTV7G5x13y1[];
extern void _ZN5E5x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x13__7G5x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&_ZN5E5x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv)();
extern void ABISELECT(_ZThn16_N5E5x133fooEv,_ZThn12_N5E5x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C5__5E5x13__7G5x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv)();
static  VTBL_ENTRY _tg__ZTV2B12C5__5E5x13__7G5x13y1[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv),
};
static  VTT_ENTRY vtt_G5x13y1[] = {
  {&(_ZTV7G5x13y1[4]),  4,17},
  {&(_ZTV7G5x13y1[9]),  9,17},
  {&(_ZTV7G5x13y1[13]),  13,17},
  {&(_ZTV7G5x13y1[16]),  16,17},
  {&(_tg__ZTV5E5x13__7G5x13y1[3]),  3,4},
  {&(_tg__ZTV2A12C5__5E5x13__7G5x13y1[3]),  3,4},
  {&(_tg__ZTV2B12C5__5E5x13__7G5x13y1[2]),  2,3},
};
extern VTBL_ENTRY _ZTI7G5x13y1[];
extern  VTBL_ENTRY _ZTV7G5x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x13y1[];
static VTBL_ENTRY alt_thunk_names163[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x133fooEv,_ZThn12_N5E5x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x133fooEv,_ZThn12_N5E5x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G5x13y1 = {  "G5x13y1", // class name
  bases_G5x13y1, 6,
  &(vtc_G5x13y1[0]), // expected_vtbl_contents
  &(vtt_G5x13y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G5x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x13y1),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x13y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names163,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x13y2  : E5x13 , virtual F1 {
  int ff;
  ~G5x13y2(); // tgen
  G5x13y2(); // tgen
};
//SIG(1 G5x13y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G5x13y2 ::~G5x13y2(){ note_dtor("G5x13y2", this);} // tgen
G5x13y2 ::G5x13y2(){ note_ctor("G5x13y2", this);} // tgen

static void Test_G5x13y2()
{
  extern Class_Descriptor cd_G5x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G5x13y2, buf);
    G5x13y2 *dp, &lv = *(dp=new (buf) G5x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G5x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x13y2)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(24,16), "G5x13y2");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(40,24), "G5x13y2");
    check_base_class_offset(lv, (C5*)(E5x13*), ABISELECT(24,16), "G5x13y2");
    check_base_class_offset(lv, (D0*)(E5x13*), ABISELECT(8,4), "G5x13y2");
    check_base_class_offset(lv, (E5x13*), 0, "G5x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G5x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G5x13y2.ff");
    test_class_info(&lv, &cd_G5x13y2);
    dp->~G5x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x13y2(Test_G5x13y2, "G5x13y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G5x13y2C1Ev();
extern void _ZN7G5x13y2D1Ev();
Name_Map name_map_G5x13y2[] = {
  NSPAIR(_ZN7G5x13y2C1Ev),
  NSPAIR(_ZN7G5x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x13;
extern VTBL_ENTRY _ZTI5E5x13[];
extern  VTBL_ENTRY _ZTV5E5x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x13y2[] = {
  // 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)
    0, //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
    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(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_E5x13,    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
    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 _ZTI7G5x13y2[];
extern void _ZN5E5x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv)();
extern void ABISELECT(_ZThn24_N5E5x133fooEv,_ZThn16_N5E5x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x13y2[] = {
  ABISELECT(56,36),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x13y2[0]),
  (VTBL_ENTRY)&_ZN5E5x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G5x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G5x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G5x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G5x13y2[];
extern void _ZN5E5x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x13__7G5x13y2[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&_ZN5E5x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv)();
extern void ABISELECT(_ZThn24_N5E5x133fooEv,_ZThn16_N5E5x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C5__5E5x13__7G5x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv)();
static  VTBL_ENTRY _tg__ZTV2B12C5__5E5x13__7G5x13y2[] = {
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv),
};
static  VTT_ENTRY vtt_G5x13y2[] = {
  {&(_ZTV7G5x13y2[4]),  4,16},
  {&(_tg__ZTV5E5x13__7G5x13y2[3]),  3,4},
  {&(_tg__ZTV2A12C5__5E5x13__7G5x13y2[3]),  3,4},
  {&(_tg__ZTV2B12C5__5E5x13__7G5x13y2[2]),  2,3},
  {&(_ZTV7G5x13y2[8]),  8,16},
  {&(_ZTV7G5x13y2[11]),  11,16},
  {&(_ZTV7G5x13y2[15]),  15,16},
};
extern VTBL_ENTRY _ZTI7G5x13y2[];
extern  VTBL_ENTRY _ZTV7G5x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x13y2[];
static VTBL_ENTRY alt_thunk_names164[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E5x133fooEv,_ZThn16_N5E5x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E5x133fooEv,_ZThn16_N5E5x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G5x13y2 = {  "G5x13y2", // class name
  bases_G5x13y2, 6,
  &(vtc_G5x13y2[0]), // expected_vtbl_contents
  &(vtt_G5x13y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G5x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x13y2),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x13y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names164,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x13y3  : virtual E5x13 , virtual F1 {
  int ff;
  ~G5x13y3(); // tgen
  G5x13y3(); // tgen
};
//SIG(1 G5x13y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G5x13y3 ::~G5x13y3(){ note_dtor("G5x13y3", this);} // tgen
G5x13y3 ::G5x13y3(){ note_ctor("G5x13y3", this);} // tgen

static void Test_G5x13y3()
{
  extern Class_Descriptor cd_G5x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G5x13y3, buf);
    G5x13y3 *dp, &lv = *(dp=new (buf) G5x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G5x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x13y3)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,20), "G5x13y3");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,28), "G5x13y3");
    check_base_class_offset(lv, (C5*)(E5x13*), ABISELECT(32,20), "G5x13y3");
    check_base_class_offset(lv, (D0*)(E5x13*), ABISELECT(24,12), "G5x13y3");
    check_base_class_offset(lv, (E5x13*), ABISELECT(16,8), "G5x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G5x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G5x13y3.ff");
    test_class_info(&lv, &cd_G5x13y3);
    dp->~G5x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x13y3(Test_G5x13y3, "G5x13y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G5x13y3C1Ev();
extern void _ZN7G5x13y3D1Ev();
Name_Map name_map_G5x13y3[] = {
  NSPAIR(_ZN7G5x13y3C1Ev),
  NSPAIR(_ZN7G5x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x13;
extern VTBL_ENTRY _ZTI5E5x13[];
extern  VTBL_ENTRY _ZTV5E5x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x13y3[] = {
  // 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(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_E5x13,    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
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //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
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G5x13y3[];
extern void _ZN5E5x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv)();
extern void ABISELECT(_ZThn16_N5E5x133fooEv,_ZThn12_N5E5x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x13y3[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x13y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G5x13y3[0]),
  (VTBL_ENTRY)&_ZN5E5x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G5x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G5x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G5x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G5x13y3[];
extern void _ZN5E5x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x13__7G5x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&_ZN5E5x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv)();
extern void ABISELECT(_ZThn16_N5E5x133fooEv,_ZThn12_N5E5x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C5__5E5x13__7G5x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv)();
static  VTBL_ENTRY _tg__ZTV2B12C5__5E5x13__7G5x13y3[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv),
};
static  VTT_ENTRY vtt_G5x13y3[] = {
  {&(_ZTV7G5x13y3[5]),  5,21},
  {&(_ZTV7G5x13y3[9]),  9,21},
  {&(_ZTV7G5x13y3[13]),  13,21},
  {&(_ZTV7G5x13y3[16]),  16,21},
  {&(_ZTV7G5x13y3[20]),  20,21},
  {&(_tg__ZTV5E5x13__7G5x13y3[3]),  3,4},
  {&(_tg__ZTV2A12C5__5E5x13__7G5x13y3[3]),  3,4},
  {&(_tg__ZTV2B12C5__5E5x13__7G5x13y3[2]),  2,3},
};
extern VTBL_ENTRY _ZTI7G5x13y3[];
extern  VTBL_ENTRY _ZTV7G5x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x13y3[];
static VTBL_ENTRY alt_thunk_names165[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x133fooEv,_ZThn12_N5E5x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x133fooEv,_ZThn12_N5E5x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G5x13y3 = {  "G5x13y3", // class name
  bases_G5x13y3, 6,
  &(vtc_G5x13y3[0]), // expected_vtbl_contents
  &(vtt_G5x13y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G5x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x13y3),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x13y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names165,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x13y4  : E5x13 , F0 {
  int ff;
  ~G5x13y4(); // tgen
  G5x13y4(); // tgen
};
//SIG(1 G5x13y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G5x13y4 ::~G5x13y4(){ note_dtor("G5x13y4", this);} // tgen
G5x13y4 ::G5x13y4(){ note_ctor("G5x13y4", this);} // tgen

static void Test_G5x13y4()
{
  extern Class_Descriptor cd_G5x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G5x13y4, buf);
    G5x13y4 *dp, &lv = *(dp=new (buf) G5x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G5x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x13y4)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(24,20), "G5x13y4");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(40,28), "G5x13y4");
    check_base_class_offset(lv, (C5*)(E5x13*), ABISELECT(24,20), "G5x13y4");
    check_base_class_offset(lv, (D0*)(E5x13*), ABISELECT(8,4), "G5x13y4");
    check_base_class_offset(lv, (E5x13*), 0, "G5x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G5x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G5x13y4.ff");
    test_class_info(&lv, &cd_G5x13y4);
    dp->~G5x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x13y4(Test_G5x13y4, "G5x13y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G5x13y4C1Ev();
extern void _ZN7G5x13y4D1Ev();
Name_Map name_map_G5x13y4[] = {
  NSPAIR(_ZN7G5x13y4C1Ev),
  NSPAIR(_ZN7G5x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x13;
extern VTBL_ENTRY _ZTI5E5x13[];
extern  VTBL_ENTRY _ZTV5E5x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x13y4[] = {
  // 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)
    0, //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
    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_E5x13,    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 _ZTI7G5x13y4[];
extern void _ZN5E5x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv)();
extern void ABISELECT(_ZThn24_N5E5x133fooEv,_ZThn20_N5E5x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv)();
static  VTBL_ENTRY vtc_G5x13y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x13y4[0]),
  (VTBL_ENTRY)&_ZN5E5x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G5x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G5x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv),
};
extern VTBL_ENTRY _ZTV7G5x13y4[];
extern void _ZN5E5x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x13__7G5x13y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&_ZN5E5x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv)();
extern void ABISELECT(_ZThn24_N5E5x133fooEv,_ZThn20_N5E5x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C5__5E5x13__7G5x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv)();
static  VTBL_ENTRY _tg__ZTV2B12C5__5E5x13__7G5x13y4[] = {
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv),
};
static  VTT_ENTRY vtt_G5x13y4[] = {
  {&(_ZTV7G5x13y4[3]),  3,11},
  {&(_tg__ZTV5E5x13__7G5x13y4[3]),  3,4},
  {&(_tg__ZTV2A12C5__5E5x13__7G5x13y4[3]),  3,4},
  {&(_tg__ZTV2B12C5__5E5x13__7G5x13y4[2]),  2,3},
  {&(_ZTV7G5x13y4[7]),  7,11},
  {&(_ZTV7G5x13y4[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G5x13y4[];
extern  VTBL_ENTRY _ZTV7G5x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x13y4[];
static VTBL_ENTRY alt_thunk_names166[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E5x133fooEv,_ZThn20_N5E5x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E5x133fooEv,_ZThn20_N5E5x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G5x13y4 = {  "G5x13y4", // class name
  bases_G5x13y4, 6,
  &(vtc_G5x13y4[0]), // expected_vtbl_contents
  &(vtt_G5x13y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G5x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x13y4),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x13y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names166,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x13y5  : virtual E5x13 , F0 {
  int ff;
  ~G5x13y5(); // tgen
  G5x13y5(); // tgen
};
//SIG(1 G5x13y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G5x13y5 ::~G5x13y5(){ note_dtor("G5x13y5", this);} // tgen
G5x13y5 ::G5x13y5(){ note_ctor("G5x13y5", this);} // tgen

static void Test_G5x13y5()
{
  extern Class_Descriptor cd_G5x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G5x13y5, buf);
    G5x13y5 *dp, &lv = *(dp=new (buf) G5x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G5x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x13y5)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,24), "G5x13y5");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,32), "G5x13y5");
    check_base_class_offset(lv, (C5*)(E5x13*), ABISELECT(32,24), "G5x13y5");
    check_base_class_offset(lv, (D0*)(E5x13*), ABISELECT(24,16), "G5x13y5");
    check_base_class_offset(lv, (E5x13*), ABISELECT(16,12), "G5x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G5x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x13y5.ff");
    test_class_info(&lv, &cd_G5x13y5);
    dp->~G5x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x13y5(Test_G5x13y5, "G5x13y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G5x13y5C1Ev();
extern void _ZN7G5x13y5D1Ev();
Name_Map name_map_G5x13y5[] = {
  NSPAIR(_ZN7G5x13y5C1Ev),
  NSPAIR(_ZN7G5x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x13;
extern VTBL_ENTRY _ZTI5E5x13[];
extern  VTBL_ENTRY _ZTV5E5x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x13y5[] = {
  // 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)
    0, //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
    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_E5x13,    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
    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 _ZTI7G5x13y5[];
extern void _ZN5E5x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv)();
extern void ABISELECT(_ZThn16_N5E5x133fooEv,_ZThn12_N5E5x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv)();
static  VTBL_ENTRY vtc_G5x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x13y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G5x13y5[0]),
  (VTBL_ENTRY)&_ZN5E5x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G5x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G5x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv),
};
extern VTBL_ENTRY _ZTV7G5x13y5[];
extern void _ZN5E5x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x13__7G5x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&_ZN5E5x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv)();
extern void ABISELECT(_ZThn16_N5E5x133fooEv,_ZThn12_N5E5x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C5__5E5x13__7G5x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv)();
static  VTBL_ENTRY _tg__ZTV2B12C5__5E5x13__7G5x13y5[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv),
};
static  VTT_ENTRY vtt_G5x13y5[] = {
  {&(_ZTV7G5x13y5[4]),  4,16},
  {&(_ZTV7G5x13y5[8]),  8,16},
  {&(_ZTV7G5x13y5[12]),  12,16},
  {&(_ZTV7G5x13y5[15]),  15,16},
  {&(_tg__ZTV5E5x13__7G5x13y5[3]),  3,4},
  {&(_tg__ZTV2A12C5__5E5x13__7G5x13y5[3]),  3,4},
  {&(_tg__ZTV2B12C5__5E5x13__7G5x13y5[2]),  2,3},
};
extern VTBL_ENTRY _ZTI7G5x13y5[];
extern  VTBL_ENTRY _ZTV7G5x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x13y5[];
static VTBL_ENTRY alt_thunk_names167[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x133fooEv,_ZThn12_N5E5x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x133fooEv,_ZThn12_N5E5x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G5x13y5 = {  "G5x13y5", // class name
  bases_G5x13y5, 6,
  &(vtc_G5x13y5[0]), // expected_vtbl_contents
  &(vtt_G5x13y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G5x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x13y5),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x13y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names167,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x13y6  : E5x13 , virtual F0 {
  int ff;
  ~G5x13y6(); // tgen
  G5x13y6(); // tgen
};
//SIG(1 G5x13y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G5x13y6 ::~G5x13y6(){ note_dtor("G5x13y6", this);} // tgen
G5x13y6 ::G5x13y6(){ note_ctor("G5x13y6", this);} // tgen

static void Test_G5x13y6()
{
  extern Class_Descriptor cd_G5x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G5x13y6, buf);
    G5x13y6 *dp, &lv = *(dp=new (buf) G5x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G5x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x13y6)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(24,16), "G5x13y6");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(40,24), "G5x13y6");
    check_base_class_offset(lv, (C5*)(E5x13*), ABISELECT(24,16), "G5x13y6");
    check_base_class_offset(lv, (D0*)(E5x13*), ABISELECT(8,4), "G5x13y6");
    check_base_class_offset(lv, (E5x13*), 0, "G5x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G5x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G5x13y6.ff");
    test_class_info(&lv, &cd_G5x13y6);
    dp->~G5x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x13y6(Test_G5x13y6, "G5x13y6", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G5x13y6C1Ev();
extern void _ZN7G5x13y6D1Ev();
Name_Map name_map_G5x13y6[] = {
  NSPAIR(_ZN7G5x13y6C1Ev),
  NSPAIR(_ZN7G5x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x13;
extern VTBL_ENTRY _ZTI5E5x13[];
extern  VTBL_ENTRY _ZTV5E5x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x13y6[] = {
  // 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)
    0, //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
    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(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_E5x13,    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 _ZTI7G5x13y6[];
extern void _ZN5E5x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv)();
extern void ABISELECT(_ZThn24_N5E5x133fooEv,_ZThn16_N5E5x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv)();
static  VTBL_ENTRY vtc_G5x13y6[] = {
  ABISELECT(56,36),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x13y6[0]),
  (VTBL_ENTRY)&_ZN5E5x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G5x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G5x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv),
};
extern VTBL_ENTRY _ZTV7G5x13y6[];
extern void _ZN5E5x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x13__7G5x13y6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&_ZN5E5x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv)();
extern void ABISELECT(_ZThn24_N5E5x133fooEv,_ZThn16_N5E5x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C5__5E5x13__7G5x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv)();
static  VTBL_ENTRY _tg__ZTV2B12C5__5E5x13__7G5x13y6[] = {
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv),
};
static  VTT_ENTRY vtt_G5x13y6[] = {
  {&(_ZTV7G5x13y6[4]),  4,12},
  {&(_tg__ZTV5E5x13__7G5x13y6[3]),  3,4},
  {&(_tg__ZTV2A12C5__5E5x13__7G5x13y6[3]),  3,4},
  {&(_tg__ZTV2B12C5__5E5x13__7G5x13y6[2]),  2,3},
  {&(_ZTV7G5x13y6[8]),  8,12},
  {&(_ZTV7G5x13y6[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G5x13y6[];
extern  VTBL_ENTRY _ZTV7G5x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x13y6[];
static VTBL_ENTRY alt_thunk_names168[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E5x133fooEv,_ZThn16_N5E5x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E5x133fooEv,_ZThn16_N5E5x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G5x13y6 = {  "G5x13y6", // class name
  bases_G5x13y6, 6,
  &(vtc_G5x13y6[0]), // expected_vtbl_contents
  &(vtt_G5x13y6[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G5x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x13y6),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x13y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names168,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x13y7  : virtual E5x13 , virtual F0 {
  int ff;
  ~G5x13y7(); // tgen
  G5x13y7(); // tgen
};
//SIG(1 G5x13y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G5x13y7 ::~G5x13y7(){ note_dtor("G5x13y7", this);} // tgen
G5x13y7 ::G5x13y7(){ note_ctor("G5x13y7", this);} // tgen

static void Test_G5x13y7()
{
  extern Class_Descriptor cd_G5x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G5x13y7, buf);
    G5x13y7 *dp, &lv = *(dp=new (buf) G5x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G5x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x13y7)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,20), "G5x13y7");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,28), "G5x13y7");
    check_base_class_offset(lv, (C5*)(E5x13*), ABISELECT(32,20), "G5x13y7");
    check_base_class_offset(lv, (D0*)(E5x13*), ABISELECT(24,12), "G5x13y7");
    check_base_class_offset(lv, (E5x13*), ABISELECT(16,8), "G5x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G5x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G5x13y7.ff");
    test_class_info(&lv, &cd_G5x13y7);
    dp->~G5x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x13y7(Test_G5x13y7, "G5x13y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G5x13y7C1Ev();
extern void _ZN7G5x13y7D1Ev();
Name_Map name_map_G5x13y7[] = {
  NSPAIR(_ZN7G5x13y7C1Ev),
  NSPAIR(_ZN7G5x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x13;
extern VTBL_ENTRY _ZTI5E5x13[];
extern  VTBL_ENTRY _ZTV5E5x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x13y7[] = {
  // 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(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_E5x13,    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_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 _ZTI7G5x13y7[];
extern void _ZN5E5x133fooEv();
extern void ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv)();
extern void ABISELECT(_ZThn16_N5E5x133fooEv,_ZThn12_N5E5x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv)();
static  VTBL_ENTRY vtc_G5x13y7[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x13y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G5x13y7[0]),
  (VTBL_ENTRY)&_ZN5E5x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G5x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G5x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv),
};
extern VTBL_ENTRY _ZTV7G5x13y7[];
extern void _ZN5E5x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x13__7G5x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&_ZN5E5x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv)();
extern void ABISELECT(_ZThn16_N5E5x133fooEv,_ZThn12_N5E5x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C5__5E5x13__7G5x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv)();
static  VTBL_ENTRY _tg__ZTV2B12C5__5E5x13__7G5x13y7[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E5x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x133fooEv,_ZTvn8_n12_N5E5x133fooEv),
};
static  VTT_ENTRY vtt_G5x13y7[] = {
  {&(_ZTV7G5x13y7[5]),  5,17},
  {&(_ZTV7G5x13y7[9]),  9,17},
  {&(_ZTV7G5x13y7[13]),  13,17},
  {&(_ZTV7G5x13y7[16]),  16,17},
  {&(_tg__ZTV5E5x13__7G5x13y7[3]),  3,4},
  {&(_tg__ZTV2A12C5__5E5x13__7G5x13y7[3]),  3,4},
  {&(_tg__ZTV2B12C5__5E5x13__7G5x13y7[2]),  2,3},
};
extern VTBL_ENTRY _ZTI7G5x13y7[];
extern  VTBL_ENTRY _ZTV7G5x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x13y7[];
static VTBL_ENTRY alt_thunk_names169[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E5x133fooEv,_ZTv0_n12_N5E5x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x133fooEv,_ZThn12_N5E5x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x133fooEv,_ZThn12_N5E5x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G5x13y7 = {  "G5x13y7", // class name
  bases_G5x13y7, 6,
  &(vtc_G5x13y7[0]), // expected_vtbl_contents
  &(vtt_G5x13y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G5x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x13y7),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x13y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names169,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E6x13  : virtual C6 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E6x133fooEv
  ~E6x13(); // tgen
  E6x13(); // tgen
};
//SIG(-1 E6x13) C1{ VBC2{ VBC3{ Fi} BC4{ v1 Fi} Fi} BC5{ Fi} v1 Fi}


void  E6x13 ::foo(){vfunc_called(this, "_ZN5E6x133fooEv");}
E6x13 ::~E6x13(){ note_dtor("E6x13", this);} // tgen
E6x13 ::E6x13(){ note_ctor("E6x13", this);} // tgen

static void Test_E6x13()
{
  extern Class_Descriptor cd_E6x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E6x13, buf);
    E6x13 *dp, &lv = *(dp=new (buf) E6x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E6x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E6x13)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(32,24), "E6x13");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(16,12), "E6x13");
    check_base_class_offset(lv, (C6*), ABISELECT(16,12), "E6x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E6x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E6x13.fd");
    test_class_info(&lv, &cd_E6x13);
    dp->~E6x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE6x13(Test_E6x13, "E6x13", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E6x13C1Ev();
extern void _ZN5E6x13D1Ev();
Name_Map name_map_E6x13[] = {
  NSPAIR(_ZN5E6x13C1Ev),
  NSPAIR(_ZN5E6x13D1Ev),
  {0,0}
};
extern Class_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_E6x13[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E6x13[];
extern void _ZN5E6x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv)();
extern void ABISELECT(_ZThn16_N5E6x133fooEv,_ZThn12_N5E6x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E6x13[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x13[0]),
  (VTBL_ENTRY)&_ZN5E6x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E6x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv),
};
extern VTBL_ENTRY _ZTV5E6x13[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__5E6x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E6x13[] = {
  {&(_ZTV5E6x13[4]),  4,10},
  {&(_ZTV5E6x13[9]),  9,10},
  {&(_tg__ZTV2C6__5E6x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E6x13[];
extern  VTBL_ENTRY _ZTV5E6x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x13[];
static VTBL_ENTRY alt_thunk_names170[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x133fooEv,_ZThn12_N5E6x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E6x13 = {  "E6x13", // class name
  bases_E6x13, 4,
  &(vtc_E6x13[0]), // expected_vtbl_contents
  &(vtt_E6x13[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E6x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E6x13),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E6x13),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names170,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x13y0  : E6x13 , F1 {
  int ff;
  ~G6x13y0(); // tgen
  G6x13y0(); // tgen
};
//SIG(1 G6x13y0) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G6x13y0 ::~G6x13y0(){ note_dtor("G6x13y0", this);} // tgen
G6x13y0 ::G6x13y0(){ note_ctor("G6x13y0", this);} // tgen

static void Test_G6x13y0()
{
  extern Class_Descriptor cd_G6x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G6x13y0, buf);
    G6x13y0 *dp, &lv = *(dp=new (buf) G6x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G6x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x13y0)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,36), "G6x13y0");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,24), "G6x13y0");
    check_base_class_offset(lv, (C6*)(E6x13*), ABISELECT(32,24), "G6x13y0");
    check_base_class_offset(lv, (D0*)(E6x13*), ABISELECT(8,4), "G6x13y0");
    check_base_class_offset(lv, (E6x13*), 0, "G6x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G6x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G6x13y0.ff");
    test_class_info(&lv, &cd_G6x13y0);
    dp->~G6x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x13y0(Test_G6x13y0, "G6x13y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G6x13y0C1Ev();
extern void _ZN7G6x13y0D1Ev();
Name_Map name_map_G6x13y0[] = {
  NSPAIR(_ZN7G6x13y0C1Ev),
  NSPAIR(_ZN7G6x13y0D1Ev),
  {0,0}
};
extern Class_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_E6x13;
extern VTBL_ENTRY _ZTI5E6x13[];
extern  VTBL_ENTRY _ZTV5E6x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x13y0[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E6x13,    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
    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 _ZTI7G6x13y0[];
extern void _ZN5E6x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv)();
extern void ABISELECT(_ZThn32_N5E6x133fooEv,_ZThn24_N5E6x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G6x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x13y0[0]),
  (VTBL_ENTRY)&_ZN5E6x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G6x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G6x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv),
};
extern VTBL_ENTRY _ZTV7G6x13y0[];
extern void _ZN5E6x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x13__7G6x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x13[0]),
  (VTBL_ENTRY)&_ZN5E6x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv)();
extern void ABISELECT(_ZThn32_N5E6x133fooEv,_ZThn24_N5E6x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C6__5E6x13__7G6x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E6x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__7G6x13y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x13y0[] = {
  {&(_ZTV7G6x13y0[4]),  4,13},
  {&(_tg__ZTV5E6x13__7G6x13y0[4]),  4,5},
  {&(_tg__ZTV2C6__5E6x13__7G6x13y0[4]),  4,5},
  {&(_ZTV7G6x13y0[12]),  12,13},
  {&(_tg__ZTV2C6__7G6x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x13y0[];
extern  VTBL_ENTRY _ZTV7G6x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x13y0[];
static VTBL_ENTRY alt_thunk_names171[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E6x133fooEv,_ZThn24_N5E6x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E6x133fooEv,_ZThn24_N5E6x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G6x13y0 = {  "G6x13y0", // class name
  bases_G6x13y0, 6,
  &(vtc_G6x13y0[0]), // expected_vtbl_contents
  &(vtt_G6x13y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G6x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x13y0),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x13y0),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names171,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x13y1  : virtual E6x13 , F1 {
  int ff;
  ~G6x13y1(); // tgen
  G6x13y1(); // tgen
};
//SIG(1 G6x13y1) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G6x13y1 ::~G6x13y1(){ note_dtor("G6x13y1", this);} // tgen
G6x13y1 ::G6x13y1(){ note_ctor("G6x13y1", this);} // tgen

static void Test_G6x13y1()
{
  extern Class_Descriptor cd_G6x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G6x13y1, buf);
    G6x13y1 *dp, &lv = *(dp=new (buf) G6x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G6x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x13y1)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,36), "G6x13y1");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,24), "G6x13y1");
    check_base_class_offset(lv, (C6*)(E6x13*), ABISELECT(32,24), "G6x13y1");
    check_base_class_offset(lv, (D0*)(E6x13*), ABISELECT(24,16), "G6x13y1");
    check_base_class_offset(lv, (E6x13*), ABISELECT(16,12), "G6x13y1");
    check_base_class_offset(lv, (F1*), 0, "G6x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x13y1.ff");
    test_class_info(&lv, &cd_G6x13y1);
    dp->~G6x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x13y1(Test_G6x13y1, "G6x13y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G6x13y1C1Ev();
extern void _ZN7G6x13y1D1Ev();
Name_Map name_map_G6x13y1[] = {
  NSPAIR(_ZN7G6x13y1C1Ev),
  NSPAIR(_ZN7G6x13y1D1Ev),
  {0,0}
};
extern Class_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_E6x13;
extern VTBL_ENTRY _ZTI5E6x13[];
extern  VTBL_ENTRY _ZTV5E6x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x13y1[] = {
  // 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
    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(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_E6x13,    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 _ZTI7G6x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E6x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv)();
extern void ABISELECT(_ZThn16_N5E6x133fooEv,_ZThn12_N5E6x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G6x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G6x13y1[0]),
  (VTBL_ENTRY)&_ZN5E6x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G6x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv),
};
extern VTBL_ENTRY _ZTV7G6x13y1[];
extern void _ZN5E6x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x13__7G6x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x13[0]),
  (VTBL_ENTRY)&_ZN5E6x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv)();
extern void ABISELECT(_ZThn16_N5E6x133fooEv,_ZThn12_N5E6x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C6__5E6x13__7G6x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E6x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__7G6x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x13y1[] = {
  {&(_ZTV7G6x13y1[5]),  5,17},
  {&(_ZTV7G6x13y1[11]),  11,17},
  {&(_ZTV7G6x13y1[16]),  16,17},
  {&(_tg__ZTV5E6x13__7G6x13y1[4]),  4,5},
  {&(_tg__ZTV2C6__5E6x13__7G6x13y1[4]),  4,5},
  {&(_tg__ZTV2C6__7G6x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x13y1[];
extern  VTBL_ENTRY _ZTV7G6x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x13y1[];
static VTBL_ENTRY alt_thunk_names172[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x133fooEv,_ZThn12_N5E6x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x133fooEv,_ZThn12_N5E6x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G6x13y1 = {  "G6x13y1", // class name
  bases_G6x13y1, 6,
  &(vtc_G6x13y1[0]), // expected_vtbl_contents
  &(vtt_G6x13y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G6x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x13y1),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x13y1),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names172,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x13y2  : E6x13 , virtual F1 {
  int ff;
  ~G6x13y2(); // tgen
  G6x13y2(); // tgen
};
//SIG(1 G6x13y2) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G6x13y2 ::~G6x13y2(){ note_dtor("G6x13y2", this);} // tgen
G6x13y2 ::G6x13y2(){ note_ctor("G6x13y2", this);} // tgen

static void Test_G6x13y2()
{
  extern Class_Descriptor cd_G6x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G6x13y2, buf);
    G6x13y2 *dp, &lv = *(dp=new (buf) G6x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G6x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x13y2)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(40,28), "G6x13y2");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(24,16), "G6x13y2");
    check_base_class_offset(lv, (C6*)(E6x13*), ABISELECT(24,16), "G6x13y2");
    check_base_class_offset(lv, (D0*)(E6x13*), ABISELECT(8,4), "G6x13y2");
    check_base_class_offset(lv, (E6x13*), 0, "G6x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G6x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G6x13y2.ff");
    test_class_info(&lv, &cd_G6x13y2);
    dp->~G6x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x13y2(Test_G6x13y2, "G6x13y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G6x13y2C1Ev();
extern void _ZN7G6x13y2D1Ev();
Name_Map name_map_G6x13y2[] = {
  NSPAIR(_ZN7G6x13y2C1Ev),
  NSPAIR(_ZN7G6x13y2D1Ev),
  {0,0}
};
extern Class_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_E6x13;
extern VTBL_ENTRY _ZTI5E6x13[];
extern  VTBL_ENTRY _ZTV5E6x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x13y2[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E6x13,    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
    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 _ZTI7G6x13y2[];
extern void _ZN5E6x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv)();
extern void ABISELECT(_ZThn24_N5E6x133fooEv,_ZThn16_N5E6x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x13y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x13y2[0]),
  (VTBL_ENTRY)&_ZN5E6x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G6x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G6x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G6x13y2[];
extern void _ZN5E6x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x13__7G6x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x13[0]),
  (VTBL_ENTRY)&_ZN5E6x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv)();
extern void ABISELECT(_ZThn24_N5E6x133fooEv,_ZThn16_N5E6x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C6__5E6x13__7G6x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E6x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__7G6x13y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x13y2[] = {
  {&(_ZTV7G6x13y2[5]),  5,15},
  {&(_tg__ZTV5E6x13__7G6x13y2[4]),  4,5},
  {&(_tg__ZTV2C6__5E6x13__7G6x13y2[4]),  4,5},
  {&(_ZTV7G6x13y2[10]),  10,15},
  {&(_ZTV7G6x13y2[14]),  14,15},
  {&(_tg__ZTV2C6__7G6x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x13y2[];
extern  VTBL_ENTRY _ZTV7G6x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x13y2[];
static VTBL_ENTRY alt_thunk_names173[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E6x133fooEv,_ZThn16_N5E6x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E6x133fooEv,_ZThn16_N5E6x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G6x13y2 = {  "G6x13y2", // class name
  bases_G6x13y2, 6,
  &(vtc_G6x13y2[0]), // expected_vtbl_contents
  &(vtt_G6x13y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G6x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x13y2),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x13y2),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names173,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x13y3  : virtual E6x13 , virtual F1 {
  int ff;
  ~G6x13y3(); // tgen
  G6x13y3(); // tgen
};
//SIG(1 G6x13y3) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G6x13y3 ::~G6x13y3(){ note_dtor("G6x13y3", this);} // tgen
G6x13y3 ::G6x13y3(){ note_ctor("G6x13y3", this);} // tgen

static void Test_G6x13y3()
{
  extern Class_Descriptor cd_G6x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G6x13y3, buf);
    G6x13y3 *dp, &lv = *(dp=new (buf) G6x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G6x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x13y3)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,32), "G6x13y3");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,20), "G6x13y3");
    check_base_class_offset(lv, (C6*)(E6x13*), ABISELECT(32,20), "G6x13y3");
    check_base_class_offset(lv, (D0*)(E6x13*), ABISELECT(24,12), "G6x13y3");
    check_base_class_offset(lv, (E6x13*), ABISELECT(16,8), "G6x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G6x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G6x13y3.ff");
    test_class_info(&lv, &cd_G6x13y3);
    dp->~G6x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x13y3(Test_G6x13y3, "G6x13y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G6x13y3C1Ev();
extern void _ZN7G6x13y3D1Ev();
Name_Map name_map_G6x13y3[] = {
  NSPAIR(_ZN7G6x13y3C1Ev),
  NSPAIR(_ZN7G6x13y3D1Ev),
  {0,0}
};
extern Class_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_E6x13;
extern VTBL_ENTRY _ZTI5E6x13[];
extern  VTBL_ENTRY _ZTV5E6x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x13y3[] = {
  // 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
    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_E6x13,    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
    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 _ZTI7G6x13y3[];
extern void _ZN5E6x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv)();
extern void ABISELECT(_ZThn16_N5E6x133fooEv,_ZThn12_N5E6x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x13y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G6x13y3[0]),
  (VTBL_ENTRY)&_ZN5E6x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G6x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G6x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G6x13y3[];
extern void _ZN5E6x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x13__7G6x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x13[0]),
  (VTBL_ENTRY)&_ZN5E6x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv)();
extern void ABISELECT(_ZThn16_N5E6x133fooEv,_ZThn12_N5E6x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C6__5E6x13__7G6x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E6x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__7G6x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x13y3[] = {
  {&(_ZTV7G6x13y3[6]),  6,21},
  {&(_ZTV7G6x13y3[11]),  11,21},
  {&(_ZTV7G6x13y3[16]),  16,21},
  {&(_ZTV7G6x13y3[20]),  20,21},
  {&(_tg__ZTV5E6x13__7G6x13y3[4]),  4,5},
  {&(_tg__ZTV2C6__5E6x13__7G6x13y3[4]),  4,5},
  {&(_tg__ZTV2C6__7G6x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x13y3[];
extern  VTBL_ENTRY _ZTV7G6x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x13y3[];
static VTBL_ENTRY alt_thunk_names174[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x133fooEv,_ZThn12_N5E6x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x133fooEv,_ZThn12_N5E6x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G6x13y3 = {  "G6x13y3", // class name
  bases_G6x13y3, 6,
  &(vtc_G6x13y3[0]), // expected_vtbl_contents
  &(vtt_G6x13y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G6x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x13y3),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x13y3),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names174,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x13y4  : E6x13 , F0 {
  int ff;
  ~G6x13y4(); // tgen
  G6x13y4(); // tgen
};
//SIG(1 G6x13y4) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G6x13y4 ::~G6x13y4(){ note_dtor("G6x13y4", this);} // tgen
G6x13y4 ::G6x13y4(){ note_ctor("G6x13y4", this);} // tgen

static void Test_G6x13y4()
{
  extern Class_Descriptor cd_G6x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x13y4, buf);
    G6x13y4 *dp, &lv = *(dp=new (buf) G6x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x13y4)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(40,32), "G6x13y4");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(24,20), "G6x13y4");
    check_base_class_offset(lv, (C6*)(E6x13*), ABISELECT(24,20), "G6x13y4");
    check_base_class_offset(lv, (D0*)(E6x13*), ABISELECT(8,4), "G6x13y4");
    check_base_class_offset(lv, (E6x13*), 0, "G6x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G6x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G6x13y4.ff");
    test_class_info(&lv, &cd_G6x13y4);
    dp->~G6x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x13y4(Test_G6x13y4, "G6x13y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G6x13y4C1Ev();
extern void _ZN7G6x13y4D1Ev();
Name_Map name_map_G6x13y4[] = {
  NSPAIR(_ZN7G6x13y4C1Ev),
  NSPAIR(_ZN7G6x13y4D1Ev),
  {0,0}
};
extern Class_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_E6x13;
extern VTBL_ENTRY _ZTI5E6x13[];
extern  VTBL_ENTRY _ZTV5E6x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x13y4[] = {
  // 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
    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_E6x13,    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 _ZTI7G6x13y4[];
extern void _ZN5E6x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv)();
extern void ABISELECT(_ZThn24_N5E6x133fooEv,_ZThn20_N5E6x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G6x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x13y4[0]),
  (VTBL_ENTRY)&_ZN5E6x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G6x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv),
};
extern VTBL_ENTRY _ZTV7G6x13y4[];
extern void _ZN5E6x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x13__7G6x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x13[0]),
  (VTBL_ENTRY)&_ZN5E6x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv)();
extern void ABISELECT(_ZThn24_N5E6x133fooEv,_ZThn20_N5E6x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C6__5E6x13__7G6x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E6x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__7G6x13y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x13y4[] = {
  {&(_ZTV7G6x13y4[4]),  4,10},
  {&(_tg__ZTV5E6x13__7G6x13y4[4]),  4,5},
  {&(_tg__ZTV2C6__5E6x13__7G6x13y4[4]),  4,5},
  {&(_ZTV7G6x13y4[9]),  9,10},
  {&(_tg__ZTV2C6__7G6x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x13y4[];
extern  VTBL_ENTRY _ZTV7G6x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x13y4[];
static VTBL_ENTRY alt_thunk_names175[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E6x133fooEv,_ZThn20_N5E6x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E6x133fooEv,_ZThn20_N5E6x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G6x13y4 = {  "G6x13y4", // class name
  bases_G6x13y4, 6,
  &(vtc_G6x13y4[0]), // expected_vtbl_contents
  &(vtt_G6x13y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G6x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x13y4),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x13y4),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names175,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x13y5  : virtual E6x13 , F0 {
  int ff;
  ~G6x13y5(); // tgen
  G6x13y5(); // tgen
};
//SIG(1 G6x13y5) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G6x13y5 ::~G6x13y5(){ note_dtor("G6x13y5", this);} // tgen
G6x13y5 ::G6x13y5(){ note_ctor("G6x13y5", this);} // tgen

static void Test_G6x13y5()
{
  extern Class_Descriptor cd_G6x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G6x13y5, buf);
    G6x13y5 *dp, &lv = *(dp=new (buf) G6x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G6x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x13y5)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,36), "G6x13y5");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,24), "G6x13y5");
    check_base_class_offset(lv, (C6*)(E6x13*), ABISELECT(32,24), "G6x13y5");
    check_base_class_offset(lv, (D0*)(E6x13*), ABISELECT(24,16), "G6x13y5");
    check_base_class_offset(lv, (E6x13*), ABISELECT(16,12), "G6x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G6x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x13y5.ff");
    test_class_info(&lv, &cd_G6x13y5);
    dp->~G6x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x13y5(Test_G6x13y5, "G6x13y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G6x13y5C1Ev();
extern void _ZN7G6x13y5D1Ev();
Name_Map name_map_G6x13y5[] = {
  NSPAIR(_ZN7G6x13y5C1Ev),
  NSPAIR(_ZN7G6x13y5D1Ev),
  {0,0}
};
extern Class_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_E6x13;
extern VTBL_ENTRY _ZTI5E6x13[];
extern  VTBL_ENTRY _ZTV5E6x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x13y5[] = {
  // 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
    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(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_E6x13,    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 _ZTI7G6x13y5[];
extern void _ZN5E6x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv)();
extern void ABISELECT(_ZThn16_N5E6x133fooEv,_ZThn12_N5E6x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G6x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G6x13y5[0]),
  (VTBL_ENTRY)&_ZN5E6x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G6x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv),
};
extern VTBL_ENTRY _ZTV7G6x13y5[];
extern void _ZN5E6x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x13__7G6x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x13[0]),
  (VTBL_ENTRY)&_ZN5E6x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv)();
extern void ABISELECT(_ZThn16_N5E6x133fooEv,_ZThn12_N5E6x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C6__5E6x13__7G6x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E6x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__7G6x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x13y5[] = {
  {&(_ZTV7G6x13y5[5]),  5,16},
  {&(_ZTV7G6x13y5[10]),  10,16},
  {&(_ZTV7G6x13y5[15]),  15,16},
  {&(_tg__ZTV5E6x13__7G6x13y5[4]),  4,5},
  {&(_tg__ZTV2C6__5E6x13__7G6x13y5[4]),  4,5},
  {&(_tg__ZTV2C6__7G6x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x13y5[];
extern  VTBL_ENTRY _ZTV7G6x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x13y5[];
static VTBL_ENTRY alt_thunk_names176[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x133fooEv,_ZThn12_N5E6x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x133fooEv,_ZThn12_N5E6x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G6x13y5 = {  "G6x13y5", // class name
  bases_G6x13y5, 6,
  &(vtc_G6x13y5[0]), // expected_vtbl_contents
  &(vtt_G6x13y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G6x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x13y5),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x13y5),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names176,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x13y6  : E6x13 , virtual F0 {
  int ff;
  ~G6x13y6(); // tgen
  G6x13y6(); // tgen
};
//SIG(1 G6x13y6) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G6x13y6 ::~G6x13y6(){ note_dtor("G6x13y6", this);} // tgen
G6x13y6 ::G6x13y6(){ note_ctor("G6x13y6", this);} // tgen

static void Test_G6x13y6()
{
  extern Class_Descriptor cd_G6x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x13y6, buf);
    G6x13y6 *dp, &lv = *(dp=new (buf) G6x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x13y6)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(40,28), "G6x13y6");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(24,16), "G6x13y6");
    check_base_class_offset(lv, (C6*)(E6x13*), ABISELECT(24,16), "G6x13y6");
    check_base_class_offset(lv, (D0*)(E6x13*), ABISELECT(8,4), "G6x13y6");
    check_base_class_offset(lv, (E6x13*), 0, "G6x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G6x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G6x13y6.ff");
    test_class_info(&lv, &cd_G6x13y6);
    dp->~G6x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x13y6(Test_G6x13y6, "G6x13y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G6x13y6C1Ev();
extern void _ZN7G6x13y6D1Ev();
Name_Map name_map_G6x13y6[] = {
  NSPAIR(_ZN7G6x13y6C1Ev),
  NSPAIR(_ZN7G6x13y6D1Ev),
  {0,0}
};
extern Class_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_E6x13;
extern VTBL_ENTRY _ZTI5E6x13[];
extern  VTBL_ENTRY _ZTV5E6x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x13y6[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E6x13,    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 _ZTI7G6x13y6[];
extern void _ZN5E6x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv)();
extern void ABISELECT(_ZThn24_N5E6x133fooEv,_ZThn16_N5E6x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G6x13y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x13y6[0]),
  (VTBL_ENTRY)&_ZN5E6x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G6x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv),
};
extern VTBL_ENTRY _ZTV7G6x13y6[];
extern void _ZN5E6x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x13__7G6x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x13[0]),
  (VTBL_ENTRY)&_ZN5E6x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv)();
extern void ABISELECT(_ZThn24_N5E6x133fooEv,_ZThn16_N5E6x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C6__5E6x13__7G6x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E6x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__7G6x13y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x13y6[] = {
  {&(_ZTV7G6x13y6[5]),  5,11},
  {&(_tg__ZTV5E6x13__7G6x13y6[4]),  4,5},
  {&(_tg__ZTV2C6__5E6x13__7G6x13y6[4]),  4,5},
  {&(_ZTV7G6x13y6[10]),  10,11},
  {&(_tg__ZTV2C6__7G6x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x13y6[];
extern  VTBL_ENTRY _ZTV7G6x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x13y6[];
static VTBL_ENTRY alt_thunk_names177[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E6x133fooEv,_ZThn16_N5E6x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E6x133fooEv,_ZThn16_N5E6x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G6x13y6 = {  "G6x13y6", // class name
  bases_G6x13y6, 6,
  &(vtc_G6x13y6[0]), // expected_vtbl_contents
  &(vtt_G6x13y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G6x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x13y6),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x13y6),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names177,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x13y7  : virtual E6x13 , virtual F0 {
  int ff;
  ~G6x13y7(); // tgen
  G6x13y7(); // tgen
};
//SIG(1 G6x13y7) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G6x13y7 ::~G6x13y7(){ note_dtor("G6x13y7", this);} // tgen
G6x13y7 ::G6x13y7(){ note_ctor("G6x13y7", this);} // tgen

static void Test_G6x13y7()
{
  extern Class_Descriptor cd_G6x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G6x13y7, buf);
    G6x13y7 *dp, &lv = *(dp=new (buf) G6x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G6x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x13y7)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,32), "G6x13y7");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,20), "G6x13y7");
    check_base_class_offset(lv, (C6*)(E6x13*), ABISELECT(32,20), "G6x13y7");
    check_base_class_offset(lv, (D0*)(E6x13*), ABISELECT(24,12), "G6x13y7");
    check_base_class_offset(lv, (E6x13*), ABISELECT(16,8), "G6x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G6x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G6x13y7.ff");
    test_class_info(&lv, &cd_G6x13y7);
    dp->~G6x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x13y7(Test_G6x13y7, "G6x13y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G6x13y7C1Ev();
extern void _ZN7G6x13y7D1Ev();
Name_Map name_map_G6x13y7[] = {
  NSPAIR(_ZN7G6x13y7C1Ev),
  NSPAIR(_ZN7G6x13y7D1Ev),
  {0,0}
};
extern Class_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_E6x13;
extern VTBL_ENTRY _ZTI5E6x13[];
extern  VTBL_ENTRY _ZTV5E6x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x13y7[] = {
  // 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(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_E6x13,    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 _ZTI7G6x13y7[];
extern void _ZN5E6x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv)();
extern void ABISELECT(_ZThn16_N5E6x133fooEv,_ZThn12_N5E6x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G6x13y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G6x13y7[0]),
  (VTBL_ENTRY)&_ZN5E6x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G6x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv),
};
extern VTBL_ENTRY _ZTV7G6x13y7[];
extern void _ZN5E6x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x13__7G6x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x13[0]),
  (VTBL_ENTRY)&_ZN5E6x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv)();
extern void ABISELECT(_ZThn16_N5E6x133fooEv,_ZThn12_N5E6x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C6__5E6x13__7G6x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E6x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__7G6x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x13y7[] = {
  {&(_ZTV7G6x13y7[6]),  6,17},
  {&(_ZTV7G6x13y7[11]),  11,17},
  {&(_ZTV7G6x13y7[16]),  16,17},
  {&(_tg__ZTV5E6x13__7G6x13y7[4]),  4,5},
  {&(_tg__ZTV2C6__5E6x13__7G6x13y7[4]),  4,5},
  {&(_tg__ZTV2C6__7G6x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x13y7[];
extern  VTBL_ENTRY _ZTV7G6x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x13y7[];
static VTBL_ENTRY alt_thunk_names178[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E6x133fooEv,_ZTv0_n16_N5E6x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x133fooEv,_ZThn12_N5E6x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x133fooEv,_ZThn12_N5E6x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G6x13y7 = {  "G6x13y7", // class name
  bases_G6x13y7, 6,
  &(vtc_G6x13y7[0]), // expected_vtbl_contents
  &(vtt_G6x13y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G6x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x13y7),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x13y7),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names178,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E7x13  : virtual C7 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E7x133fooEv
  ~E7x13(); // tgen
  E7x13(); // tgen
};
//SIG(-1 E7x13) C1{ VBC2{ VBC3{ v1 Fi} BC4{ v1 Fi} Fi} BC5{ Fi} v1 Fi}


void  E7x13 ::foo(){vfunc_called(this, "_ZN5E7x133fooEv");}
E7x13 ::~E7x13(){ note_dtor("E7x13", this);} // tgen
E7x13 ::E7x13(){ note_ctor("E7x13", this);} // tgen

static void Test_E7x13()
{
  extern Class_Descriptor cd_E7x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E7x13, buf);
    E7x13 *dp, &lv = *(dp=new (buf) E7x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E7x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E7x13)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(32,24), "E7x13");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(16,12), "E7x13");
    check_base_class_offset(lv, (C7*), ABISELECT(16,12), "E7x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E7x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E7x13.fd");
    test_class_info(&lv, &cd_E7x13);
    dp->~E7x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE7x13(Test_E7x13, "E7x13", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E7x13C1Ev();
extern void _ZN5E7x13D1Ev();
Name_Map name_map_E7x13[] = {
  NSPAIR(_ZN5E7x13C1Ev),
  NSPAIR(_ZN5E7x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x13[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    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
    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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E7x13[];
extern void _ZN5E7x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv)();
extern void ABISELECT(_ZThn16_N5E7x133fooEv,_ZThn12_N5E7x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv)();
extern void ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E7x13[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&_ZN5E7x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv),
};
extern VTBL_ENTRY _ZTV5E7x13[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__5E7x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__5E7x13[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E7x13[] = {
  {&(_ZTV5E7x13[4]),  4,14},
  {&(_ZTV5E7x13[9]),  9,14},
  {&(_ZTV5E7x13[13]),  13,14},
  {&(_tg__ZTV2C7__5E7x13[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__5E7x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E7x13[];
extern  VTBL_ENTRY _ZTV5E7x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x13[];
static VTBL_ENTRY alt_thunk_names179[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x133fooEv,_ZThn12_N5E7x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E7x13 = {  "E7x13", // class name
  bases_E7x13, 4,
  &(vtc_E7x13[0]), // expected_vtbl_contents
  &(vtt_E7x13[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E7x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E7x13),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E7x13),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names179,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x13y0  : E7x13 , F1 {
  int ff;
  ~G7x13y0(); // tgen
  G7x13y0(); // tgen
};
//SIG(1 G7x13y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G7x13y0 ::~G7x13y0(){ note_dtor("G7x13y0", this);} // tgen
G7x13y0 ::G7x13y0(){ note_ctor("G7x13y0", this);} // tgen

static void Test_G7x13y0()
{
  extern Class_Descriptor cd_G7x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G7x13y0, buf);
    G7x13y0 *dp, &lv = *(dp=new (buf) G7x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G7x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x13y0)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,36), "G7x13y0");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,24), "G7x13y0");
    check_base_class_offset(lv, (C7*)(E7x13*), ABISELECT(32,24), "G7x13y0");
    check_base_class_offset(lv, (D0*)(E7x13*), ABISELECT(8,4), "G7x13y0");
    check_base_class_offset(lv, (E7x13*), 0, "G7x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G7x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G7x13y0.ff");
    test_class_info(&lv, &cd_G7x13y0);
    dp->~G7x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x13y0(Test_G7x13y0, "G7x13y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G7x13y0C1Ev();
extern void _ZN7G7x13y0D1Ev();
Name_Map name_map_G7x13y0[] = {
  NSPAIR(_ZN7G7x13y0C1Ev),
  NSPAIR(_ZN7G7x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x13;
extern VTBL_ENTRY _ZTI5E7x13[];
extern  VTBL_ENTRY _ZTV5E7x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x13y0[] = {
  // 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)
    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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E7x13,    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
    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 _ZTI7G7x13y0[];
extern void _ZN5E7x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv)();
extern void ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv)();
extern void ABISELECT(_ZThn48_N5E7x133fooEv,_ZThn36_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x13y0[0]),
  (VTBL_ENTRY)&_ZN5E7x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G7x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G7x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv),
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G7x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv),
};
extern VTBL_ENTRY _ZTV7G7x13y0[];
extern void _ZN5E7x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x13__7G7x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&_ZN5E7x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv)();
extern void ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C7__5E7x13__7G7x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv)();
extern void ABISELECT(_ZThn48_N5E7x133fooEv,_ZThn36_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x13__7G7x13y0[] = {
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__7G7x13y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__7G7x13y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x13y0[] = {
  {&(_ZTV7G7x13y0[4]),  4,17},
  {&(_tg__ZTV5E7x13__7G7x13y0[4]),  4,5},
  {&(_tg__ZTV2C7__5E7x13__7G7x13y0[4]),  4,5},
  {&(_tg__ZTV2A1__5E7x13__7G7x13y0[3]),  3,4},
  {&(_ZTV7G7x13y0[12]),  12,17},
  {&(_ZTV7G7x13y0[16]),  16,17},
  {&(_tg__ZTV2C7__7G7x13y0[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__7G7x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x13y0[];
extern  VTBL_ENTRY _ZTV7G7x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x13y0[];
static VTBL_ENTRY alt_thunk_names180[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N5E7x133fooEv,_ZThn36_N5E7x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N5E7x133fooEv,_ZThn36_N5E7x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x13y0 = {  "G7x13y0", // class name
  bases_G7x13y0, 6,
  &(vtc_G7x13y0[0]), // expected_vtbl_contents
  &(vtt_G7x13y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G7x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x13y0),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x13y0),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names180,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x13y1  : virtual E7x13 , F1 {
  int ff;
  ~G7x13y1(); // tgen
  G7x13y1(); // tgen
};
//SIG(1 G7x13y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G7x13y1 ::~G7x13y1(){ note_dtor("G7x13y1", this);} // tgen
G7x13y1 ::G7x13y1(){ note_ctor("G7x13y1", this);} // tgen

static void Test_G7x13y1()
{
  extern Class_Descriptor cd_G7x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G7x13y1, buf);
    G7x13y1 *dp, &lv = *(dp=new (buf) G7x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G7x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x13y1)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,36), "G7x13y1");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,24), "G7x13y1");
    check_base_class_offset(lv, (C7*)(E7x13*), ABISELECT(32,24), "G7x13y1");
    check_base_class_offset(lv, (D0*)(E7x13*), ABISELECT(24,16), "G7x13y1");
    check_base_class_offset(lv, (E7x13*), ABISELECT(16,12), "G7x13y1");
    check_base_class_offset(lv, (F1*), 0, "G7x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x13y1.ff");
    test_class_info(&lv, &cd_G7x13y1);
    dp->~G7x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x13y1(Test_G7x13y1, "G7x13y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G7x13y1C1Ev();
extern void _ZN7G7x13y1D1Ev();
Name_Map name_map_G7x13y1[] = {
  NSPAIR(_ZN7G7x13y1C1Ev),
  NSPAIR(_ZN7G7x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x13;
extern VTBL_ENTRY _ZTI5E7x13[];
extern  VTBL_ENTRY _ZTV5E7x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x13y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    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_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
    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(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_E7x13,    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 _ZTI7G7x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E7x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv)();
extern void ABISELECT(_ZThn16_N5E7x133fooEv,_ZThn12_N5E7x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv)();
extern void ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G7x13y1[0]),
  (VTBL_ENTRY)&_ZN5E7x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G7x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G7x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv),
};
extern VTBL_ENTRY _ZTV7G7x13y1[];
extern void _ZN5E7x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x13__7G7x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&_ZN5E7x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv)();
extern void ABISELECT(_ZThn16_N5E7x133fooEv,_ZThn12_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C7__5E7x13__7G7x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv)();
extern void ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x13__7G7x13y1[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__7G7x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__7G7x13y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x13y1[] = {
  {&(_ZTV7G7x13y1[5]),  5,21},
  {&(_ZTV7G7x13y1[11]),  11,21},
  {&(_ZTV7G7x13y1[16]),  16,21},
  {&(_ZTV7G7x13y1[20]),  20,21},
  {&(_tg__ZTV5E7x13__7G7x13y1[4]),  4,5},
  {&(_tg__ZTV2C7__5E7x13__7G7x13y1[4]),  4,5},
  {&(_tg__ZTV2A1__5E7x13__7G7x13y1[3]),  3,4},
  {&(_tg__ZTV2C7__7G7x13y1[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__7G7x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x13y1[];
extern  VTBL_ENTRY _ZTV7G7x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x13y1[];
static VTBL_ENTRY alt_thunk_names181[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x133fooEv,_ZThn12_N5E7x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x133fooEv,_ZThn12_N5E7x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x13y1 = {  "G7x13y1", // class name
  bases_G7x13y1, 6,
  &(vtc_G7x13y1[0]), // expected_vtbl_contents
  &(vtt_G7x13y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G7x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x13y1),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x13y1),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names181,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x13y2  : E7x13 , virtual F1 {
  int ff;
  ~G7x13y2(); // tgen
  G7x13y2(); // tgen
};
//SIG(1 G7x13y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G7x13y2 ::~G7x13y2(){ note_dtor("G7x13y2", this);} // tgen
G7x13y2 ::G7x13y2(){ note_ctor("G7x13y2", this);} // tgen

static void Test_G7x13y2()
{
  extern Class_Descriptor cd_G7x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G7x13y2, buf);
    G7x13y2 *dp, &lv = *(dp=new (buf) G7x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G7x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x13y2)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(40,28), "G7x13y2");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(24,16), "G7x13y2");
    check_base_class_offset(lv, (C7*)(E7x13*), ABISELECT(24,16), "G7x13y2");
    check_base_class_offset(lv, (D0*)(E7x13*), ABISELECT(8,4), "G7x13y2");
    check_base_class_offset(lv, (E7x13*), 0, "G7x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G7x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G7x13y2.ff");
    test_class_info(&lv, &cd_G7x13y2);
    dp->~G7x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x13y2(Test_G7x13y2, "G7x13y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G7x13y2C1Ev();
extern void _ZN7G7x13y2D1Ev();
Name_Map name_map_G7x13y2[] = {
  NSPAIR(_ZN7G7x13y2C1Ev),
  NSPAIR(_ZN7G7x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x13;
extern VTBL_ENTRY _ZTI5E7x13[];
extern  VTBL_ENTRY _ZTV5E7x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x13y2[] = {
  // 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_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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E7x13,    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
    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 _ZTI7G7x13y2[];
extern void _ZN5E7x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv)();
extern void ABISELECT(_ZThn24_N5E7x133fooEv,_ZThn16_N5E7x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv)();
extern void ABISELECT(_ZThn40_N5E7x133fooEv,_ZThn28_N5E7x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G7x13y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x13y2[0]),
  (VTBL_ENTRY)&_ZN5E7x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G7x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G7x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G7x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G7x13y2[];
extern void _ZN5E7x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x13__7G7x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&_ZN5E7x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv)();
extern void ABISELECT(_ZThn24_N5E7x133fooEv,_ZThn16_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C7__5E7x13__7G7x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv)();
extern void ABISELECT(_ZThn40_N5E7x133fooEv,_ZThn28_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x13__7G7x13y2[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__7G7x13y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__7G7x13y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x13y2[] = {
  {&(_ZTV7G7x13y2[5]),  5,19},
  {&(_tg__ZTV5E7x13__7G7x13y2[4]),  4,5},
  {&(_tg__ZTV2C7__5E7x13__7G7x13y2[4]),  4,5},
  {&(_tg__ZTV2A1__5E7x13__7G7x13y2[3]),  3,4},
  {&(_ZTV7G7x13y2[10]),  10,19},
  {&(_ZTV7G7x13y2[14]),  14,19},
  {&(_ZTV7G7x13y2[18]),  18,19},
  {&(_tg__ZTV2C7__7G7x13y2[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__7G7x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x13y2[];
extern  VTBL_ENTRY _ZTV7G7x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x13y2[];
static VTBL_ENTRY alt_thunk_names182[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E7x133fooEv,_ZThn28_N5E7x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E7x133fooEv,_ZThn28_N5E7x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x133fooEv,_ZThn16_N5E7x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x133fooEv,_ZThn16_N5E7x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x13y2 = {  "G7x13y2", // class name
  bases_G7x13y2, 6,
  &(vtc_G7x13y2[0]), // expected_vtbl_contents
  &(vtt_G7x13y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G7x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x13y2),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x13y2),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names182,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x13y3  : virtual E7x13 , virtual F1 {
  int ff;
  ~G7x13y3(); // tgen
  G7x13y3(); // tgen
};
//SIG(1 G7x13y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G7x13y3 ::~G7x13y3(){ note_dtor("G7x13y3", this);} // tgen
G7x13y3 ::G7x13y3(){ note_ctor("G7x13y3", this);} // tgen

static void Test_G7x13y3()
{
  extern Class_Descriptor cd_G7x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G7x13y3, buf);
    G7x13y3 *dp, &lv = *(dp=new (buf) G7x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G7x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x13y3)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,32), "G7x13y3");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,20), "G7x13y3");
    check_base_class_offset(lv, (C7*)(E7x13*), ABISELECT(32,20), "G7x13y3");
    check_base_class_offset(lv, (D0*)(E7x13*), ABISELECT(24,12), "G7x13y3");
    check_base_class_offset(lv, (E7x13*), ABISELECT(16,8), "G7x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G7x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G7x13y3.ff");
    test_class_info(&lv, &cd_G7x13y3);
    dp->~G7x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x13y3(Test_G7x13y3, "G7x13y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G7x13y3C1Ev();
extern void _ZN7G7x13y3D1Ev();
Name_Map name_map_G7x13y3[] = {
  NSPAIR(_ZN7G7x13y3C1Ev),
  NSPAIR(_ZN7G7x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x13;
extern VTBL_ENTRY _ZTI5E7x13[];
extern  VTBL_ENTRY _ZTV5E7x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x13y3[] = {
  // 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
    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_E7x13,    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(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 _ZTI7G7x13y3[];
extern void _ZN5E7x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv)();
extern void ABISELECT(_ZThn16_N5E7x133fooEv,_ZThn12_N5E7x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv)();
extern void ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G7x13y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G7x13y3[0]),
  (VTBL_ENTRY)&_ZN5E7x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G7x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G7x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G7x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G7x13y3[];
extern void _ZN5E7x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x13__7G7x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&_ZN5E7x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv)();
extern void ABISELECT(_ZThn16_N5E7x133fooEv,_ZThn12_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C7__5E7x13__7G7x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv)();
extern void ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x13__7G7x13y3[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__7G7x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__7G7x13y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x13y3[] = {
  {&(_ZTV7G7x13y3[6]),  6,25},
  {&(_ZTV7G7x13y3[11]),  11,25},
  {&(_ZTV7G7x13y3[16]),  16,25},
  {&(_ZTV7G7x13y3[20]),  20,25},
  {&(_ZTV7G7x13y3[24]),  24,25},
  {&(_tg__ZTV5E7x13__7G7x13y3[4]),  4,5},
  {&(_tg__ZTV2C7__5E7x13__7G7x13y3[4]),  4,5},
  {&(_tg__ZTV2A1__5E7x13__7G7x13y3[3]),  3,4},
  {&(_tg__ZTV2C7__7G7x13y3[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__7G7x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x13y3[];
extern  VTBL_ENTRY _ZTV7G7x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x13y3[];
static VTBL_ENTRY alt_thunk_names183[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x133fooEv,_ZThn12_N5E7x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x133fooEv,_ZThn12_N5E7x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x13y3 = {  "G7x13y3", // class name
  bases_G7x13y3, 6,
  &(vtc_G7x13y3[0]), // expected_vtbl_contents
  &(vtt_G7x13y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G7x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x13y3),25, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x13y3),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names183,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x13y4  : E7x13 , F0 {
  int ff;
  ~G7x13y4(); // tgen
  G7x13y4(); // tgen
};
//SIG(1 G7x13y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G7x13y4 ::~G7x13y4(){ note_dtor("G7x13y4", this);} // tgen
G7x13y4 ::G7x13y4(){ note_ctor("G7x13y4", this);} // tgen

static void Test_G7x13y4()
{
  extern Class_Descriptor cd_G7x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x13y4, buf);
    G7x13y4 *dp, &lv = *(dp=new (buf) G7x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x13y4)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(40,32), "G7x13y4");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(24,20), "G7x13y4");
    check_base_class_offset(lv, (C7*)(E7x13*), ABISELECT(24,20), "G7x13y4");
    check_base_class_offset(lv, (D0*)(E7x13*), ABISELECT(8,4), "G7x13y4");
    check_base_class_offset(lv, (E7x13*), 0, "G7x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G7x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G7x13y4.ff");
    test_class_info(&lv, &cd_G7x13y4);
    dp->~G7x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x13y4(Test_G7x13y4, "G7x13y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G7x13y4C1Ev();
extern void _ZN7G7x13y4D1Ev();
Name_Map name_map_G7x13y4[] = {
  NSPAIR(_ZN7G7x13y4C1Ev),
  NSPAIR(_ZN7G7x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x13;
extern VTBL_ENTRY _ZTI5E7x13[];
extern  VTBL_ENTRY _ZTV5E7x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x13y4[] = {
  // 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)
    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
    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_E7x13,    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 _ZTI7G7x13y4[];
extern void _ZN5E7x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv)();
extern void ABISELECT(_ZThn24_N5E7x133fooEv,_ZThn20_N5E7x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv)();
extern void ABISELECT(_ZThn40_N5E7x133fooEv,_ZThn32_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x13y4[0]),
  (VTBL_ENTRY)&_ZN5E7x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G7x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv),
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G7x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv),
};
extern VTBL_ENTRY _ZTV7G7x13y4[];
extern void _ZN5E7x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x13__7G7x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&_ZN5E7x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv)();
extern void ABISELECT(_ZThn24_N5E7x133fooEv,_ZThn20_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C7__5E7x13__7G7x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv)();
extern void ABISELECT(_ZThn40_N5E7x133fooEv,_ZThn32_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x13__7G7x13y4[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__7G7x13y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__7G7x13y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x13y4[] = {
  {&(_ZTV7G7x13y4[4]),  4,14},
  {&(_tg__ZTV5E7x13__7G7x13y4[4]),  4,5},
  {&(_tg__ZTV2C7__5E7x13__7G7x13y4[4]),  4,5},
  {&(_tg__ZTV2A1__5E7x13__7G7x13y4[3]),  3,4},
  {&(_ZTV7G7x13y4[9]),  9,14},
  {&(_ZTV7G7x13y4[13]),  13,14},
  {&(_tg__ZTV2C7__7G7x13y4[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__7G7x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x13y4[];
extern  VTBL_ENTRY _ZTV7G7x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x13y4[];
static VTBL_ENTRY alt_thunk_names184[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E7x133fooEv,_ZThn32_N5E7x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E7x133fooEv,_ZThn32_N5E7x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x133fooEv,_ZThn20_N5E7x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x133fooEv,_ZThn20_N5E7x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x13y4 = {  "G7x13y4", // class name
  bases_G7x13y4, 6,
  &(vtc_G7x13y4[0]), // expected_vtbl_contents
  &(vtt_G7x13y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G7x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x13y4),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x13y4),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names184,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x13y5  : virtual E7x13 , F0 {
  int ff;
  ~G7x13y5(); // tgen
  G7x13y5(); // tgen
};
//SIG(1 G7x13y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G7x13y5 ::~G7x13y5(){ note_dtor("G7x13y5", this);} // tgen
G7x13y5 ::G7x13y5(){ note_ctor("G7x13y5", this);} // tgen

static void Test_G7x13y5()
{
  extern Class_Descriptor cd_G7x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G7x13y5, buf);
    G7x13y5 *dp, &lv = *(dp=new (buf) G7x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G7x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x13y5)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,36), "G7x13y5");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,24), "G7x13y5");
    check_base_class_offset(lv, (C7*)(E7x13*), ABISELECT(32,24), "G7x13y5");
    check_base_class_offset(lv, (D0*)(E7x13*), ABISELECT(24,16), "G7x13y5");
    check_base_class_offset(lv, (E7x13*), ABISELECT(16,12), "G7x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G7x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x13y5.ff");
    test_class_info(&lv, &cd_G7x13y5);
    dp->~G7x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x13y5(Test_G7x13y5, "G7x13y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G7x13y5C1Ev();
extern void _ZN7G7x13y5D1Ev();
Name_Map name_map_G7x13y5[] = {
  NSPAIR(_ZN7G7x13y5C1Ev),
  NSPAIR(_ZN7G7x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x13;
extern VTBL_ENTRY _ZTI5E7x13[];
extern  VTBL_ENTRY _ZTV5E7x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x13y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    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_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
    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(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_E7x13,    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 _ZTI7G7x13y5[];
extern void _ZN5E7x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv)();
extern void ABISELECT(_ZThn16_N5E7x133fooEv,_ZThn12_N5E7x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv)();
extern void ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G7x13y5[0]),
  (VTBL_ENTRY)&_ZN5E7x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G7x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G7x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv),
};
extern VTBL_ENTRY _ZTV7G7x13y5[];
extern void _ZN5E7x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x13__7G7x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&_ZN5E7x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv)();
extern void ABISELECT(_ZThn16_N5E7x133fooEv,_ZThn12_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C7__5E7x13__7G7x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv)();
extern void ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x13__7G7x13y5[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__7G7x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__7G7x13y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x13y5[] = {
  {&(_ZTV7G7x13y5[5]),  5,20},
  {&(_ZTV7G7x13y5[10]),  10,20},
  {&(_ZTV7G7x13y5[15]),  15,20},
  {&(_ZTV7G7x13y5[19]),  19,20},
  {&(_tg__ZTV5E7x13__7G7x13y5[4]),  4,5},
  {&(_tg__ZTV2C7__5E7x13__7G7x13y5[4]),  4,5},
  {&(_tg__ZTV2A1__5E7x13__7G7x13y5[3]),  3,4},
  {&(_tg__ZTV2C7__7G7x13y5[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__7G7x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x13y5[];
extern  VTBL_ENTRY _ZTV7G7x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x13y5[];
static VTBL_ENTRY alt_thunk_names185[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x133fooEv,_ZThn12_N5E7x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x133fooEv,_ZThn12_N5E7x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x13y5 = {  "G7x13y5", // class name
  bases_G7x13y5, 6,
  &(vtc_G7x13y5[0]), // expected_vtbl_contents
  &(vtt_G7x13y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G7x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x13y5),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x13y5),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names185,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x13y6  : E7x13 , virtual F0 {
  int ff;
  ~G7x13y6(); // tgen
  G7x13y6(); // tgen
};
//SIG(1 G7x13y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G7x13y6 ::~G7x13y6(){ note_dtor("G7x13y6", this);} // tgen
G7x13y6 ::G7x13y6(){ note_ctor("G7x13y6", this);} // tgen

static void Test_G7x13y6()
{
  extern Class_Descriptor cd_G7x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x13y6, buf);
    G7x13y6 *dp, &lv = *(dp=new (buf) G7x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x13y6)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(40,28), "G7x13y6");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(24,16), "G7x13y6");
    check_base_class_offset(lv, (C7*)(E7x13*), ABISELECT(24,16), "G7x13y6");
    check_base_class_offset(lv, (D0*)(E7x13*), ABISELECT(8,4), "G7x13y6");
    check_base_class_offset(lv, (E7x13*), 0, "G7x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G7x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G7x13y6.ff");
    test_class_info(&lv, &cd_G7x13y6);
    dp->~G7x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x13y6(Test_G7x13y6, "G7x13y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G7x13y6C1Ev();
extern void _ZN7G7x13y6D1Ev();
Name_Map name_map_G7x13y6[] = {
  NSPAIR(_ZN7G7x13y6C1Ev),
  NSPAIR(_ZN7G7x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x13;
extern VTBL_ENTRY _ZTI5E7x13[];
extern  VTBL_ENTRY _ZTV5E7x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x13y6[] = {
  // 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_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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E7x13,    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 _ZTI7G7x13y6[];
extern void _ZN5E7x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv)();
extern void ABISELECT(_ZThn24_N5E7x133fooEv,_ZThn16_N5E7x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv)();
extern void ABISELECT(_ZThn40_N5E7x133fooEv,_ZThn28_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x13y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x13y6[0]),
  (VTBL_ENTRY)&_ZN5E7x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G7x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G7x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv),
};
extern VTBL_ENTRY _ZTV7G7x13y6[];
extern void _ZN5E7x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x13__7G7x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&_ZN5E7x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv)();
extern void ABISELECT(_ZThn24_N5E7x133fooEv,_ZThn16_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C7__5E7x13__7G7x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv)();
extern void ABISELECT(_ZThn40_N5E7x133fooEv,_ZThn28_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x13__7G7x13y6[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__7G7x13y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__7G7x13y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x13y6[] = {
  {&(_ZTV7G7x13y6[5]),  5,15},
  {&(_tg__ZTV5E7x13__7G7x13y6[4]),  4,5},
  {&(_tg__ZTV2C7__5E7x13__7G7x13y6[4]),  4,5},
  {&(_tg__ZTV2A1__5E7x13__7G7x13y6[3]),  3,4},
  {&(_ZTV7G7x13y6[10]),  10,15},
  {&(_ZTV7G7x13y6[14]),  14,15},
  {&(_tg__ZTV2C7__7G7x13y6[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__7G7x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x13y6[];
extern  VTBL_ENTRY _ZTV7G7x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x13y6[];
static VTBL_ENTRY alt_thunk_names186[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E7x133fooEv,_ZThn28_N5E7x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E7x133fooEv,_ZThn28_N5E7x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x133fooEv,_ZThn16_N5E7x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x133fooEv,_ZThn16_N5E7x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x13y6 = {  "G7x13y6", // class name
  bases_G7x13y6, 6,
  &(vtc_G7x13y6[0]), // expected_vtbl_contents
  &(vtt_G7x13y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G7x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x13y6),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x13y6),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names186,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x13y7  : virtual E7x13 , virtual F0 {
  int ff;
  ~G7x13y7(); // tgen
  G7x13y7(); // tgen
};
//SIG(1 G7x13y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G7x13y7 ::~G7x13y7(){ note_dtor("G7x13y7", this);} // tgen
G7x13y7 ::G7x13y7(){ note_ctor("G7x13y7", this);} // tgen

static void Test_G7x13y7()
{
  extern Class_Descriptor cd_G7x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G7x13y7, buf);
    G7x13y7 *dp, &lv = *(dp=new (buf) G7x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G7x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x13y7)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,32), "G7x13y7");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,20), "G7x13y7");
    check_base_class_offset(lv, (C7*)(E7x13*), ABISELECT(32,20), "G7x13y7");
    check_base_class_offset(lv, (D0*)(E7x13*), ABISELECT(24,12), "G7x13y7");
    check_base_class_offset(lv, (E7x13*), ABISELECT(16,8), "G7x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G7x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G7x13y7.ff");
    test_class_info(&lv, &cd_G7x13y7);
    dp->~G7x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x13y7(Test_G7x13y7, "G7x13y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G7x13y7C1Ev();
extern void _ZN7G7x13y7D1Ev();
Name_Map name_map_G7x13y7[] = {
  NSPAIR(_ZN7G7x13y7C1Ev),
  NSPAIR(_ZN7G7x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x13;
extern VTBL_ENTRY _ZTI5E7x13[];
extern  VTBL_ENTRY _ZTV5E7x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x13y7[] = {
  // 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(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_E7x13,    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(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 _ZTI7G7x13y7[];
extern void _ZN5E7x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv)();
extern void ABISELECT(_ZThn16_N5E7x133fooEv,_ZThn12_N5E7x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv)();
extern void ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x13y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G7x13y7[0]),
  (VTBL_ENTRY)&_ZN5E7x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G7x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G7x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv),
};
extern VTBL_ENTRY _ZTV7G7x13y7[];
extern void _ZN5E7x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x13__7G7x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&_ZN5E7x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv)();
extern void ABISELECT(_ZThn16_N5E7x133fooEv,_ZThn12_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C7__5E7x13__7G7x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv)();
extern void ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x13__7G7x13y7[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E7x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__7G7x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__7G7x13y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x13y7[] = {
  {&(_ZTV7G7x13y7[6]),  6,21},
  {&(_ZTV7G7x13y7[11]),  11,21},
  {&(_ZTV7G7x13y7[16]),  16,21},
  {&(_ZTV7G7x13y7[20]),  20,21},
  {&(_tg__ZTV5E7x13__7G7x13y7[4]),  4,5},
  {&(_tg__ZTV2C7__5E7x13__7G7x13y7[4]),  4,5},
  {&(_tg__ZTV2A1__5E7x13__7G7x13y7[3]),  3,4},
  {&(_tg__ZTV2C7__7G7x13y7[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__7G7x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x13y7[];
extern  VTBL_ENTRY _ZTV7G7x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x13y7[];
static VTBL_ENTRY alt_thunk_names187[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x133fooEv,_ZTv0_n12_N5E7x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x133fooEv,_ZThn24_N5E7x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E7x133fooEv,_ZTv0_n16_N5E7x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x133fooEv,_ZThn12_N5E7x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x133fooEv,_ZThn12_N5E7x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x13y7 = {  "G7x13y7", // class name
  bases_G7x13y7, 6,
  &(vtc_G7x13y7[0]), // expected_vtbl_contents
  &(vtt_G7x13y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G7x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x13y7),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x13y7),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names187,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E8x13  : virtual C8 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E8x133fooEv
  ~E8x13(); // tgen
  E8x13(); // tgen
};
//SIG(-1 E8x13) C1{ VBC2{ BC3{ Fi} VBC4{ Fi} Fi} BC5{ Fi} v1 Fi}


void  E8x13 ::foo(){vfunc_called(this, "_ZN5E8x133fooEv");}
E8x13 ::~E8x13(){ note_dtor("E8x13", this);} // tgen
E8x13 ::E8x13(){ note_ctor("E8x13", this);} // tgen

static void Test_E8x13()
{
  extern Class_Descriptor cd_E8x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E8x13, buf);
    E8x13 *dp, &lv = *(dp=new (buf) E8x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E8x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E8x13)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(24,16), "E8x13");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(32,24), "E8x13");
    check_base_class_offset(lv, (C8*), ABISELECT(16,12), "E8x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E8x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E8x13.fd");
    test_class_info(&lv, &cd_E8x13);
    dp->~E8x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE8x13(Test_E8x13, "E8x13", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E8x13C1Ev();
extern void _ZN5E8x13D1Ev();
Name_Map name_map_E8x13[] = {
  NSPAIR(_ZN5E8x13C1Ev),
  NSPAIR(_ZN5E8x13D1Ev),
  {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_E8x13[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E8x13[];
extern void _ZN5E8x133fooEv();
static  VTBL_ENTRY vtc_E8x13[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x13[0]),
  (VTBL_ENTRY)&_ZN5E8x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E8x13[0]),
};
extern VTBL_ENTRY _ZTV5E8x13[];
static  VTBL_ENTRY _tg__ZTV2C8__5E8x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_E8x13[] = {
  {&(_ZTV5E8x13[4]),  4,8},
  {&(_ZTV5E8x13[8]),  8,8},
  {&(_tg__ZTV2C8__5E8x13[3]),  3,3},
};
extern VTBL_ENTRY _ZTI5E8x13[];
extern  VTBL_ENTRY _ZTV5E8x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x13[];
Class_Descriptor cd_E8x13 = {  "E8x13", // class name
  bases_E8x13, 4,
  &(vtc_E8x13[0]), // expected_vtbl_contents
  &(vtt_E8x13[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E8x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E8x13),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E8x13),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  G8x13y0  : E8x13 , F1 {
  int ff;
  ~G8x13y0(); // tgen
  G8x13y0(); // tgen
};
//SIG(1 G8x13y0) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G8x13y0 ::~G8x13y0(){ note_dtor("G8x13y0", this);} // tgen
G8x13y0 ::G8x13y0(){ note_ctor("G8x13y0", this);} // tgen

static void Test_G8x13y0()
{
  extern Class_Descriptor cd_G8x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G8x13y0, buf);
    G8x13y0 *dp, &lv = *(dp=new (buf) G8x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G8x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x13y0)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,28), "G8x13y0");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,36), "G8x13y0");
    check_base_class_offset(lv, (C8*)(E8x13*), ABISELECT(32,24), "G8x13y0");
    check_base_class_offset(lv, (D0*)(E8x13*), ABISELECT(8,4), "G8x13y0");
    check_base_class_offset(lv, (E8x13*), 0, "G8x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G8x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G8x13y0.ff");
    test_class_info(&lv, &cd_G8x13y0);
    dp->~G8x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x13y0(Test_G8x13y0, "G8x13y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G8x13y0C1Ev();
extern void _ZN7G8x13y0D1Ev();
Name_Map name_map_G8x13y0[] = {
  NSPAIR(_ZN7G8x13y0C1Ev),
  NSPAIR(_ZN7G8x13y0D1Ev),
  {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_E8x13;
extern VTBL_ENTRY _ZTI5E8x13[];
extern  VTBL_ENTRY _ZTV5E8x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x13y0[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E8x13,    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
    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 _ZTI7G8x13y0[];
extern void _ZN5E8x133fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x13y0[0]),
  (VTBL_ENTRY)&_ZN5E8x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G8x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G8x13y0[0]),
};
extern VTBL_ENTRY _ZTV7G8x13y0[];
extern void _ZN5E8x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x13__7G8x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x13[0]),
  (VTBL_ENTRY)&_ZN5E8x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C8__5E8x13__7G8x13y0[] = {
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E8x13[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__7G8x13y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x13y0[] = {
  {&(_ZTV7G8x13y0[4]),  4,11},
  {&(_tg__ZTV5E8x13__7G8x13y0[4]),  4,5},
  {&(_tg__ZTV2C8__5E8x13__7G8x13y0[3]),  3,3},
  {&(_ZTV7G8x13y0[11]),  11,11},
  {&(_tg__ZTV2C8__7G8x13y0[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x13y0[];
extern  VTBL_ENTRY _ZTV7G8x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x13y0[];
Class_Descriptor cd_G8x13y0 = {  "G8x13y0", // class name
  bases_G8x13y0, 6,
  &(vtc_G8x13y0[0]), // expected_vtbl_contents
  &(vtt_G8x13y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G8x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x13y0),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x13y0),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  G8x13y1  : virtual E8x13 , F1 {
  int ff;
  ~G8x13y1(); // tgen
  G8x13y1(); // tgen
};
//SIG(1 G8x13y1) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G8x13y1 ::~G8x13y1(){ note_dtor("G8x13y1", this);} // tgen
G8x13y1 ::G8x13y1(){ note_ctor("G8x13y1", this);} // tgen

static void Test_G8x13y1()
{
  extern Class_Descriptor cd_G8x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G8x13y1, buf);
    G8x13y1 *dp, &lv = *(dp=new (buf) G8x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G8x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x13y1)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,28), "G8x13y1");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,36), "G8x13y1");
    check_base_class_offset(lv, (C8*)(E8x13*), ABISELECT(32,24), "G8x13y1");
    check_base_class_offset(lv, (D0*)(E8x13*), ABISELECT(24,16), "G8x13y1");
    check_base_class_offset(lv, (E8x13*), ABISELECT(16,12), "G8x13y1");
    check_base_class_offset(lv, (F1*), 0, "G8x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x13y1.ff");
    test_class_info(&lv, &cd_G8x13y1);
    dp->~G8x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x13y1(Test_G8x13y1, "G8x13y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G8x13y1C1Ev();
extern void _ZN7G8x13y1D1Ev();
Name_Map name_map_G8x13y1[] = {
  NSPAIR(_ZN7G8x13y1C1Ev),
  NSPAIR(_ZN7G8x13y1D1Ev),
  {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_E8x13;
extern VTBL_ENTRY _ZTI5E8x13[];
extern  VTBL_ENTRY _ZTV5E8x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x13y1[] = {
  // 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
    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(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_E8x13,    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_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 _ZTI7G8x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E8x133fooEv();
static  VTBL_ENTRY vtc_G8x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G8x13y1[0]),
  (VTBL_ENTRY)&_ZN5E8x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G8x13y1[0]),
};
extern VTBL_ENTRY _ZTV7G8x13y1[];
extern void _ZN5E8x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x13__7G8x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x13[0]),
  (VTBL_ENTRY)&_ZN5E8x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C8__5E8x13__7G8x13y1[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E8x13[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__7G8x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x13y1[] = {
  {&(_ZTV7G8x13y1[5]),  5,15},
  {&(_ZTV7G8x13y1[11]),  11,15},
  {&(_ZTV7G8x13y1[15]),  15,15},
  {&(_tg__ZTV5E8x13__7G8x13y1[4]),  4,5},
  {&(_tg__ZTV2C8__5E8x13__7G8x13y1[3]),  3,3},
  {&(_tg__ZTV2C8__7G8x13y1[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x13y1[];
extern  VTBL_ENTRY _ZTV7G8x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x13y1[];
Class_Descriptor cd_G8x13y1 = {  "G8x13y1", // class name
  bases_G8x13y1, 6,
  &(vtc_G8x13y1[0]), // expected_vtbl_contents
  &(vtt_G8x13y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G8x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x13y1),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x13y1),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  G8x13y2  : E8x13 , virtual F1 {
  int ff;
  ~G8x13y2(); // tgen
  G8x13y2(); // tgen
};
//SIG(1 G8x13y2) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G8x13y2 ::~G8x13y2(){ note_dtor("G8x13y2", this);} // tgen
G8x13y2 ::G8x13y2(){ note_ctor("G8x13y2", this);} // tgen

static void Test_G8x13y2()
{
  extern Class_Descriptor cd_G8x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G8x13y2, buf);
    G8x13y2 *dp, &lv = *(dp=new (buf) G8x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G8x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x13y2)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(32,20), "G8x13y2");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(40,28), "G8x13y2");
    check_base_class_offset(lv, (C8*)(E8x13*), ABISELECT(24,16), "G8x13y2");
    check_base_class_offset(lv, (D0*)(E8x13*), ABISELECT(8,4), "G8x13y2");
    check_base_class_offset(lv, (E8x13*), 0, "G8x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G8x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G8x13y2.ff");
    test_class_info(&lv, &cd_G8x13y2);
    dp->~G8x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x13y2(Test_G8x13y2, "G8x13y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G8x13y2C1Ev();
extern void _ZN7G8x13y2D1Ev();
Name_Map name_map_G8x13y2[] = {
  NSPAIR(_ZN7G8x13y2C1Ev),
  NSPAIR(_ZN7G8x13y2D1Ev),
  {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_E8x13;
extern VTBL_ENTRY _ZTI5E8x13[];
extern  VTBL_ENTRY _ZTV5E8x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x13y2[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E8x13,    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
    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 _ZTI7G8x13y2[];
extern void _ZN5E8x133fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x13y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x13y2[0]),
  (VTBL_ENTRY)&_ZN5E8x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G8x13y2[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G8x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G8x13y2[];
extern void _ZN5E8x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x13__7G8x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x13[0]),
  (VTBL_ENTRY)&_ZN5E8x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C8__5E8x13__7G8x13y2[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E8x13[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__7G8x13y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x13y2[] = {
  {&(_ZTV7G8x13y2[5]),  5,13},
  {&(_tg__ZTV5E8x13__7G8x13y2[4]),  4,5},
  {&(_tg__ZTV2C8__5E8x13__7G8x13y2[3]),  3,3},
  {&(_ZTV7G8x13y2[9]),  9,13},
  {&(_ZTV7G8x13y2[12]),  12,13},
  {&(_tg__ZTV2C8__7G8x13y2[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x13y2[];
extern  VTBL_ENTRY _ZTV7G8x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x13y2[];
Class_Descriptor cd_G8x13y2 = {  "G8x13y2", // class name
  bases_G8x13y2, 6,
  &(vtc_G8x13y2[0]), // expected_vtbl_contents
  &(vtt_G8x13y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G8x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x13y2),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x13y2),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  G8x13y3  : virtual E8x13 , virtual F1 {
  int ff;
  ~G8x13y3(); // tgen
  G8x13y3(); // tgen
};
//SIG(1 G8x13y3) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G8x13y3 ::~G8x13y3(){ note_dtor("G8x13y3", this);} // tgen
G8x13y3 ::G8x13y3(){ note_ctor("G8x13y3", this);} // tgen

static void Test_G8x13y3()
{
  extern Class_Descriptor cd_G8x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G8x13y3, buf);
    G8x13y3 *dp, &lv = *(dp=new (buf) G8x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G8x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x13y3)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,24), "G8x13y3");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,32), "G8x13y3");
    check_base_class_offset(lv, (C8*)(E8x13*), ABISELECT(32,20), "G8x13y3");
    check_base_class_offset(lv, (D0*)(E8x13*), ABISELECT(24,12), "G8x13y3");
    check_base_class_offset(lv, (E8x13*), ABISELECT(16,8), "G8x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G8x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G8x13y3.ff");
    test_class_info(&lv, &cd_G8x13y3);
    dp->~G8x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x13y3(Test_G8x13y3, "G8x13y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G8x13y3C1Ev();
extern void _ZN7G8x13y3D1Ev();
Name_Map name_map_G8x13y3[] = {
  NSPAIR(_ZN7G8x13y3C1Ev),
  NSPAIR(_ZN7G8x13y3D1Ev),
  {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_E8x13;
extern VTBL_ENTRY _ZTI5E8x13[];
extern  VTBL_ENTRY _ZTV5E8x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x13y3[] = {
  // 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
    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_E8x13,    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
    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 _ZTI7G8x13y3[];
extern void _ZN5E8x133fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x13y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G8x13y3[0]),
  (VTBL_ENTRY)&_ZN5E8x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G8x13y3[0]),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G8x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G8x13y3[];
extern void _ZN5E8x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x13__7G8x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x13[0]),
  (VTBL_ENTRY)&_ZN5E8x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C8__5E8x13__7G8x13y3[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E8x13[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__7G8x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x13y3[] = {
  {&(_ZTV7G8x13y3[6]),  6,19},
  {&(_ZTV7G8x13y3[11]),  11,19},
  {&(_ZTV7G8x13y3[15]),  15,19},
  {&(_ZTV7G8x13y3[18]),  18,19},
  {&(_tg__ZTV5E8x13__7G8x13y3[4]),  4,5},
  {&(_tg__ZTV2C8__5E8x13__7G8x13y3[3]),  3,3},
  {&(_tg__ZTV2C8__7G8x13y3[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x13y3[];
extern  VTBL_ENTRY _ZTV7G8x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x13y3[];
Class_Descriptor cd_G8x13y3 = {  "G8x13y3", // class name
  bases_G8x13y3, 6,
  &(vtc_G8x13y3[0]), // expected_vtbl_contents
  &(vtt_G8x13y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G8x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x13y3),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x13y3),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  G8x13y4  : E8x13 , F0 {
  int ff;
  ~G8x13y4(); // tgen
  G8x13y4(); // tgen
};
//SIG(1 G8x13y4) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G8x13y4 ::~G8x13y4(){ note_dtor("G8x13y4", this);} // tgen
G8x13y4 ::G8x13y4(){ note_ctor("G8x13y4", this);} // tgen

static void Test_G8x13y4()
{
  extern Class_Descriptor cd_G8x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x13y4, buf);
    G8x13y4 *dp, &lv = *(dp=new (buf) G8x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x13y4)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(32,24), "G8x13y4");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(40,32), "G8x13y4");
    check_base_class_offset(lv, (C8*)(E8x13*), ABISELECT(24,20), "G8x13y4");
    check_base_class_offset(lv, (D0*)(E8x13*), ABISELECT(8,4), "G8x13y4");
    check_base_class_offset(lv, (E8x13*), 0, "G8x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G8x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G8x13y4.ff");
    test_class_info(&lv, &cd_G8x13y4);
    dp->~G8x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x13y4(Test_G8x13y4, "G8x13y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G8x13y4C1Ev();
extern void _ZN7G8x13y4D1Ev();
Name_Map name_map_G8x13y4[] = {
  NSPAIR(_ZN7G8x13y4C1Ev),
  NSPAIR(_ZN7G8x13y4D1Ev),
  {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_E8x13;
extern VTBL_ENTRY _ZTI5E8x13[];
extern  VTBL_ENTRY _ZTV5E8x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x13y4[] = {
  // 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
    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_E8x13,    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 _ZTI7G8x13y4[];
extern void _ZN5E8x133fooEv();
static  VTBL_ENTRY vtc_G8x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x13y4[0]),
  (VTBL_ENTRY)&_ZN5E8x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G8x13y4[0]),
};
extern VTBL_ENTRY _ZTV7G8x13y4[];
extern void _ZN5E8x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x13__7G8x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x13[0]),
  (VTBL_ENTRY)&_ZN5E8x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C8__5E8x13__7G8x13y4[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E8x13[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__7G8x13y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x13y4[] = {
  {&(_ZTV7G8x13y4[4]),  4,8},
  {&(_tg__ZTV5E8x13__7G8x13y4[4]),  4,5},
  {&(_tg__ZTV2C8__5E8x13__7G8x13y4[3]),  3,3},
  {&(_ZTV7G8x13y4[8]),  8,8},
  {&(_tg__ZTV2C8__7G8x13y4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x13y4[];
extern  VTBL_ENTRY _ZTV7G8x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x13y4[];
Class_Descriptor cd_G8x13y4 = {  "G8x13y4", // class name
  bases_G8x13y4, 6,
  &(vtc_G8x13y4[0]), // expected_vtbl_contents
  &(vtt_G8x13y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G8x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x13y4),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x13y4),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  G8x13y5  : virtual E8x13 , F0 {
  int ff;
  ~G8x13y5(); // tgen
  G8x13y5(); // tgen
};
//SIG(1 G8x13y5) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G8x13y5 ::~G8x13y5(){ note_dtor("G8x13y5", this);} // tgen
G8x13y5 ::G8x13y5(){ note_ctor("G8x13y5", this);} // tgen

static void Test_G8x13y5()
{
  extern Class_Descriptor cd_G8x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G8x13y5, buf);
    G8x13y5 *dp, &lv = *(dp=new (buf) G8x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G8x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x13y5)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,28), "G8x13y5");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,36), "G8x13y5");
    check_base_class_offset(lv, (C8*)(E8x13*), ABISELECT(32,24), "G8x13y5");
    check_base_class_offset(lv, (D0*)(E8x13*), ABISELECT(24,16), "G8x13y5");
    check_base_class_offset(lv, (E8x13*), ABISELECT(16,12), "G8x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G8x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x13y5.ff");
    test_class_info(&lv, &cd_G8x13y5);
    dp->~G8x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x13y5(Test_G8x13y5, "G8x13y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G8x13y5C1Ev();
extern void _ZN7G8x13y5D1Ev();
Name_Map name_map_G8x13y5[] = {
  NSPAIR(_ZN7G8x13y5C1Ev),
  NSPAIR(_ZN7G8x13y5D1Ev),
  {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_E8x13;
extern VTBL_ENTRY _ZTI5E8x13[];
extern  VTBL_ENTRY _ZTV5E8x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x13y5[] = {
  // 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
    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(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_E8x13,    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_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 _ZTI7G8x13y5[];
extern void _ZN5E8x133fooEv();
static  VTBL_ENTRY vtc_G8x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G8x13y5[0]),
  (VTBL_ENTRY)&_ZN5E8x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G8x13y5[0]),
};
extern VTBL_ENTRY _ZTV7G8x13y5[];
extern void _ZN5E8x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x13__7G8x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x13[0]),
  (VTBL_ENTRY)&_ZN5E8x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C8__5E8x13__7G8x13y5[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E8x13[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__7G8x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x13y5[] = {
  {&(_ZTV7G8x13y5[5]),  5,14},
  {&(_ZTV7G8x13y5[10]),  10,14},
  {&(_ZTV7G8x13y5[14]),  14,14},
  {&(_tg__ZTV5E8x13__7G8x13y5[4]),  4,5},
  {&(_tg__ZTV2C8__5E8x13__7G8x13y5[3]),  3,3},
  {&(_tg__ZTV2C8__7G8x13y5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x13y5[];
extern  VTBL_ENTRY _ZTV7G8x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x13y5[];
Class_Descriptor cd_G8x13y5 = {  "G8x13y5", // class name
  bases_G8x13y5, 6,
  &(vtc_G8x13y5[0]), // expected_vtbl_contents
  &(vtt_G8x13y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G8x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x13y5),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x13y5),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  G8x13y6  : E8x13 , virtual F0 {
  int ff;
  ~G8x13y6(); // tgen
  G8x13y6(); // tgen
};
//SIG(1 G8x13y6) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G8x13y6 ::~G8x13y6(){ note_dtor("G8x13y6", this);} // tgen
G8x13y6 ::G8x13y6(){ note_ctor("G8x13y6", this);} // tgen

static void Test_G8x13y6()
{
  extern Class_Descriptor cd_G8x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x13y6, buf);
    G8x13y6 *dp, &lv = *(dp=new (buf) G8x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x13y6)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(32,20), "G8x13y6");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(40,28), "G8x13y6");
    check_base_class_offset(lv, (C8*)(E8x13*), ABISELECT(24,16), "G8x13y6");
    check_base_class_offset(lv, (D0*)(E8x13*), ABISELECT(8,4), "G8x13y6");
    check_base_class_offset(lv, (E8x13*), 0, "G8x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G8x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G8x13y6.ff");
    test_class_info(&lv, &cd_G8x13y6);
    dp->~G8x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x13y6(Test_G8x13y6, "G8x13y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G8x13y6C1Ev();
extern void _ZN7G8x13y6D1Ev();
Name_Map name_map_G8x13y6[] = {
  NSPAIR(_ZN7G8x13y6C1Ev),
  NSPAIR(_ZN7G8x13y6D1Ev),
  {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_E8x13;
extern VTBL_ENTRY _ZTI5E8x13[];
extern  VTBL_ENTRY _ZTV5E8x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x13y6[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E8x13,    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 _ZTI7G8x13y6[];
extern void _ZN5E8x133fooEv();
static  VTBL_ENTRY vtc_G8x13y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x13y6[0]),
  (VTBL_ENTRY)&_ZN5E8x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G8x13y6[0]),
};
extern VTBL_ENTRY _ZTV7G8x13y6[];
extern void _ZN5E8x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x13__7G8x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x13[0]),
  (VTBL_ENTRY)&_ZN5E8x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C8__5E8x13__7G8x13y6[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E8x13[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__7G8x13y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x13y6[] = {
  {&(_ZTV7G8x13y6[5]),  5,9},
  {&(_tg__ZTV5E8x13__7G8x13y6[4]),  4,5},
  {&(_tg__ZTV2C8__5E8x13__7G8x13y6[3]),  3,3},
  {&(_ZTV7G8x13y6[9]),  9,9},
  {&(_tg__ZTV2C8__7G8x13y6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x13y6[];
extern  VTBL_ENTRY _ZTV7G8x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x13y6[];
Class_Descriptor cd_G8x13y6 = {  "G8x13y6", // class name
  bases_G8x13y6, 6,
  &(vtc_G8x13y6[0]), // expected_vtbl_contents
  &(vtt_G8x13y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G8x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x13y6),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x13y6),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  G8x13y7  : virtual E8x13 , virtual F0 {
  int ff;
  ~G8x13y7(); // tgen
  G8x13y7(); // tgen
};
//SIG(1 G8x13y7) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G8x13y7 ::~G8x13y7(){ note_dtor("G8x13y7", this);} // tgen
G8x13y7 ::G8x13y7(){ note_ctor("G8x13y7", this);} // tgen

static void Test_G8x13y7()
{
  extern Class_Descriptor cd_G8x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G8x13y7, buf);
    G8x13y7 *dp, &lv = *(dp=new (buf) G8x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G8x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x13y7)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,24), "G8x13y7");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,32), "G8x13y7");
    check_base_class_offset(lv, (C8*)(E8x13*), ABISELECT(32,20), "G8x13y7");
    check_base_class_offset(lv, (D0*)(E8x13*), ABISELECT(24,12), "G8x13y7");
    check_base_class_offset(lv, (E8x13*), ABISELECT(16,8), "G8x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G8x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G8x13y7.ff");
    test_class_info(&lv, &cd_G8x13y7);
    dp->~G8x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x13y7(Test_G8x13y7, "G8x13y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G8x13y7C1Ev();
extern void _ZN7G8x13y7D1Ev();
Name_Map name_map_G8x13y7[] = {
  NSPAIR(_ZN7G8x13y7C1Ev),
  NSPAIR(_ZN7G8x13y7D1Ev),
  {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_E8x13;
extern VTBL_ENTRY _ZTI5E8x13[];
extern  VTBL_ENTRY _ZTV5E8x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x13y7[] = {
  // 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(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_E8x13,    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_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 _ZTI7G8x13y7[];
extern void _ZN5E8x133fooEv();
static  VTBL_ENTRY vtc_G8x13y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G8x13y7[0]),
  (VTBL_ENTRY)&_ZN5E8x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G8x13y7[0]),
};
extern VTBL_ENTRY _ZTV7G8x13y7[];
extern void _ZN5E8x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x13__7G8x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x13[0]),
  (VTBL_ENTRY)&_ZN5E8x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C8__5E8x13__7G8x13y7[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E8x13[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__7G8x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x13y7[] = {
  {&(_ZTV7G8x13y7[6]),  6,15},
  {&(_ZTV7G8x13y7[11]),  11,15},
  {&(_ZTV7G8x13y7[15]),  15,15},
  {&(_tg__ZTV5E8x13__7G8x13y7[4]),  4,5},
  {&(_tg__ZTV2C8__5E8x13__7G8x13y7[3]),  3,3},
  {&(_tg__ZTV2C8__7G8x13y7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x13y7[];
extern  VTBL_ENTRY _ZTV7G8x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x13y7[];
Class_Descriptor cd_G8x13y7 = {  "G8x13y7", // class name
  bases_G8x13y7, 6,
  &(vtc_G8x13y7[0]), // expected_vtbl_contents
  &(vtt_G8x13y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G8x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x13y7),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x13y7),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  E9x13  : virtual C9 , D0 {
  int fd;
  virtual void  foo(); // _ZN5E9x133fooEv
  ~E9x13(); // tgen
  E9x13(); // tgen
};
//SIG(-1 E9x13) C1{ VBC2{ BC3{ v1 Fi} VBC4{ Fi} Fi} BC5{ Fi} v1 Fi}


void  E9x13 ::foo(){vfunc_called(this, "_ZN5E9x133fooEv");}
E9x13 ::~E9x13(){ note_dtor("E9x13", this);} // tgen
E9x13 ::E9x13(){ note_ctor("E9x13", this);} // tgen

static void Test_E9x13()
{
  extern Class_Descriptor cd_E9x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E9x13, buf);
    E9x13 *dp, &lv = *(dp=new (buf) E9x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E9x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E9x13)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(16,12), "E9x13");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(32,24), "E9x13");
    check_base_class_offset(lv, (C9*), ABISELECT(16,12), "E9x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E9x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E9x13.fd");
    test_class_info(&lv, &cd_E9x13);
    dp->~E9x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE9x13(Test_E9x13, "E9x13", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E9x13C1Ev();
extern void _ZN5E9x13D1Ev();
Name_Map name_map_E9x13[] = {
  NSPAIR(_ZN5E9x13C1Ev),
  NSPAIR(_ZN5E9x13D1Ev),
  {0,0}
};
extern Class_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_E9x13[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E9x13[];
extern void _ZN5E9x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv)();
extern void ABISELECT(_ZThn16_N5E9x133fooEv,_ZThn12_N5E9x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E9x13[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x13[0]),
  (VTBL_ENTRY)&_ZN5E9x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E9x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv),
};
extern VTBL_ENTRY _ZTV5E9x13[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__5E9x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E9x13[] = {
  {&(_ZTV5E9x13[4]),  4,10},
  {&(_ZTV5E9x13[9]),  9,10},
  {&(_tg__ZTV2C9__5E9x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E9x13[];
extern  VTBL_ENTRY _ZTV5E9x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x13[];
static VTBL_ENTRY alt_thunk_names188[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x133fooEv,_ZThn12_N5E9x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E9x13 = {  "E9x13", // class name
  bases_E9x13, 4,
  &(vtc_E9x13[0]), // expected_vtbl_contents
  &(vtt_E9x13[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E9x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E9x13),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E9x13),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names188,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x13y0  : E9x13 , F1 {
  int ff;
  ~G9x13y0(); // tgen
  G9x13y0(); // tgen
};
//SIG(1 G9x13y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G9x13y0 ::~G9x13y0(){ note_dtor("G9x13y0", this);} // tgen
G9x13y0 ::G9x13y0(){ note_ctor("G9x13y0", this);} // tgen

static void Test_G9x13y0()
{
  extern Class_Descriptor cd_G9x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G9x13y0, buf);
    G9x13y0 *dp, &lv = *(dp=new (buf) G9x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G9x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x13y0)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,24), "G9x13y0");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,36), "G9x13y0");
    check_base_class_offset(lv, (C9*)(E9x13*), ABISELECT(32,24), "G9x13y0");
    check_base_class_offset(lv, (D0*)(E9x13*), ABISELECT(8,4), "G9x13y0");
    check_base_class_offset(lv, (E9x13*), 0, "G9x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G9x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G9x13y0.ff");
    test_class_info(&lv, &cd_G9x13y0);
    dp->~G9x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x13y0(Test_G9x13y0, "G9x13y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G9x13y0C1Ev();
extern void _ZN7G9x13y0D1Ev();
Name_Map name_map_G9x13y0[] = {
  NSPAIR(_ZN7G9x13y0C1Ev),
  NSPAIR(_ZN7G9x13y0D1Ev),
  {0,0}
};
extern Class_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_E9x13;
extern VTBL_ENTRY _ZTI5E9x13[];
extern  VTBL_ENTRY _ZTV5E9x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x13y0[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E9x13,    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
    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 _ZTI7G9x13y0[];
extern void _ZN5E9x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv)();
extern void ABISELECT(_ZThn32_N5E9x133fooEv,_ZThn24_N5E9x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G9x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x13y0[0]),
  (VTBL_ENTRY)&_ZN5E9x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G9x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G9x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv),
};
extern VTBL_ENTRY _ZTV7G9x13y0[];
extern void _ZN5E9x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x13__7G9x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x13[0]),
  (VTBL_ENTRY)&_ZN5E9x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv)();
extern void ABISELECT(_ZThn32_N5E9x133fooEv,_ZThn24_N5E9x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C9__5E9x13__7G9x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E9x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__7G9x13y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x13y0[] = {
  {&(_ZTV7G9x13y0[4]),  4,13},
  {&(_tg__ZTV5E9x13__7G9x13y0[4]),  4,5},
  {&(_tg__ZTV2C9__5E9x13__7G9x13y0[4]),  4,5},
  {&(_ZTV7G9x13y0[12]),  12,13},
  {&(_tg__ZTV2C9__7G9x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x13y0[];
extern  VTBL_ENTRY _ZTV7G9x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x13y0[];
static VTBL_ENTRY alt_thunk_names189[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E9x133fooEv,_ZThn24_N5E9x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E9x133fooEv,_ZThn24_N5E9x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G9x13y0 = {  "G9x13y0", // class name
  bases_G9x13y0, 6,
  &(vtc_G9x13y0[0]), // expected_vtbl_contents
  &(vtt_G9x13y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G9x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x13y0),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x13y0),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names189,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x13y1  : virtual E9x13 , F1 {
  int ff;
  ~G9x13y1(); // tgen
  G9x13y1(); // tgen
};
//SIG(1 G9x13y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G9x13y1 ::~G9x13y1(){ note_dtor("G9x13y1", this);} // tgen
G9x13y1 ::G9x13y1(){ note_ctor("G9x13y1", this);} // tgen

static void Test_G9x13y1()
{
  extern Class_Descriptor cd_G9x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G9x13y1, buf);
    G9x13y1 *dp, &lv = *(dp=new (buf) G9x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G9x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x13y1)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,24), "G9x13y1");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,36), "G9x13y1");
    check_base_class_offset(lv, (C9*)(E9x13*), ABISELECT(32,24), "G9x13y1");
    check_base_class_offset(lv, (D0*)(E9x13*), ABISELECT(24,16), "G9x13y1");
    check_base_class_offset(lv, (E9x13*), ABISELECT(16,12), "G9x13y1");
    check_base_class_offset(lv, (F1*), 0, "G9x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x13y1.ff");
    test_class_info(&lv, &cd_G9x13y1);
    dp->~G9x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x13y1(Test_G9x13y1, "G9x13y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G9x13y1C1Ev();
extern void _ZN7G9x13y1D1Ev();
Name_Map name_map_G9x13y1[] = {
  NSPAIR(_ZN7G9x13y1C1Ev),
  NSPAIR(_ZN7G9x13y1D1Ev),
  {0,0}
};
extern Class_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_E9x13;
extern VTBL_ENTRY _ZTI5E9x13[];
extern  VTBL_ENTRY _ZTV5E9x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x13y1[] = {
  // 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
    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(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_E9x13,    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 _ZTI7G9x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E9x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv)();
extern void ABISELECT(_ZThn16_N5E9x133fooEv,_ZThn12_N5E9x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G9x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G9x13y1[0]),
  (VTBL_ENTRY)&_ZN5E9x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G9x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv),
};
extern VTBL_ENTRY _ZTV7G9x13y1[];
extern void _ZN5E9x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x13__7G9x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x13[0]),
  (VTBL_ENTRY)&_ZN5E9x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv)();
extern void ABISELECT(_ZThn16_N5E9x133fooEv,_ZThn12_N5E9x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C9__5E9x13__7G9x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E9x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__7G9x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x13y1[] = {
  {&(_ZTV7G9x13y1[5]),  5,17},
  {&(_ZTV7G9x13y1[11]),  11,17},
  {&(_ZTV7G9x13y1[16]),  16,17},
  {&(_tg__ZTV5E9x13__7G9x13y1[4]),  4,5},
  {&(_tg__ZTV2C9__5E9x13__7G9x13y1[4]),  4,5},
  {&(_tg__ZTV2C9__7G9x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x13y1[];
extern  VTBL_ENTRY _ZTV7G9x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x13y1[];
static VTBL_ENTRY alt_thunk_names190[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x133fooEv,_ZThn12_N5E9x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x133fooEv,_ZThn12_N5E9x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G9x13y1 = {  "G9x13y1", // class name
  bases_G9x13y1, 6,
  &(vtc_G9x13y1[0]), // expected_vtbl_contents
  &(vtt_G9x13y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G9x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x13y1),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x13y1),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names190,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x13y2  : E9x13 , virtual F1 {
  int ff;
  ~G9x13y2(); // tgen
  G9x13y2(); // tgen
};
//SIG(1 G9x13y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G9x13y2 ::~G9x13y2(){ note_dtor("G9x13y2", this);} // tgen
G9x13y2 ::G9x13y2(){ note_ctor("G9x13y2", this);} // tgen

static void Test_G9x13y2()
{
  extern Class_Descriptor cd_G9x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G9x13y2, buf);
    G9x13y2 *dp, &lv = *(dp=new (buf) G9x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G9x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x13y2)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(24,16), "G9x13y2");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(40,28), "G9x13y2");
    check_base_class_offset(lv, (C9*)(E9x13*), ABISELECT(24,16), "G9x13y2");
    check_base_class_offset(lv, (D0*)(E9x13*), ABISELECT(8,4), "G9x13y2");
    check_base_class_offset(lv, (E9x13*), 0, "G9x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G9x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G9x13y2.ff");
    test_class_info(&lv, &cd_G9x13y2);
    dp->~G9x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x13y2(Test_G9x13y2, "G9x13y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G9x13y2C1Ev();
extern void _ZN7G9x13y2D1Ev();
Name_Map name_map_G9x13y2[] = {
  NSPAIR(_ZN7G9x13y2C1Ev),
  NSPAIR(_ZN7G9x13y2D1Ev),
  {0,0}
};
extern Class_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_E9x13;
extern VTBL_ENTRY _ZTI5E9x13[];
extern  VTBL_ENTRY _ZTV5E9x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x13y2[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E9x13,    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
    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 _ZTI7G9x13y2[];
extern void _ZN5E9x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv)();
extern void ABISELECT(_ZThn24_N5E9x133fooEv,_ZThn16_N5E9x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x13y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x13y2[0]),
  (VTBL_ENTRY)&_ZN5E9x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G9x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G9x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G9x13y2[];
extern void _ZN5E9x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x13__7G9x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x13[0]),
  (VTBL_ENTRY)&_ZN5E9x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv)();
extern void ABISELECT(_ZThn24_N5E9x133fooEv,_ZThn16_N5E9x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C9__5E9x13__7G9x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E9x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__7G9x13y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x13y2[] = {
  {&(_ZTV7G9x13y2[5]),  5,15},
  {&(_tg__ZTV5E9x13__7G9x13y2[4]),  4,5},
  {&(_tg__ZTV2C9__5E9x13__7G9x13y2[4]),  4,5},
  {&(_ZTV7G9x13y2[10]),  10,15},
  {&(_ZTV7G9x13y2[14]),  14,15},
  {&(_tg__ZTV2C9__7G9x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x13y2[];
extern  VTBL_ENTRY _ZTV7G9x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x13y2[];
static VTBL_ENTRY alt_thunk_names191[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E9x133fooEv,_ZThn16_N5E9x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E9x133fooEv,_ZThn16_N5E9x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G9x13y2 = {  "G9x13y2", // class name
  bases_G9x13y2, 6,
  &(vtc_G9x13y2[0]), // expected_vtbl_contents
  &(vtt_G9x13y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G9x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x13y2),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x13y2),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names191,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x13y3  : virtual E9x13 , virtual F1 {
  int ff;
  ~G9x13y3(); // tgen
  G9x13y3(); // tgen
};
//SIG(1 G9x13y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G9x13y3 ::~G9x13y3(){ note_dtor("G9x13y3", this);} // tgen
G9x13y3 ::G9x13y3(){ note_ctor("G9x13y3", this);} // tgen

static void Test_G9x13y3()
{
  extern Class_Descriptor cd_G9x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G9x13y3, buf);
    G9x13y3 *dp, &lv = *(dp=new (buf) G9x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G9x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x13y3)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,20), "G9x13y3");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,32), "G9x13y3");
    check_base_class_offset(lv, (C9*)(E9x13*), ABISELECT(32,20), "G9x13y3");
    check_base_class_offset(lv, (D0*)(E9x13*), ABISELECT(24,12), "G9x13y3");
    check_base_class_offset(lv, (E9x13*), ABISELECT(16,8), "G9x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G9x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G9x13y3.ff");
    test_class_info(&lv, &cd_G9x13y3);
    dp->~G9x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x13y3(Test_G9x13y3, "G9x13y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G9x13y3C1Ev();
extern void _ZN7G9x13y3D1Ev();
Name_Map name_map_G9x13y3[] = {
  NSPAIR(_ZN7G9x13y3C1Ev),
  NSPAIR(_ZN7G9x13y3D1Ev),
  {0,0}
};
extern Class_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_E9x13;
extern VTBL_ENTRY _ZTI5E9x13[];
extern  VTBL_ENTRY _ZTV5E9x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x13y3[] = {
  // 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
    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_E9x13,    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
    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 _ZTI7G9x13y3[];
extern void _ZN5E9x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv)();
extern void ABISELECT(_ZThn16_N5E9x133fooEv,_ZThn12_N5E9x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x13y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G9x13y3[0]),
  (VTBL_ENTRY)&_ZN5E9x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G9x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G9x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G9x13y3[];
extern void _ZN5E9x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x13__7G9x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x13[0]),
  (VTBL_ENTRY)&_ZN5E9x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv)();
extern void ABISELECT(_ZThn16_N5E9x133fooEv,_ZThn12_N5E9x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C9__5E9x13__7G9x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E9x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__7G9x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x13y3[] = {
  {&(_ZTV7G9x13y3[6]),  6,21},
  {&(_ZTV7G9x13y3[11]),  11,21},
  {&(_ZTV7G9x13y3[16]),  16,21},
  {&(_ZTV7G9x13y3[20]),  20,21},
  {&(_tg__ZTV5E9x13__7G9x13y3[4]),  4,5},
  {&(_tg__ZTV2C9__5E9x13__7G9x13y3[4]),  4,5},
  {&(_tg__ZTV2C9__7G9x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x13y3[];
extern  VTBL_ENTRY _ZTV7G9x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x13y3[];
static VTBL_ENTRY alt_thunk_names192[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x133fooEv,_ZThn12_N5E9x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x133fooEv,_ZThn12_N5E9x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G9x13y3 = {  "G9x13y3", // class name
  bases_G9x13y3, 6,
  &(vtc_G9x13y3[0]), // expected_vtbl_contents
  &(vtt_G9x13y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G9x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x13y3),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x13y3),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names192,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x13y4  : E9x13 , F0 {
  int ff;
  ~G9x13y4(); // tgen
  G9x13y4(); // tgen
};
//SIG(1 G9x13y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G9x13y4 ::~G9x13y4(){ note_dtor("G9x13y4", this);} // tgen
G9x13y4 ::G9x13y4(){ note_ctor("G9x13y4", this);} // tgen

static void Test_G9x13y4()
{
  extern Class_Descriptor cd_G9x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x13y4, buf);
    G9x13y4 *dp, &lv = *(dp=new (buf) G9x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x13y4)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(24,20), "G9x13y4");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(40,32), "G9x13y4");
    check_base_class_offset(lv, (C9*)(E9x13*), ABISELECT(24,20), "G9x13y4");
    check_base_class_offset(lv, (D0*)(E9x13*), ABISELECT(8,4), "G9x13y4");
    check_base_class_offset(lv, (E9x13*), 0, "G9x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G9x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G9x13y4.ff");
    test_class_info(&lv, &cd_G9x13y4);
    dp->~G9x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x13y4(Test_G9x13y4, "G9x13y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G9x13y4C1Ev();
extern void _ZN7G9x13y4D1Ev();
Name_Map name_map_G9x13y4[] = {
  NSPAIR(_ZN7G9x13y4C1Ev),
  NSPAIR(_ZN7G9x13y4D1Ev),
  {0,0}
};
extern Class_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_E9x13;
extern VTBL_ENTRY _ZTI5E9x13[];
extern  VTBL_ENTRY _ZTV5E9x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x13y4[] = {
  // 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
    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_E9x13,    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 _ZTI7G9x13y4[];
extern void _ZN5E9x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv)();
extern void ABISELECT(_ZThn24_N5E9x133fooEv,_ZThn20_N5E9x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G9x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x13y4[0]),
  (VTBL_ENTRY)&_ZN5E9x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G9x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv),
};
extern VTBL_ENTRY _ZTV7G9x13y4[];
extern void _ZN5E9x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x13__7G9x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x13[0]),
  (VTBL_ENTRY)&_ZN5E9x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv)();
extern void ABISELECT(_ZThn24_N5E9x133fooEv,_ZThn20_N5E9x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C9__5E9x13__7G9x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E9x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__7G9x13y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x13y4[] = {
  {&(_ZTV7G9x13y4[4]),  4,10},
  {&(_tg__ZTV5E9x13__7G9x13y4[4]),  4,5},
  {&(_tg__ZTV2C9__5E9x13__7G9x13y4[4]),  4,5},
  {&(_ZTV7G9x13y4[9]),  9,10},
  {&(_tg__ZTV2C9__7G9x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x13y4[];
extern  VTBL_ENTRY _ZTV7G9x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x13y4[];
static VTBL_ENTRY alt_thunk_names193[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E9x133fooEv,_ZThn20_N5E9x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E9x133fooEv,_ZThn20_N5E9x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G9x13y4 = {  "G9x13y4", // class name
  bases_G9x13y4, 6,
  &(vtc_G9x13y4[0]), // expected_vtbl_contents
  &(vtt_G9x13y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G9x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x13y4),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x13y4),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names193,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x13y5  : virtual E9x13 , F0 {
  int ff;
  ~G9x13y5(); // tgen
  G9x13y5(); // tgen
};
//SIG(1 G9x13y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G9x13y5 ::~G9x13y5(){ note_dtor("G9x13y5", this);} // tgen
G9x13y5 ::G9x13y5(){ note_ctor("G9x13y5", this);} // tgen

static void Test_G9x13y5()
{
  extern Class_Descriptor cd_G9x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G9x13y5, buf);
    G9x13y5 *dp, &lv = *(dp=new (buf) G9x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G9x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x13y5)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,24), "G9x13y5");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,36), "G9x13y5");
    check_base_class_offset(lv, (C9*)(E9x13*), ABISELECT(32,24), "G9x13y5");
    check_base_class_offset(lv, (D0*)(E9x13*), ABISELECT(24,16), "G9x13y5");
    check_base_class_offset(lv, (E9x13*), ABISELECT(16,12), "G9x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G9x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x13y5.ff");
    test_class_info(&lv, &cd_G9x13y5);
    dp->~G9x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x13y5(Test_G9x13y5, "G9x13y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G9x13y5C1Ev();
extern void _ZN7G9x13y5D1Ev();
Name_Map name_map_G9x13y5[] = {
  NSPAIR(_ZN7G9x13y5C1Ev),
  NSPAIR(_ZN7G9x13y5D1Ev),
  {0,0}
};
extern Class_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_E9x13;
extern VTBL_ENTRY _ZTI5E9x13[];
extern  VTBL_ENTRY _ZTV5E9x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x13y5[] = {
  // 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
    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(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_E9x13,    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 _ZTI7G9x13y5[];
extern void _ZN5E9x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv)();
extern void ABISELECT(_ZThn16_N5E9x133fooEv,_ZThn12_N5E9x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G9x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G9x13y5[0]),
  (VTBL_ENTRY)&_ZN5E9x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G9x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv),
};
extern VTBL_ENTRY _ZTV7G9x13y5[];
extern void _ZN5E9x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x13__7G9x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x13[0]),
  (VTBL_ENTRY)&_ZN5E9x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv)();
extern void ABISELECT(_ZThn16_N5E9x133fooEv,_ZThn12_N5E9x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C9__5E9x13__7G9x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E9x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__7G9x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x13y5[] = {
  {&(_ZTV7G9x13y5[5]),  5,16},
  {&(_ZTV7G9x13y5[10]),  10,16},
  {&(_ZTV7G9x13y5[15]),  15,16},
  {&(_tg__ZTV5E9x13__7G9x13y5[4]),  4,5},
  {&(_tg__ZTV2C9__5E9x13__7G9x13y5[4]),  4,5},
  {&(_tg__ZTV2C9__7G9x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x13y5[];
extern  VTBL_ENTRY _ZTV7G9x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x13y5[];
static VTBL_ENTRY alt_thunk_names194[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x133fooEv,_ZThn12_N5E9x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x133fooEv,_ZThn12_N5E9x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G9x13y5 = {  "G9x13y5", // class name
  bases_G9x13y5, 6,
  &(vtc_G9x13y5[0]), // expected_vtbl_contents
  &(vtt_G9x13y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G9x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x13y5),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x13y5),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names194,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x13y6  : E9x13 , virtual F0 {
  int ff;
  ~G9x13y6(); // tgen
  G9x13y6(); // tgen
};
//SIG(1 G9x13y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G9x13y6 ::~G9x13y6(){ note_dtor("G9x13y6", this);} // tgen
G9x13y6 ::G9x13y6(){ note_ctor("G9x13y6", this);} // tgen

static void Test_G9x13y6()
{
  extern Class_Descriptor cd_G9x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x13y6, buf);
    G9x13y6 *dp, &lv = *(dp=new (buf) G9x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x13y6)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(24,16), "G9x13y6");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(40,28), "G9x13y6");
    check_base_class_offset(lv, (C9*)(E9x13*), ABISELECT(24,16), "G9x13y6");
    check_base_class_offset(lv, (D0*)(E9x13*), ABISELECT(8,4), "G9x13y6");
    check_base_class_offset(lv, (E9x13*), 0, "G9x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G9x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G9x13y6.ff");
    test_class_info(&lv, &cd_G9x13y6);
    dp->~G9x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x13y6(Test_G9x13y6, "G9x13y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G9x13y6C1Ev();
extern void _ZN7G9x13y6D1Ev();
Name_Map name_map_G9x13y6[] = {
  NSPAIR(_ZN7G9x13y6C1Ev),
  NSPAIR(_ZN7G9x13y6D1Ev),
  {0,0}
};
extern Class_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_E9x13;
extern VTBL_ENTRY _ZTI5E9x13[];
extern  VTBL_ENTRY _ZTV5E9x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x13y6[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E9x13,    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 _ZTI7G9x13y6[];
extern void _ZN5E9x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv)();
extern void ABISELECT(_ZThn24_N5E9x133fooEv,_ZThn16_N5E9x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G9x13y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x13y6[0]),
  (VTBL_ENTRY)&_ZN5E9x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G9x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv),
};
extern VTBL_ENTRY _ZTV7G9x13y6[];
extern void _ZN5E9x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x13__7G9x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x13[0]),
  (VTBL_ENTRY)&_ZN5E9x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv)();
extern void ABISELECT(_ZThn24_N5E9x133fooEv,_ZThn16_N5E9x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C9__5E9x13__7G9x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E9x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__7G9x13y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x13y6[] = {
  {&(_ZTV7G9x13y6[5]),  5,11},
  {&(_tg__ZTV5E9x13__7G9x13y6[4]),  4,5},
  {&(_tg__ZTV2C9__5E9x13__7G9x13y6[4]),  4,5},
  {&(_ZTV7G9x13y6[10]),  10,11},
  {&(_tg__ZTV2C9__7G9x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x13y6[];
extern  VTBL_ENTRY _ZTV7G9x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x13y6[];
static VTBL_ENTRY alt_thunk_names195[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E9x133fooEv,_ZThn16_N5E9x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E9x133fooEv,_ZThn16_N5E9x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G9x13y6 = {  "G9x13y6", // class name
  bases_G9x13y6, 6,
  &(vtc_G9x13y6[0]), // expected_vtbl_contents
  &(vtt_G9x13y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G9x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x13y6),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x13y6),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names195,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x13y7  : virtual E9x13 , virtual F0 {
  int ff;
  ~G9x13y7(); // tgen
  G9x13y7(); // tgen
};
//SIG(1 G9x13y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G9x13y7 ::~G9x13y7(){ note_dtor("G9x13y7", this);} // tgen
G9x13y7 ::G9x13y7(){ note_ctor("G9x13y7", this);} // tgen

static void Test_G9x13y7()
{
  extern Class_Descriptor cd_G9x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G9x13y7, buf);
    G9x13y7 *dp, &lv = *(dp=new (buf) G9x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G9x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x13y7)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,20), "G9x13y7");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,32), "G9x13y7");
    check_base_class_offset(lv, (C9*)(E9x13*), ABISELECT(32,20), "G9x13y7");
    check_base_class_offset(lv, (D0*)(E9x13*), ABISELECT(24,12), "G9x13y7");
    check_base_class_offset(lv, (E9x13*), ABISELECT(16,8), "G9x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G9x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G9x13y7.ff");
    test_class_info(&lv, &cd_G9x13y7);
    dp->~G9x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x13y7(Test_G9x13y7, "G9x13y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G9x13y7C1Ev();
extern void _ZN7G9x13y7D1Ev();
Name_Map name_map_G9x13y7[] = {
  NSPAIR(_ZN7G9x13y7C1Ev),
  NSPAIR(_ZN7G9x13y7D1Ev),
  {0,0}
};
extern Class_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_E9x13;
extern VTBL_ENTRY _ZTI5E9x13[];
extern  VTBL_ENTRY _ZTV5E9x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x13y7[] = {
  // 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(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_E9x13,    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 _ZTI7G9x13y7[];
extern void _ZN5E9x133fooEv();
extern void ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv)();
extern void ABISELECT(_ZThn16_N5E9x133fooEv,_ZThn12_N5E9x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G9x13y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G9x13y7[0]),
  (VTBL_ENTRY)&_ZN5E9x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G9x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv),
};
extern VTBL_ENTRY _ZTV7G9x13y7[];
extern void _ZN5E9x133fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x13__7G9x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x13[0]),
  (VTBL_ENTRY)&_ZN5E9x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv)();
extern void ABISELECT(_ZThn16_N5E9x133fooEv,_ZThn12_N5E9x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C9__5E9x13__7G9x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E9x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__7G9x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x13y7[] = {
  {&(_ZTV7G9x13y7[6]),  6,17},
  {&(_ZTV7G9x13y7[11]),  11,17},
  {&(_ZTV7G9x13y7[16]),  16,17},
  {&(_tg__ZTV5E9x13__7G9x13y7[4]),  4,5},
  {&(_tg__ZTV2C9__5E9x13__7G9x13y7[4]),  4,5},
  {&(_tg__ZTV2C9__7G9x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x13y7[];
extern  VTBL_ENTRY _ZTV7G9x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x13y7[];
static VTBL_ENTRY alt_thunk_names196[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E9x133fooEv,_ZTv0_n16_N5E9x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x133fooEv,_ZThn12_N5E9x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x133fooEv,_ZThn12_N5E9x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G9x13y7 = {  "G9x13y7", // class name
  bases_G9x13y7, 6,
  &(vtc_G9x13y7[0]), // expected_vtbl_contents
  &(vtt_G9x13y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G9x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x13y7),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x13y7),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names196,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E10x13  : virtual C10 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E10x133fooEv
  ~E10x13(); // tgen
  E10x13(); // tgen
};
//SIG(-1 E10x13) C1{ VBC2{ VBC3{ Fi} VBC4{ Fi} Fi} BC5{ Fi} v1 Fi}


void  E10x13 ::foo(){vfunc_called(this, "_ZN6E10x133fooEv");}
E10x13 ::~E10x13(){ note_dtor("E10x13", this);} // tgen
E10x13 ::E10x13(){ note_ctor("E10x13", this);} // tgen

static void Test_E10x13()
{
  extern Class_Descriptor cd_E10x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E10x13, buf);
    E10x13 *dp, &lv = *(dp=new (buf) E10x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E10x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E10x13)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(28,20), "E10x13");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(32,24), "E10x13");
    check_base_class_offset(lv, (C10*), ABISELECT(16,12), "E10x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E10x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E10x13.fd");
    test_class_info(&lv, &cd_E10x13);
    dp->~E10x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE10x13(Test_E10x13, "E10x13", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E10x13C1Ev();
extern void _ZN6E10x13D1Ev();
Name_Map name_map_E10x13[] = {
  NSPAIR(_ZN6E10x13C1Ev),
  NSPAIR(_ZN6E10x13D1Ev),
  {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_E10x13[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6E10x13[];
extern void _ZN6E10x133fooEv();
static  VTBL_ENTRY vtc_E10x13[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x13[0]),
  (VTBL_ENTRY)&_ZN6E10x133fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E10x13[0]),
};
extern VTBL_ENTRY _ZTV6E10x13[];
static  VTBL_ENTRY _tg__ZTV3C10__6E10x13[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_E10x13[] = {
  {&(_ZTV6E10x13[5]),  5,10},
  {&(_ZTV6E10x13[10]),  10,10},
  {&(_tg__ZTV3C10__6E10x13[4]),  4,4},
};
extern VTBL_ENTRY _ZTI6E10x13[];
extern  VTBL_ENTRY _ZTV6E10x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x13[];
Class_Descriptor cd_E10x13 = {  "E10x13", // class name
  bases_E10x13, 4,
  &(vtc_E10x13[0]), // expected_vtbl_contents
  &(vtt_E10x13[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E10x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E10x13),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E10x13),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  G10x13y0  : E10x13 , F1 {
  int ff;
  ~G10x13y0(); // tgen
  G10x13y0(); // tgen
};
//SIG(1 G10x13y0) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G10x13y0 ::~G10x13y0(){ note_dtor("G10x13y0", this);} // tgen
G10x13y0 ::G10x13y0(){ note_ctor("G10x13y0", this);} // tgen

static void Test_G10x13y0()
{
  extern Class_Descriptor cd_G10x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G10x13y0, buf);
    G10x13y0 *dp, &lv = *(dp=new (buf) G10x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G10x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x13y0)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,32), "G10x13y0");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,36), "G10x13y0");
    check_base_class_offset(lv, (C10*)(E10x13*), ABISELECT(32,24), "G10x13y0");
    check_base_class_offset(lv, (D0*)(E10x13*), ABISELECT(8,4), "G10x13y0");
    check_base_class_offset(lv, (E10x13*), 0, "G10x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G10x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G10x13y0.ff");
    test_class_info(&lv, &cd_G10x13y0);
    dp->~G10x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x13y0(Test_G10x13y0, "G10x13y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G10x13y0C1Ev();
extern void _ZN8G10x13y0D1Ev();
Name_Map name_map_G10x13y0[] = {
  NSPAIR(_ZN8G10x13y0C1Ev),
  NSPAIR(_ZN8G10x13y0D1Ev),
  {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_E10x13;
extern VTBL_ENTRY _ZTI6E10x13[];
extern  VTBL_ENTRY _ZTV6E10x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x13y0[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E10x13,    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 _ZTI8G10x13y0[];
extern void _ZN6E10x133fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x13y0[0]),
  (VTBL_ENTRY)&_ZN6E10x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G10x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G10x13y0[0]),
};
extern VTBL_ENTRY _ZTV8G10x13y0[];
extern void _ZN6E10x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x13__8G10x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x13[0]),
  (VTBL_ENTRY)&_ZN6E10x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C10__6E10x13__8G10x13y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E10x13[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__8G10x13y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x13y0[] = {
  {&(_ZTV8G10x13y0[5]),  5,13},
  {&(_tg__ZTV6E10x13__8G10x13y0[5]),  5,6},
  {&(_tg__ZTV3C10__6E10x13__8G10x13y0[4]),  4,4},
  {&(_ZTV8G10x13y0[13]),  13,13},
  {&(_tg__ZTV3C10__8G10x13y0[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x13y0[];
extern  VTBL_ENTRY _ZTV8G10x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x13y0[];
Class_Descriptor cd_G10x13y0 = {  "G10x13y0", // class name
  bases_G10x13y0, 6,
  &(vtc_G10x13y0[0]), // expected_vtbl_contents
  &(vtt_G10x13y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G10x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x13y0),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x13y0),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  G10x13y1  : virtual E10x13 , F1 {
  int ff;
  ~G10x13y1(); // tgen
  G10x13y1(); // tgen
};
//SIG(1 G10x13y1) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G10x13y1 ::~G10x13y1(){ note_dtor("G10x13y1", this);} // tgen
G10x13y1 ::G10x13y1(){ note_ctor("G10x13y1", this);} // tgen

static void Test_G10x13y1()
{
  extern Class_Descriptor cd_G10x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G10x13y1, buf);
    G10x13y1 *dp, &lv = *(dp=new (buf) G10x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G10x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x13y1)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,32), "G10x13y1");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,36), "G10x13y1");
    check_base_class_offset(lv, (C10*)(E10x13*), ABISELECT(32,24), "G10x13y1");
    check_base_class_offset(lv, (D0*)(E10x13*), ABISELECT(24,16), "G10x13y1");
    check_base_class_offset(lv, (E10x13*), ABISELECT(16,12), "G10x13y1");
    check_base_class_offset(lv, (F1*), 0, "G10x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x13y1.ff");
    test_class_info(&lv, &cd_G10x13y1);
    dp->~G10x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x13y1(Test_G10x13y1, "G10x13y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G10x13y1C1Ev();
extern void _ZN8G10x13y1D1Ev();
Name_Map name_map_G10x13y1[] = {
  NSPAIR(_ZN8G10x13y1C1Ev),
  NSPAIR(_ZN8G10x13y1D1Ev),
  {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_E10x13;
extern VTBL_ENTRY _ZTI6E10x13[];
extern  VTBL_ENTRY _ZTV6E10x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x13y1[] = {
  // 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
    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(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_E10x13,    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_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 _ZTI8G10x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E10x133fooEv();
static  VTBL_ENTRY vtc_G10x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G10x13y1[0]),
  (VTBL_ENTRY)&_ZN6E10x133fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G10x13y1[0]),
};
extern VTBL_ENTRY _ZTV8G10x13y1[];
extern void _ZN6E10x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x13__8G10x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x13[0]),
  (VTBL_ENTRY)&_ZN6E10x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C10__6E10x13__8G10x13y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E10x13[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__8G10x13y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x13y1[] = {
  {&(_ZTV8G10x13y1[6]),  6,18},
  {&(_ZTV8G10x13y1[13]),  13,18},
  {&(_ZTV8G10x13y1[18]),  18,18},
  {&(_tg__ZTV6E10x13__8G10x13y1[5]),  5,6},
  {&(_tg__ZTV3C10__6E10x13__8G10x13y1[4]),  4,4},
  {&(_tg__ZTV3C10__8G10x13y1[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x13y1[];
extern  VTBL_ENTRY _ZTV8G10x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x13y1[];
Class_Descriptor cd_G10x13y1 = {  "G10x13y1", // class name
  bases_G10x13y1, 6,
  &(vtc_G10x13y1[0]), // expected_vtbl_contents
  &(vtt_G10x13y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G10x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x13y1),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x13y1),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  G10x13y2  : E10x13 , virtual F1 {
  int ff;
  ~G10x13y2(); // tgen
  G10x13y2(); // tgen
};
//SIG(1 G10x13y2) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G10x13y2 ::~G10x13y2(){ note_dtor("G10x13y2", this);} // tgen
G10x13y2 ::G10x13y2(){ note_ctor("G10x13y2", this);} // tgen

static void Test_G10x13y2()
{
  extern Class_Descriptor cd_G10x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G10x13y2, buf);
    G10x13y2 *dp, &lv = *(dp=new (buf) G10x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G10x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x13y2)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(36,24), "G10x13y2");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(40,28), "G10x13y2");
    check_base_class_offset(lv, (C10*)(E10x13*), ABISELECT(24,16), "G10x13y2");
    check_base_class_offset(lv, (D0*)(E10x13*), ABISELECT(8,4), "G10x13y2");
    check_base_class_offset(lv, (E10x13*), 0, "G10x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G10x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G10x13y2.ff");
    test_class_info(&lv, &cd_G10x13y2);
    dp->~G10x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x13y2(Test_G10x13y2, "G10x13y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G10x13y2C1Ev();
extern void _ZN8G10x13y2D1Ev();
Name_Map name_map_G10x13y2[] = {
  NSPAIR(_ZN8G10x13y2C1Ev),
  NSPAIR(_ZN8G10x13y2D1Ev),
  {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_E10x13;
extern VTBL_ENTRY _ZTI6E10x13[];
extern  VTBL_ENTRY _ZTV6E10x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x13y2[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E10x13,    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
    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 _ZTI8G10x13y2[];
extern void _ZN6E10x133fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x13y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x13y2[0]),
  (VTBL_ENTRY)&_ZN6E10x133fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G10x13y2[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G10x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G10x13y2[];
extern void _ZN6E10x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x13__8G10x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x13[0]),
  (VTBL_ENTRY)&_ZN6E10x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C10__6E10x13__8G10x13y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E10x13[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__8G10x13y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x13y2[] = {
  {&(_ZTV8G10x13y2[6]),  6,15},
  {&(_tg__ZTV6E10x13__8G10x13y2[5]),  5,6},
  {&(_tg__ZTV3C10__6E10x13__8G10x13y2[4]),  4,4},
  {&(_ZTV8G10x13y2[11]),  11,15},
  {&(_ZTV8G10x13y2[14]),  14,15},
  {&(_tg__ZTV3C10__8G10x13y2[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x13y2[];
extern  VTBL_ENTRY _ZTV8G10x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x13y2[];
Class_Descriptor cd_G10x13y2 = {  "G10x13y2", // class name
  bases_G10x13y2, 6,
  &(vtc_G10x13y2[0]), // expected_vtbl_contents
  &(vtt_G10x13y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G10x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x13y2),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x13y2),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  G10x13y3  : virtual E10x13 , virtual F1 {
  int ff;
  ~G10x13y3(); // tgen
  G10x13y3(); // tgen
};
//SIG(1 G10x13y3) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G10x13y3 ::~G10x13y3(){ note_dtor("G10x13y3", this);} // tgen
G10x13y3 ::G10x13y3(){ note_ctor("G10x13y3", this);} // tgen

static void Test_G10x13y3()
{
  extern Class_Descriptor cd_G10x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G10x13y3, buf);
    G10x13y3 *dp, &lv = *(dp=new (buf) G10x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G10x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x13y3)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,28), "G10x13y3");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,32), "G10x13y3");
    check_base_class_offset(lv, (C10*)(E10x13*), ABISELECT(32,20), "G10x13y3");
    check_base_class_offset(lv, (D0*)(E10x13*), ABISELECT(24,12), "G10x13y3");
    check_base_class_offset(lv, (E10x13*), ABISELECT(16,8), "G10x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G10x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G10x13y3.ff");
    test_class_info(&lv, &cd_G10x13y3);
    dp->~G10x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x13y3(Test_G10x13y3, "G10x13y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G10x13y3C1Ev();
extern void _ZN8G10x13y3D1Ev();
Name_Map name_map_G10x13y3[] = {
  NSPAIR(_ZN8G10x13y3C1Ev),
  NSPAIR(_ZN8G10x13y3D1Ev),
  {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_E10x13;
extern VTBL_ENTRY _ZTI6E10x13[];
extern  VTBL_ENTRY _ZTV6E10x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x13y3[] = {
  // 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
    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_E10x13,    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
    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 _ZTI8G10x13y3[];
extern void _ZN6E10x133fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x13y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G10x13y3[0]),
  (VTBL_ENTRY)&_ZN6E10x133fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G10x13y3[0]),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G10x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G10x13y3[];
extern void _ZN6E10x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x13__8G10x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x13[0]),
  (VTBL_ENTRY)&_ZN6E10x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C10__6E10x13__8G10x13y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E10x13[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__8G10x13y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x13y3[] = {
  {&(_ZTV8G10x13y3[7]),  7,22},
  {&(_ZTV8G10x13y3[13]),  13,22},
  {&(_ZTV8G10x13y3[18]),  18,22},
  {&(_ZTV8G10x13y3[21]),  21,22},
  {&(_tg__ZTV6E10x13__8G10x13y3[5]),  5,6},
  {&(_tg__ZTV3C10__6E10x13__8G10x13y3[4]),  4,4},
  {&(_tg__ZTV3C10__8G10x13y3[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x13y3[];
extern  VTBL_ENTRY _ZTV8G10x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x13y3[];
Class_Descriptor cd_G10x13y3 = {  "G10x13y3", // class name
  bases_G10x13y3, 6,
  &(vtc_G10x13y3[0]), // expected_vtbl_contents
  &(vtt_G10x13y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G10x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x13y3),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x13y3),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  G10x13y4  : E10x13 , F0 {
  int ff;
  ~G10x13y4(); // tgen
  G10x13y4(); // tgen
};
//SIG(1 G10x13y4) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G10x13y4 ::~G10x13y4(){ note_dtor("G10x13y4", this);} // tgen
G10x13y4 ::G10x13y4(){ note_ctor("G10x13y4", this);} // tgen

static void Test_G10x13y4()
{
  extern Class_Descriptor cd_G10x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x13y4, buf);
    G10x13y4 *dp, &lv = *(dp=new (buf) G10x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x13y4)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(36,28), "G10x13y4");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(40,32), "G10x13y4");
    check_base_class_offset(lv, (C10*)(E10x13*), ABISELECT(24,20), "G10x13y4");
    check_base_class_offset(lv, (D0*)(E10x13*), ABISELECT(8,4), "G10x13y4");
    check_base_class_offset(lv, (E10x13*), 0, "G10x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G10x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G10x13y4.ff");
    test_class_info(&lv, &cd_G10x13y4);
    dp->~G10x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x13y4(Test_G10x13y4, "G10x13y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G10x13y4C1Ev();
extern void _ZN8G10x13y4D1Ev();
Name_Map name_map_G10x13y4[] = {
  NSPAIR(_ZN8G10x13y4C1Ev),
  NSPAIR(_ZN8G10x13y4D1Ev),
  {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_E10x13;
extern VTBL_ENTRY _ZTI6E10x13[];
extern  VTBL_ENTRY _ZTV6E10x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x13y4[] = {
  // 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
    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_E10x13,    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 _ZTI8G10x13y4[];
extern void _ZN6E10x133fooEv();
static  VTBL_ENTRY vtc_G10x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x13y4[0]),
  (VTBL_ENTRY)&_ZN6E10x133fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G10x13y4[0]),
};
extern VTBL_ENTRY _ZTV8G10x13y4[];
extern void _ZN6E10x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x13__8G10x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x13[0]),
  (VTBL_ENTRY)&_ZN6E10x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C10__6E10x13__8G10x13y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E10x13[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__8G10x13y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x13y4[] = {
  {&(_ZTV8G10x13y4[5]),  5,10},
  {&(_tg__ZTV6E10x13__8G10x13y4[5]),  5,6},
  {&(_tg__ZTV3C10__6E10x13__8G10x13y4[4]),  4,4},
  {&(_ZTV8G10x13y4[10]),  10,10},
  {&(_tg__ZTV3C10__8G10x13y4[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x13y4[];
extern  VTBL_ENTRY _ZTV8G10x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x13y4[];
Class_Descriptor cd_G10x13y4 = {  "G10x13y4", // class name
  bases_G10x13y4, 6,
  &(vtc_G10x13y4[0]), // expected_vtbl_contents
  &(vtt_G10x13y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G10x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x13y4),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x13y4),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  G10x13y5  : virtual E10x13 , F0 {
  int ff;
  ~G10x13y5(); // tgen
  G10x13y5(); // tgen
};
//SIG(1 G10x13y5) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G10x13y5 ::~G10x13y5(){ note_dtor("G10x13y5", this);} // tgen
G10x13y5 ::G10x13y5(){ note_ctor("G10x13y5", this);} // tgen

static void Test_G10x13y5()
{
  extern Class_Descriptor cd_G10x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G10x13y5, buf);
    G10x13y5 *dp, &lv = *(dp=new (buf) G10x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G10x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x13y5)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,32), "G10x13y5");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,36), "G10x13y5");
    check_base_class_offset(lv, (C10*)(E10x13*), ABISELECT(32,24), "G10x13y5");
    check_base_class_offset(lv, (D0*)(E10x13*), ABISELECT(24,16), "G10x13y5");
    check_base_class_offset(lv, (E10x13*), ABISELECT(16,12), "G10x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G10x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x13y5.ff");
    test_class_info(&lv, &cd_G10x13y5);
    dp->~G10x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x13y5(Test_G10x13y5, "G10x13y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G10x13y5C1Ev();
extern void _ZN8G10x13y5D1Ev();
Name_Map name_map_G10x13y5[] = {
  NSPAIR(_ZN8G10x13y5C1Ev),
  NSPAIR(_ZN8G10x13y5D1Ev),
  {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_E10x13;
extern VTBL_ENTRY _ZTI6E10x13[];
extern  VTBL_ENTRY _ZTV6E10x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x13y5[] = {
  // 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
    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(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_E10x13,    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
    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 _ZTI8G10x13y5[];
extern void _ZN6E10x133fooEv();
static  VTBL_ENTRY vtc_G10x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G10x13y5[0]),
  (VTBL_ENTRY)&_ZN6E10x133fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G10x13y5[0]),
};
extern VTBL_ENTRY _ZTV8G10x13y5[];
extern void _ZN6E10x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x13__8G10x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x13[0]),
  (VTBL_ENTRY)&_ZN6E10x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C10__6E10x13__8G10x13y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E10x13[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__8G10x13y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x13y5[] = {
  {&(_ZTV8G10x13y5[6]),  6,17},
  {&(_ZTV8G10x13y5[12]),  12,17},
  {&(_ZTV8G10x13y5[17]),  17,17},
  {&(_tg__ZTV6E10x13__8G10x13y5[5]),  5,6},
  {&(_tg__ZTV3C10__6E10x13__8G10x13y5[4]),  4,4},
  {&(_tg__ZTV3C10__8G10x13y5[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x13y5[];
extern  VTBL_ENTRY _ZTV8G10x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x13y5[];
Class_Descriptor cd_G10x13y5 = {  "G10x13y5", // class name
  bases_G10x13y5, 6,
  &(vtc_G10x13y5[0]), // expected_vtbl_contents
  &(vtt_G10x13y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G10x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x13y5),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x13y5),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  G10x13y6  : E10x13 , virtual F0 {
  int ff;
  ~G10x13y6(); // tgen
  G10x13y6(); // tgen
};
//SIG(1 G10x13y6) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G10x13y6 ::~G10x13y6(){ note_dtor("G10x13y6", this);} // tgen
G10x13y6 ::G10x13y6(){ note_ctor("G10x13y6", this);} // tgen

static void Test_G10x13y6()
{
  extern Class_Descriptor cd_G10x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x13y6, buf);
    G10x13y6 *dp, &lv = *(dp=new (buf) G10x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x13y6)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(36,24), "G10x13y6");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(40,28), "G10x13y6");
    check_base_class_offset(lv, (C10*)(E10x13*), ABISELECT(24,16), "G10x13y6");
    check_base_class_offset(lv, (D0*)(E10x13*), ABISELECT(8,4), "G10x13y6");
    check_base_class_offset(lv, (E10x13*), 0, "G10x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G10x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G10x13y6.ff");
    test_class_info(&lv, &cd_G10x13y6);
    dp->~G10x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x13y6(Test_G10x13y6, "G10x13y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G10x13y6C1Ev();
extern void _ZN8G10x13y6D1Ev();
Name_Map name_map_G10x13y6[] = {
  NSPAIR(_ZN8G10x13y6C1Ev),
  NSPAIR(_ZN8G10x13y6D1Ev),
  {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_E10x13;
extern VTBL_ENTRY _ZTI6E10x13[];
extern  VTBL_ENTRY _ZTV6E10x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x13y6[] = {
  // 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
    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_E10x13,    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 _ZTI8G10x13y6[];
extern void _ZN6E10x133fooEv();
static  VTBL_ENTRY vtc_G10x13y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x13y6[0]),
  (VTBL_ENTRY)&_ZN6E10x133fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G10x13y6[0]),
};
extern VTBL_ENTRY _ZTV8G10x13y6[];
extern void _ZN6E10x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x13__8G10x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x13[0]),
  (VTBL_ENTRY)&_ZN6E10x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C10__6E10x13__8G10x13y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E10x13[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__8G10x13y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x13y6[] = {
  {&(_ZTV8G10x13y6[6]),  6,11},
  {&(_tg__ZTV6E10x13__8G10x13y6[5]),  5,6},
  {&(_tg__ZTV3C10__6E10x13__8G10x13y6[4]),  4,4},
  {&(_ZTV8G10x13y6[11]),  11,11},
  {&(_tg__ZTV3C10__8G10x13y6[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x13y6[];
extern  VTBL_ENTRY _ZTV8G10x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x13y6[];
Class_Descriptor cd_G10x13y6 = {  "G10x13y6", // class name
  bases_G10x13y6, 6,
  &(vtc_G10x13y6[0]), // expected_vtbl_contents
  &(vtt_G10x13y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G10x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x13y6),11, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x13y6),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  G10x13y7  : virtual E10x13 , virtual F0 {
  int ff;
  ~G10x13y7(); // tgen
  G10x13y7(); // tgen
};
//SIG(1 G10x13y7) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G10x13y7 ::~G10x13y7(){ note_dtor("G10x13y7", this);} // tgen
G10x13y7 ::G10x13y7(){ note_ctor("G10x13y7", this);} // tgen

static void Test_G10x13y7()
{
  extern Class_Descriptor cd_G10x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G10x13y7, buf);
    G10x13y7 *dp, &lv = *(dp=new (buf) G10x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G10x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x13y7)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,28), "G10x13y7");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,32), "G10x13y7");
    check_base_class_offset(lv, (C10*)(E10x13*), ABISELECT(32,20), "G10x13y7");
    check_base_class_offset(lv, (D0*)(E10x13*), ABISELECT(24,12), "G10x13y7");
    check_base_class_offset(lv, (E10x13*), ABISELECT(16,8), "G10x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G10x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G10x13y7.ff");
    test_class_info(&lv, &cd_G10x13y7);
    dp->~G10x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x13y7(Test_G10x13y7, "G10x13y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G10x13y7C1Ev();
extern void _ZN8G10x13y7D1Ev();
Name_Map name_map_G10x13y7[] = {
  NSPAIR(_ZN8G10x13y7C1Ev),
  NSPAIR(_ZN8G10x13y7D1Ev),
  {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_E10x13;
extern VTBL_ENTRY _ZTI6E10x13[];
extern  VTBL_ENTRY _ZTV6E10x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x13y7[] = {
  // 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(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_E10x13,    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_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 _ZTI8G10x13y7[];
extern void _ZN6E10x133fooEv();
static  VTBL_ENTRY vtc_G10x13y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G10x13y7[0]),
  (VTBL_ENTRY)&_ZN6E10x133fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G10x13y7[0]),
};
extern VTBL_ENTRY _ZTV8G10x13y7[];
extern void _ZN6E10x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x13__8G10x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x13[0]),
  (VTBL_ENTRY)&_ZN6E10x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C10__6E10x13__8G10x13y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E10x13[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__8G10x13y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x13y7[] = {
  {&(_ZTV8G10x13y7[7]),  7,18},
  {&(_ZTV8G10x13y7[13]),  13,18},
  {&(_ZTV8G10x13y7[18]),  18,18},
  {&(_tg__ZTV6E10x13__8G10x13y7[5]),  5,6},
  {&(_tg__ZTV3C10__6E10x13__8G10x13y7[4]),  4,4},
  {&(_tg__ZTV3C10__8G10x13y7[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x13y7[];
extern  VTBL_ENTRY _ZTV8G10x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x13y7[];
Class_Descriptor cd_G10x13y7 = {  "G10x13y7", // class name
  bases_G10x13y7, 6,
  &(vtc_G10x13y7[0]), // expected_vtbl_contents
  &(vtt_G10x13y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G10x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x13y7),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x13y7),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  E11x13  : virtual C11 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E11x133fooEv
  ~E11x13(); // tgen
  E11x13(); // tgen
};
//SIG(-1 E11x13) C1{ VBC2{ VBC3{ v1 Fi} VBC4{ Fi} Fi} BC5{ Fi} v1 Fi}


void  E11x13 ::foo(){vfunc_called(this, "_ZN6E11x133fooEv");}
E11x13 ::~E11x13(){ note_dtor("E11x13", this);} // tgen
E11x13 ::E11x13(){ note_ctor("E11x13", this);} // tgen

static void Test_E11x13()
{
  extern Class_Descriptor cd_E11x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E11x13, buf);
    E11x13 *dp, &lv = *(dp=new (buf) E11x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E11x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E11x13)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(32,20), "E11x13");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(44,28), "E11x13");
    check_base_class_offset(lv, (C11*), ABISELECT(16,12), "E11x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E11x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E11x13.fd");
    test_class_info(&lv, &cd_E11x13);
    dp->~E11x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE11x13(Test_E11x13, "E11x13", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E11x13C1Ev();
extern void _ZN6E11x13D1Ev();
Name_Map name_map_E11x13[] = {
  NSPAIR(_ZN6E11x13C1Ev),
  NSPAIR(_ZN6E11x13D1Ev),
  {0,0}
};
extern Class_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_E11x13[] = {
  // 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(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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6E11x13[];
extern void _ZN6E11x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv)();
extern void ABISELECT(_ZThn32_N6E11x133fooEv,_ZThn20_N6E11x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E11x13[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
  (VTBL_ENTRY)&_ZN6E11x133fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv),
};
extern VTBL_ENTRY _ZTV6E11x13[];
static  VTBL_ENTRY _tg__ZTV3C11__6E11x13[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__6E11x13[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E11x13[] = {
  {&(_ZTV6E11x13[5]),  5,14},
  {&(_ZTV6E11x13[10]),  10,14},
  {&(_ZTV6E11x13[13]),  13,14},
  {&(_tg__ZTV3C11__6E11x13[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__6E11x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E11x13[];
extern  VTBL_ENTRY _ZTV6E11x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x13[];
static VTBL_ENTRY alt_thunk_names197[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x133fooEv,_ZThn20_N6E11x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E11x13 = {  "E11x13", // class name
  bases_E11x13, 4,
  &(vtc_E11x13[0]), // expected_vtbl_contents
  &(vtt_E11x13[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E11x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E11x13),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E11x13),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  G11x13y0  : E11x13 , F1 {
  int ff;
  ~G11x13y0(); // tgen
  G11x13y0(); // tgen
};
//SIG(1 G11x13y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G11x13y0 ::~G11x13y0(){ note_dtor("G11x13y0", this);} // tgen
G11x13y0 ::G11x13y0(){ note_ctor("G11x13y0", this);} // tgen

static void Test_G11x13y0()
{
  extern Class_Descriptor cd_G11x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G11x13y0, buf);
    G11x13y0 *dp, &lv = *(dp=new (buf) G11x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G11x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x13y0)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,32), "G11x13y0");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,40), "G11x13y0");
    check_base_class_offset(lv, (C11*)(E11x13*), ABISELECT(32,24), "G11x13y0");
    check_base_class_offset(lv, (D0*)(E11x13*), ABISELECT(8,4), "G11x13y0");
    check_base_class_offset(lv, (E11x13*), 0, "G11x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G11x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G11x13y0.ff");
    test_class_info(&lv, &cd_G11x13y0);
    dp->~G11x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x13y0(Test_G11x13y0, "G11x13y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G11x13y0C1Ev();
extern void _ZN8G11x13y0D1Ev();
Name_Map name_map_G11x13y0[] = {
  NSPAIR(_ZN8G11x13y0C1Ev),
  NSPAIR(_ZN8G11x13y0D1Ev),
  {0,0}
};
extern Class_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_E11x13;
extern VTBL_ENTRY _ZTI6E11x13[];
extern  VTBL_ENTRY _ZTV6E11x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x13y0[] = {
  // 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(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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E11x13,    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 _ZTI8G11x13y0[];
extern void _ZN6E11x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv)();
extern void ABISELECT(_ZThn48_N6E11x133fooEv,_ZThn32_N6E11x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x13y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x13y0[0]),
  (VTBL_ENTRY)&_ZN6E11x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G11x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G11x13y0[0]),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G11x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv),
};
extern VTBL_ENTRY _ZTV8G11x13y0[];
extern void _ZN6E11x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x13__8G11x13y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
  (VTBL_ENTRY)&_ZN6E11x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__6E11x13__8G11x13y0[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv)();
extern void ABISELECT(_ZThn48_N6E11x133fooEv,_ZThn32_N6E11x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x13__8G11x13y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C11__8G11x13y0[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__8G11x13y0[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x13y0[] = {
  {&(_ZTV8G11x13y0[5]),  5,17},
  {&(_tg__ZTV6E11x13__8G11x13y0[5]),  5,6},
  {&(_tg__ZTV3C11__6E11x13__8G11x13y0[4]),  4,4},
  {&(_tg__ZTV2A1__6E11x13__8G11x13y0[3]),  3,4},
  {&(_ZTV8G11x13y0[13]),  13,17},
  {&(_ZTV8G11x13y0[16]),  16,17},
  {&(_tg__ZTV3C11__8G11x13y0[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__8G11x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x13y0[];
extern  VTBL_ENTRY _ZTV8G11x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x13y0[];
static VTBL_ENTRY alt_thunk_names198[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E11x133fooEv,_ZThn32_N6E11x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E11x133fooEv,_ZThn32_N6E11x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x13y0 = {  "G11x13y0", // class name
  bases_G11x13y0, 6,
  &(vtc_G11x13y0[0]), // expected_vtbl_contents
  &(vtt_G11x13y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G11x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x13y0),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x13y0),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  G11x13y1  : virtual E11x13 , F1 {
  int ff;
  ~G11x13y1(); // tgen
  G11x13y1(); // tgen
};
//SIG(1 G11x13y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G11x13y1 ::~G11x13y1(){ note_dtor("G11x13y1", this);} // tgen
G11x13y1 ::G11x13y1(){ note_ctor("G11x13y1", this);} // tgen

static void Test_G11x13y1()
{
  extern Class_Descriptor cd_G11x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G11x13y1, buf);
    G11x13y1 *dp, &lv = *(dp=new (buf) G11x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G11x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x13y1)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,32), "G11x13y1");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,40), "G11x13y1");
    check_base_class_offset(lv, (C11*)(E11x13*), ABISELECT(32,24), "G11x13y1");
    check_base_class_offset(lv, (D0*)(E11x13*), ABISELECT(24,16), "G11x13y1");
    check_base_class_offset(lv, (E11x13*), ABISELECT(16,12), "G11x13y1");
    check_base_class_offset(lv, (F1*), 0, "G11x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x13y1.ff");
    test_class_info(&lv, &cd_G11x13y1);
    dp->~G11x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x13y1(Test_G11x13y1, "G11x13y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G11x13y1C1Ev();
extern void _ZN8G11x13y1D1Ev();
Name_Map name_map_G11x13y1[] = {
  NSPAIR(_ZN8G11x13y1C1Ev),
  NSPAIR(_ZN8G11x13y1D1Ev),
  {0,0}
};
extern Class_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_E11x13;
extern VTBL_ENTRY _ZTI6E11x13[];
extern  VTBL_ENTRY _ZTV6E11x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x13y1[] = {
  // 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_C11,    ABISELECT(32,24), //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(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_E11x13,    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_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 _ZTI8G11x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E11x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv)();
extern void ABISELECT(_ZThn32_N6E11x133fooEv,_ZThn20_N6E11x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x13y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G11x13y1[0]),
  (VTBL_ENTRY)&_ZN6E11x133fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G11x13y1[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G11x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv),
};
extern VTBL_ENTRY _ZTV8G11x13y1[];
extern void _ZN6E11x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x13__8G11x13y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
  (VTBL_ENTRY)&_ZN6E11x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__6E11x13__8G11x13y1[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv)();
extern void ABISELECT(_ZThn32_N6E11x133fooEv,_ZThn20_N6E11x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x13__8G11x13y1[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C11__8G11x13y1[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__8G11x13y1[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x13y1[] = {
  {&(_ZTV8G11x13y1[6]),  6,22},
  {&(_ZTV8G11x13y1[13]),  13,22},
  {&(_ZTV8G11x13y1[18]),  18,22},
  {&(_ZTV8G11x13y1[21]),  21,22},
  {&(_tg__ZTV6E11x13__8G11x13y1[5]),  5,6},
  {&(_tg__ZTV3C11__6E11x13__8G11x13y1[4]),  4,4},
  {&(_tg__ZTV2A1__6E11x13__8G11x13y1[3]),  3,4},
  {&(_tg__ZTV3C11__8G11x13y1[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__8G11x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x13y1[];
extern  VTBL_ENTRY _ZTV8G11x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x13y1[];
static VTBL_ENTRY alt_thunk_names199[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x133fooEv,_ZThn20_N6E11x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x133fooEv,_ZThn20_N6E11x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x13y1 = {  "G11x13y1", // class name
  bases_G11x13y1, 6,
  &(vtc_G11x13y1[0]), // expected_vtbl_contents
  &(vtt_G11x13y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G11x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x13y1),22, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x13y1),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  G11x13y2  : E11x13 , virtual F1 {
  int ff;
  ~G11x13y2(); // tgen
  G11x13y2(); // tgen
};
//SIG(1 G11x13y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G11x13y2 ::~G11x13y2(){ note_dtor("G11x13y2", this);} // tgen
G11x13y2 ::G11x13y2(){ note_ctor("G11x13y2", this);} // tgen

static void Test_G11x13y2()
{
  extern Class_Descriptor cd_G11x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G11x13y2, buf);
    G11x13y2 *dp, &lv = *(dp=new (buf) G11x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G11x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x13y2)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(40,24), "G11x13y2");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(52,32), "G11x13y2");
    check_base_class_offset(lv, (C11*)(E11x13*), ABISELECT(24,16), "G11x13y2");
    check_base_class_offset(lv, (D0*)(E11x13*), ABISELECT(8,4), "G11x13y2");
    check_base_class_offset(lv, (E11x13*), 0, "G11x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G11x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G11x13y2.ff");
    test_class_info(&lv, &cd_G11x13y2);
    dp->~G11x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x13y2(Test_G11x13y2, "G11x13y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G11x13y2C1Ev();
extern void _ZN8G11x13y2D1Ev();
Name_Map name_map_G11x13y2[] = {
  NSPAIR(_ZN8G11x13y2C1Ev),
  NSPAIR(_ZN8G11x13y2D1Ev),
  {0,0}
};
extern Class_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_E11x13;
extern VTBL_ENTRY _ZTI6E11x13[];
extern  VTBL_ENTRY _ZTV6E11x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x13y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,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(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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E11x13,    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
    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 _ZTI8G11x13y2[];
extern void _ZN6E11x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv)();
extern void ABISELECT(_ZThn40_N6E11x133fooEv,_ZThn24_N6E11x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G11x13y2[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x13y2[0]),
  (VTBL_ENTRY)&_ZN6E11x133fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G11x13y2[0]),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G11x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G11x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G11x13y2[];
extern void _ZN6E11x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x13__8G11x13y2[] = {
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
  (VTBL_ENTRY)&_ZN6E11x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__6E11x13__8G11x13y2[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv)();
extern void ABISELECT(_ZThn40_N6E11x133fooEv,_ZThn24_N6E11x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x13__8G11x13y2[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C11__8G11x13y2[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__8G11x13y2[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x13y2[] = {
  {&(_ZTV8G11x13y2[6]),  6,19},
  {&(_tg__ZTV6E11x13__8G11x13y2[5]),  5,6},
  {&(_tg__ZTV3C11__6E11x13__8G11x13y2[4]),  4,4},
  {&(_tg__ZTV2A1__6E11x13__8G11x13y2[3]),  3,4},
  {&(_ZTV8G11x13y2[11]),  11,19},
  {&(_ZTV8G11x13y2[14]),  14,19},
  {&(_ZTV8G11x13y2[18]),  18,19},
  {&(_tg__ZTV3C11__8G11x13y2[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__8G11x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x13y2[];
extern  VTBL_ENTRY _ZTV8G11x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x13y2[];
static VTBL_ENTRY alt_thunk_names200[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E11x133fooEv,_ZThn24_N6E11x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E11x133fooEv,_ZThn24_N6E11x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x13y2 = {  "G11x13y2", // class name
  bases_G11x13y2, 6,
  &(vtc_G11x13y2[0]), // expected_vtbl_contents
  &(vtt_G11x13y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G11x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x13y2),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x13y2),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  G11x13y3  : virtual E11x13 , virtual F1 {
  int ff;
  ~G11x13y3(); // tgen
  G11x13y3(); // tgen
};
//SIG(1 G11x13y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G11x13y3 ::~G11x13y3(){ note_dtor("G11x13y3", this);} // tgen
G11x13y3 ::G11x13y3(){ note_ctor("G11x13y3", this);} // tgen

static void Test_G11x13y3()
{
  extern Class_Descriptor cd_G11x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G11x13y3, buf);
    G11x13y3 *dp, &lv = *(dp=new (buf) G11x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G11x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x13y3)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,28), "G11x13y3");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,36), "G11x13y3");
    check_base_class_offset(lv, (C11*)(E11x13*), ABISELECT(32,20), "G11x13y3");
    check_base_class_offset(lv, (D0*)(E11x13*), ABISELECT(24,12), "G11x13y3");
    check_base_class_offset(lv, (E11x13*), ABISELECT(16,8), "G11x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G11x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G11x13y3.ff");
    test_class_info(&lv, &cd_G11x13y3);
    dp->~G11x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x13y3(Test_G11x13y3, "G11x13y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G11x13y3C1Ev();
extern void _ZN8G11x13y3D1Ev();
Name_Map name_map_G11x13y3[] = {
  NSPAIR(_ZN8G11x13y3C1Ev),
  NSPAIR(_ZN8G11x13y3D1Ev),
  {0,0}
};
extern Class_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_E11x13;
extern VTBL_ENTRY _ZTI6E11x13[];
extern  VTBL_ENTRY _ZTV6E11x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x13y3[] = {
  // 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
    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_E11x13,    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
    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 _ZTI8G11x13y3[];
extern void _ZN6E11x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv)();
extern void ABISELECT(_ZThn32_N6E11x133fooEv,_ZThn20_N6E11x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G11x13y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x13y3[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G11x13y3[0]),
  (VTBL_ENTRY)&_ZN6E11x133fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G11x13y3[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G11x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G11x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G11x13y3[];
extern void _ZN6E11x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x13__8G11x13y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
  (VTBL_ENTRY)&_ZN6E11x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__6E11x13__8G11x13y3[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv)();
extern void ABISELECT(_ZThn32_N6E11x133fooEv,_ZThn20_N6E11x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x13__8G11x13y3[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C11__8G11x13y3[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__8G11x13y3[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x13y3[] = {
  {&(_ZTV8G11x13y3[7]),  7,26},
  {&(_ZTV8G11x13y3[13]),  13,26},
  {&(_ZTV8G11x13y3[18]),  18,26},
  {&(_ZTV8G11x13y3[21]),  21,26},
  {&(_ZTV8G11x13y3[25]),  25,26},
  {&(_tg__ZTV6E11x13__8G11x13y3[5]),  5,6},
  {&(_tg__ZTV3C11__6E11x13__8G11x13y3[4]),  4,4},
  {&(_tg__ZTV2A1__6E11x13__8G11x13y3[3]),  3,4},
  {&(_tg__ZTV3C11__8G11x13y3[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__8G11x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x13y3[];
extern  VTBL_ENTRY _ZTV8G11x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x13y3[];
static VTBL_ENTRY alt_thunk_names201[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x133fooEv,_ZThn20_N6E11x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x133fooEv,_ZThn20_N6E11x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x13y3 = {  "G11x13y3", // class name
  bases_G11x13y3, 6,
  &(vtc_G11x13y3[0]), // expected_vtbl_contents
  &(vtt_G11x13y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G11x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x13y3),26, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x13y3),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  G11x13y4  : E11x13 , F0 {
  int ff;
  ~G11x13y4(); // tgen
  G11x13y4(); // tgen
};
//SIG(1 G11x13y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G11x13y4 ::~G11x13y4(){ note_dtor("G11x13y4", this);} // tgen
G11x13y4 ::G11x13y4(){ note_ctor("G11x13y4", this);} // tgen

static void Test_G11x13y4()
{
  extern Class_Descriptor cd_G11x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x13y4, buf);
    G11x13y4 *dp, &lv = *(dp=new (buf) G11x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x13y4)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(40,28), "G11x13y4");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(52,36), "G11x13y4");
    check_base_class_offset(lv, (C11*)(E11x13*), ABISELECT(24,20), "G11x13y4");
    check_base_class_offset(lv, (D0*)(E11x13*), ABISELECT(8,4), "G11x13y4");
    check_base_class_offset(lv, (E11x13*), 0, "G11x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G11x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G11x13y4.ff");
    test_class_info(&lv, &cd_G11x13y4);
    dp->~G11x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x13y4(Test_G11x13y4, "G11x13y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G11x13y4C1Ev();
extern void _ZN8G11x13y4D1Ev();
Name_Map name_map_G11x13y4[] = {
  NSPAIR(_ZN8G11x13y4C1Ev),
  NSPAIR(_ZN8G11x13y4D1Ev),
  {0,0}
};
extern Class_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_E11x13;
extern VTBL_ENTRY _ZTI6E11x13[];
extern  VTBL_ENTRY _ZTV6E11x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x13y4[] = {
  // 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(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
    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_E11x13,    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 _ZTI8G11x13y4[];
extern void _ZN6E11x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv)();
extern void ABISELECT(_ZThn40_N6E11x133fooEv,_ZThn28_N6E11x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x13y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x13y4[0]),
  (VTBL_ENTRY)&_ZN6E11x133fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G11x13y4[0]),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G11x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv),
};
extern VTBL_ENTRY _ZTV8G11x13y4[];
extern void _ZN6E11x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x13__8G11x13y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
  (VTBL_ENTRY)&_ZN6E11x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__6E11x13__8G11x13y4[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv)();
extern void ABISELECT(_ZThn40_N6E11x133fooEv,_ZThn28_N6E11x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x13__8G11x13y4[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C11__8G11x13y4[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__8G11x13y4[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x13y4[] = {
  {&(_ZTV8G11x13y4[5]),  5,14},
  {&(_tg__ZTV6E11x13__8G11x13y4[5]),  5,6},
  {&(_tg__ZTV3C11__6E11x13__8G11x13y4[4]),  4,4},
  {&(_tg__ZTV2A1__6E11x13__8G11x13y4[3]),  3,4},
  {&(_ZTV8G11x13y4[10]),  10,14},
  {&(_ZTV8G11x13y4[13]),  13,14},
  {&(_tg__ZTV3C11__8G11x13y4[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__8G11x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x13y4[];
extern  VTBL_ENTRY _ZTV8G11x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x13y4[];
static VTBL_ENTRY alt_thunk_names202[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E11x133fooEv,_ZThn28_N6E11x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E11x133fooEv,_ZThn28_N6E11x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x13y4 = {  "G11x13y4", // class name
  bases_G11x13y4, 6,
  &(vtc_G11x13y4[0]), // expected_vtbl_contents
  &(vtt_G11x13y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G11x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x13y4),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x13y4),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  G11x13y5  : virtual E11x13 , F0 {
  int ff;
  ~G11x13y5(); // tgen
  G11x13y5(); // tgen
};
//SIG(1 G11x13y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G11x13y5 ::~G11x13y5(){ note_dtor("G11x13y5", this);} // tgen
G11x13y5 ::G11x13y5(){ note_ctor("G11x13y5", this);} // tgen

static void Test_G11x13y5()
{
  extern Class_Descriptor cd_G11x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G11x13y5, buf);
    G11x13y5 *dp, &lv = *(dp=new (buf) G11x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G11x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x13y5)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,32), "G11x13y5");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,40), "G11x13y5");
    check_base_class_offset(lv, (C11*)(E11x13*), ABISELECT(32,24), "G11x13y5");
    check_base_class_offset(lv, (D0*)(E11x13*), ABISELECT(24,16), "G11x13y5");
    check_base_class_offset(lv, (E11x13*), ABISELECT(16,12), "G11x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G11x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x13y5.ff");
    test_class_info(&lv, &cd_G11x13y5);
    dp->~G11x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x13y5(Test_G11x13y5, "G11x13y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G11x13y5C1Ev();
extern void _ZN8G11x13y5D1Ev();
Name_Map name_map_G11x13y5[] = {
  NSPAIR(_ZN8G11x13y5C1Ev),
  NSPAIR(_ZN8G11x13y5D1Ev),
  {0,0}
};
extern Class_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_E11x13;
extern VTBL_ENTRY _ZTI6E11x13[];
extern  VTBL_ENTRY _ZTV6E11x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x13y5[] = {
  // 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_C11,    ABISELECT(32,24), //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(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_E11x13,    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
    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 _ZTI8G11x13y5[];
extern void _ZN6E11x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv)();
extern void ABISELECT(_ZThn32_N6E11x133fooEv,_ZThn20_N6E11x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x13y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x13y5[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G11x13y5[0]),
  (VTBL_ENTRY)&_ZN6E11x133fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G11x13y5[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G11x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv),
};
extern VTBL_ENTRY _ZTV8G11x13y5[];
extern void _ZN6E11x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x13__8G11x13y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
  (VTBL_ENTRY)&_ZN6E11x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__6E11x13__8G11x13y5[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv)();
extern void ABISELECT(_ZThn32_N6E11x133fooEv,_ZThn20_N6E11x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x13__8G11x13y5[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C11__8G11x13y5[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__8G11x13y5[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x13y5[] = {
  {&(_ZTV8G11x13y5[6]),  6,21},
  {&(_ZTV8G11x13y5[12]),  12,21},
  {&(_ZTV8G11x13y5[17]),  17,21},
  {&(_ZTV8G11x13y5[20]),  20,21},
  {&(_tg__ZTV6E11x13__8G11x13y5[5]),  5,6},
  {&(_tg__ZTV3C11__6E11x13__8G11x13y5[4]),  4,4},
  {&(_tg__ZTV2A1__6E11x13__8G11x13y5[3]),  3,4},
  {&(_tg__ZTV3C11__8G11x13y5[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__8G11x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x13y5[];
extern  VTBL_ENTRY _ZTV8G11x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x13y5[];
static VTBL_ENTRY alt_thunk_names203[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x133fooEv,_ZThn20_N6E11x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x133fooEv,_ZThn20_N6E11x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x13y5 = {  "G11x13y5", // class name
  bases_G11x13y5, 6,
  &(vtc_G11x13y5[0]), // expected_vtbl_contents
  &(vtt_G11x13y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G11x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x13y5),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x13y5),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  G11x13y6  : E11x13 , virtual F0 {
  int ff;
  ~G11x13y6(); // tgen
  G11x13y6(); // tgen
};
//SIG(1 G11x13y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G11x13y6 ::~G11x13y6(){ note_dtor("G11x13y6", this);} // tgen
G11x13y6 ::G11x13y6(){ note_ctor("G11x13y6", this);} // tgen

static void Test_G11x13y6()
{
  extern Class_Descriptor cd_G11x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G11x13y6, buf);
    G11x13y6 *dp, &lv = *(dp=new (buf) G11x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G11x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x13y6)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(40,24), "G11x13y6");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(52,32), "G11x13y6");
    check_base_class_offset(lv, (C11*)(E11x13*), ABISELECT(24,16), "G11x13y6");
    check_base_class_offset(lv, (D0*)(E11x13*), ABISELECT(8,4), "G11x13y6");
    check_base_class_offset(lv, (E11x13*), 0, "G11x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G11x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G11x13y6.ff");
    test_class_info(&lv, &cd_G11x13y6);
    dp->~G11x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x13y6(Test_G11x13y6, "G11x13y6", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G11x13y6C1Ev();
extern void _ZN8G11x13y6D1Ev();
Name_Map name_map_G11x13y6[] = {
  NSPAIR(_ZN8G11x13y6C1Ev),
  NSPAIR(_ZN8G11x13y6D1Ev),
  {0,0}
};
extern Class_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_E11x13;
extern VTBL_ENTRY _ZTI6E11x13[];
extern  VTBL_ENTRY _ZTV6E11x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x13y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,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(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
    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_E11x13,    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 _ZTI8G11x13y6[];
extern void _ZN6E11x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv)();
extern void ABISELECT(_ZThn40_N6E11x133fooEv,_ZThn24_N6E11x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x13y6[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x13y6[0]),
  (VTBL_ENTRY)&_ZN6E11x133fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G11x13y6[0]),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G11x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv),
};
extern VTBL_ENTRY _ZTV8G11x13y6[];
extern void _ZN6E11x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x13__8G11x13y6[] = {
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
  (VTBL_ENTRY)&_ZN6E11x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__6E11x13__8G11x13y6[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv)();
extern void ABISELECT(_ZThn40_N6E11x133fooEv,_ZThn24_N6E11x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x13__8G11x13y6[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C11__8G11x13y6[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__8G11x13y6[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x13y6[] = {
  {&(_ZTV8G11x13y6[6]),  6,15},
  {&(_tg__ZTV6E11x13__8G11x13y6[5]),  5,6},
  {&(_tg__ZTV3C11__6E11x13__8G11x13y6[4]),  4,4},
  {&(_tg__ZTV2A1__6E11x13__8G11x13y6[3]),  3,4},
  {&(_ZTV8G11x13y6[11]),  11,15},
  {&(_ZTV8G11x13y6[14]),  14,15},
  {&(_tg__ZTV3C11__8G11x13y6[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__8G11x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x13y6[];
extern  VTBL_ENTRY _ZTV8G11x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x13y6[];
static VTBL_ENTRY alt_thunk_names204[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E11x133fooEv,_ZThn24_N6E11x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E11x133fooEv,_ZThn24_N6E11x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x13y6 = {  "G11x13y6", // class name
  bases_G11x13y6, 6,
  &(vtc_G11x13y6[0]), // expected_vtbl_contents
  &(vtt_G11x13y6[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G11x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x13y6),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x13y6),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  G11x13y7  : virtual E11x13 , virtual F0 {
  int ff;
  ~G11x13y7(); // tgen
  G11x13y7(); // tgen
};
//SIG(1 G11x13y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G11x13y7 ::~G11x13y7(){ note_dtor("G11x13y7", this);} // tgen
G11x13y7 ::G11x13y7(){ note_ctor("G11x13y7", this);} // tgen

static void Test_G11x13y7()
{
  extern Class_Descriptor cd_G11x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G11x13y7, buf);
    G11x13y7 *dp, &lv = *(dp=new (buf) G11x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G11x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x13y7)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,28), "G11x13y7");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,36), "G11x13y7");
    check_base_class_offset(lv, (C11*)(E11x13*), ABISELECT(32,20), "G11x13y7");
    check_base_class_offset(lv, (D0*)(E11x13*), ABISELECT(24,12), "G11x13y7");
    check_base_class_offset(lv, (E11x13*), ABISELECT(16,8), "G11x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G11x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G11x13y7.ff");
    test_class_info(&lv, &cd_G11x13y7);
    dp->~G11x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x13y7(Test_G11x13y7, "G11x13y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G11x13y7C1Ev();
extern void _ZN8G11x13y7D1Ev();
Name_Map name_map_G11x13y7[] = {
  NSPAIR(_ZN8G11x13y7C1Ev),
  NSPAIR(_ZN8G11x13y7D1Ev),
  {0,0}
};
extern Class_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_E11x13;
extern VTBL_ENTRY _ZTI6E11x13[];
extern  VTBL_ENTRY _ZTV6E11x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x13y7[] = {
  // 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(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_E11x13,    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_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 _ZTI8G11x13y7[];
extern void _ZN6E11x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv)();
extern void ABISELECT(_ZThn32_N6E11x133fooEv,_ZThn20_N6E11x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x13y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x13y7[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G11x13y7[0]),
  (VTBL_ENTRY)&_ZN6E11x133fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G11x13y7[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G11x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv),
};
extern VTBL_ENTRY _ZTV8G11x13y7[];
extern void _ZN6E11x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x13__8G11x13y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
  (VTBL_ENTRY)&_ZN6E11x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__6E11x13__8G11x13y7[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv)();
extern void ABISELECT(_ZThn32_N6E11x133fooEv,_ZThn20_N6E11x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x13__8G11x13y7[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E11x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C11__8G11x13y7[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__8G11x13y7[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x13y7[] = {
  {&(_ZTV8G11x13y7[7]),  7,22},
  {&(_ZTV8G11x13y7[13]),  13,22},
  {&(_ZTV8G11x13y7[18]),  18,22},
  {&(_ZTV8G11x13y7[21]),  21,22},
  {&(_tg__ZTV6E11x13__8G11x13y7[5]),  5,6},
  {&(_tg__ZTV3C11__6E11x13__8G11x13y7[4]),  4,4},
  {&(_tg__ZTV2A1__6E11x13__8G11x13y7[3]),  3,4},
  {&(_tg__ZTV3C11__8G11x13y7[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__8G11x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x13y7[];
extern  VTBL_ENTRY _ZTV8G11x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x13y7[];
static VTBL_ENTRY alt_thunk_names205[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x133fooEv,_ZTv0_n12_N6E11x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x133fooEv,_ZThn20_N6E11x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x133fooEv,_ZThn20_N6E11x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x13y7 = {  "G11x13y7", // class name
  bases_G11x13y7, 6,
  &(vtc_G11x13y7[0]), // expected_vtbl_contents
  &(vtt_G11x13y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G11x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x13y7),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x13y7),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  E12x13  : virtual C12 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E12x133fooEv
  ~E12x13(); // tgen
  E12x13(); // tgen
};
//SIG(-1 E12x13) C1{ VBC2{ BC3{ Fi} VBC4{ v1 Fi} Fi} BC5{ Fi} v1 Fi}


void  E12x13 ::foo(){vfunc_called(this, "_ZN6E12x133fooEv");}
E12x13 ::~E12x13(){ note_dtor("E12x13", this);} // tgen
E12x13 ::E12x13(){ note_ctor("E12x13", this);} // tgen

static void Test_E12x13()
{
  extern Class_Descriptor cd_E12x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E12x13, buf);
    E12x13 *dp, &lv = *(dp=new (buf) E12x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E12x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E12x13)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(24,16), "E12x13");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(32,24), "E12x13");
    check_base_class_offset(lv, (C12*), ABISELECT(16,12), "E12x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E12x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E12x13.fd");
    test_class_info(&lv, &cd_E12x13);
    dp->~E12x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE12x13(Test_E12x13, "E12x13", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E12x13C1Ev();
extern void _ZN6E12x13D1Ev();
Name_Map name_map_E12x13[] = {
  NSPAIR(_ZN6E12x13C1Ev),
  NSPAIR(_ZN6E12x13D1Ev),
  {0,0}
};
extern Class_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_E12x13[] = {
  // 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
    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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6E12x13[];
extern void _ZN6E12x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv)();
extern void ABISELECT(_ZThn32_N6E12x133fooEv,_ZThn24_N6E12x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E12x13[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
  (VTBL_ENTRY)&_ZN6E12x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv),
};
extern VTBL_ENTRY _ZTV6E12x13[];
static  VTBL_ENTRY _tg__ZTV3C12__6E12x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__6E12x13[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E12x13[] = {
  {&(_ZTV6E12x13[4]),  4,12},
  {&(_ZTV6E12x13[8]),  8,12},
  {&(_ZTV6E12x13[11]),  11,12},
  {&(_tg__ZTV3C12__6E12x13[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__6E12x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E12x13[];
extern  VTBL_ENTRY _ZTV6E12x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x13[];
static VTBL_ENTRY alt_thunk_names206[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x133fooEv,_ZThn24_N6E12x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E12x13 = {  "E12x13", // class name
  bases_E12x13, 4,
  &(vtc_E12x13[0]), // expected_vtbl_contents
  &(vtt_E12x13[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E12x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E12x13),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E12x13),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names206,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x13y0  : E12x13 , F1 {
  int ff;
  ~G12x13y0(); // tgen
  G12x13y0(); // tgen
};
//SIG(1 G12x13y0) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G12x13y0 ::~G12x13y0(){ note_dtor("G12x13y0", this);} // tgen
G12x13y0 ::G12x13y0(){ note_ctor("G12x13y0", this);} // tgen

static void Test_G12x13y0()
{
  extern Class_Descriptor cd_G12x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G12x13y0, buf);
    G12x13y0 *dp, &lv = *(dp=new (buf) G12x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G12x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x13y0)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,28), "G12x13y0");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,36), "G12x13y0");
    check_base_class_offset(lv, (C12*)(E12x13*), ABISELECT(32,24), "G12x13y0");
    check_base_class_offset(lv, (D0*)(E12x13*), ABISELECT(8,4), "G12x13y0");
    check_base_class_offset(lv, (E12x13*), 0, "G12x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G12x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G12x13y0.ff");
    test_class_info(&lv, &cd_G12x13y0);
    dp->~G12x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x13y0(Test_G12x13y0, "G12x13y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G12x13y0C1Ev();
extern void _ZN8G12x13y0D1Ev();
Name_Map name_map_G12x13y0[] = {
  NSPAIR(_ZN8G12x13y0C1Ev),
  NSPAIR(_ZN8G12x13y0D1Ev),
  {0,0}
};
extern Class_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_E12x13;
extern VTBL_ENTRY _ZTI6E12x13[];
extern  VTBL_ENTRY _ZTV6E12x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x13y0[] = {
  // 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
    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,24), //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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E12x13,    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
    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 _ZTI8G12x13y0[];
extern void _ZN6E12x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv)();
extern void ABISELECT(_ZThn48_N6E12x133fooEv,_ZThn36_N6E12x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x13y0[0]),
  (VTBL_ENTRY)&_ZN6E12x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G12x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G12x13y0[0]),
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G12x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv),
};
extern VTBL_ENTRY _ZTV8G12x13y0[];
extern void _ZN6E12x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x13__8G12x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
  (VTBL_ENTRY)&_ZN6E12x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__6E12x13__8G12x13y0[] = {
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv)();
extern void ABISELECT(_ZThn48_N6E12x133fooEv,_ZThn36_N6E12x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x13__8G12x13y0[] = {
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C12__8G12x13y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__8G12x13y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x13y0[] = {
  {&(_ZTV8G12x13y0[4]),  4,15},
  {&(_tg__ZTV6E12x13__8G12x13y0[4]),  4,5},
  {&(_tg__ZTV3C12__6E12x13__8G12x13y0[3]),  3,3},
  {&(_tg__ZTV2B1__6E12x13__8G12x13y0[3]),  3,4},
  {&(_ZTV8G12x13y0[11]),  11,15},
  {&(_ZTV8G12x13y0[14]),  14,15},
  {&(_tg__ZTV3C12__8G12x13y0[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__8G12x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x13y0[];
extern  VTBL_ENTRY _ZTV8G12x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x13y0[];
static VTBL_ENTRY alt_thunk_names207[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E12x133fooEv,_ZThn36_N6E12x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E12x133fooEv,_ZThn36_N6E12x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x13y0 = {  "G12x13y0", // class name
  bases_G12x13y0, 6,
  &(vtc_G12x13y0[0]), // expected_vtbl_contents
  &(vtt_G12x13y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G12x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x13y0),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x13y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names207,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x13y1  : virtual E12x13 , F1 {
  int ff;
  ~G12x13y1(); // tgen
  G12x13y1(); // tgen
};
//SIG(1 G12x13y1) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G12x13y1 ::~G12x13y1(){ note_dtor("G12x13y1", this);} // tgen
G12x13y1 ::G12x13y1(){ note_ctor("G12x13y1", this);} // tgen

static void Test_G12x13y1()
{
  extern Class_Descriptor cd_G12x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G12x13y1, buf);
    G12x13y1 *dp, &lv = *(dp=new (buf) G12x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G12x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x13y1)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,28), "G12x13y1");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,36), "G12x13y1");
    check_base_class_offset(lv, (C12*)(E12x13*), ABISELECT(32,24), "G12x13y1");
    check_base_class_offset(lv, (D0*)(E12x13*), ABISELECT(24,16), "G12x13y1");
    check_base_class_offset(lv, (E12x13*), ABISELECT(16,12), "G12x13y1");
    check_base_class_offset(lv, (F1*), 0, "G12x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x13y1.ff");
    test_class_info(&lv, &cd_G12x13y1);
    dp->~G12x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x13y1(Test_G12x13y1, "G12x13y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G12x13y1C1Ev();
extern void _ZN8G12x13y1D1Ev();
Name_Map name_map_G12x13y1[] = {
  NSPAIR(_ZN8G12x13y1C1Ev),
  NSPAIR(_ZN8G12x13y1D1Ev),
  {0,0}
};
extern Class_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_E12x13;
extern VTBL_ENTRY _ZTI6E12x13[];
extern  VTBL_ENTRY _ZTV6E12x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x13y1[] = {
  // 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_C12,    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
    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_E12x13,    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_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 _ZTI8G12x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E12x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv)();
extern void ABISELECT(_ZThn32_N6E12x133fooEv,_ZThn24_N6E12x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G12x13y1[0]),
  (VTBL_ENTRY)&_ZN6E12x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G12x13y1[0]),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G12x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv),
};
extern VTBL_ENTRY _ZTV8G12x13y1[];
extern void _ZN6E12x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x13__8G12x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
  (VTBL_ENTRY)&_ZN6E12x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__6E12x13__8G12x13y1[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv)();
extern void ABISELECT(_ZThn32_N6E12x133fooEv,_ZThn24_N6E12x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x13__8G12x13y1[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C12__8G12x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__8G12x13y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x13y1[] = {
  {&(_ZTV8G12x13y1[5]),  5,19},
  {&(_ZTV8G12x13y1[11]),  11,19},
  {&(_ZTV8G12x13y1[15]),  15,19},
  {&(_ZTV8G12x13y1[18]),  18,19},
  {&(_tg__ZTV6E12x13__8G12x13y1[4]),  4,5},
  {&(_tg__ZTV3C12__6E12x13__8G12x13y1[3]),  3,3},
  {&(_tg__ZTV2B1__6E12x13__8G12x13y1[3]),  3,4},
  {&(_tg__ZTV3C12__8G12x13y1[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__8G12x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x13y1[];
extern  VTBL_ENTRY _ZTV8G12x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x13y1[];
static VTBL_ENTRY alt_thunk_names208[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x133fooEv,_ZThn24_N6E12x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x133fooEv,_ZThn24_N6E12x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x13y1 = {  "G12x13y1", // class name
  bases_G12x13y1, 6,
  &(vtc_G12x13y1[0]), // expected_vtbl_contents
  &(vtt_G12x13y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G12x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x13y1),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x13y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names208,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x13y2  : E12x13 , virtual F1 {
  int ff;
  ~G12x13y2(); // tgen
  G12x13y2(); // tgen
};
//SIG(1 G12x13y2) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G12x13y2 ::~G12x13y2(){ note_dtor("G12x13y2", this);} // tgen
G12x13y2 ::G12x13y2(){ note_ctor("G12x13y2", this);} // tgen

static void Test_G12x13y2()
{
  extern Class_Descriptor cd_G12x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G12x13y2, buf);
    G12x13y2 *dp, &lv = *(dp=new (buf) G12x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G12x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x13y2)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(32,20), "G12x13y2");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(40,28), "G12x13y2");
    check_base_class_offset(lv, (C12*)(E12x13*), ABISELECT(24,16), "G12x13y2");
    check_base_class_offset(lv, (D0*)(E12x13*), ABISELECT(8,4), "G12x13y2");
    check_base_class_offset(lv, (E12x13*), 0, "G12x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G12x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G12x13y2.ff");
    test_class_info(&lv, &cd_G12x13y2);
    dp->~G12x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x13y2(Test_G12x13y2, "G12x13y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G12x13y2C1Ev();
extern void _ZN8G12x13y2D1Ev();
Name_Map name_map_G12x13y2[] = {
  NSPAIR(_ZN8G12x13y2C1Ev),
  NSPAIR(_ZN8G12x13y2D1Ev),
  {0,0}
};
extern Class_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_E12x13;
extern VTBL_ENTRY _ZTI6E12x13[];
extern  VTBL_ENTRY _ZTV6E12x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x13y2[] = {
  // 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
    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(24,16), //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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E12x13,    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
    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 _ZTI8G12x13y2[];
extern void _ZN6E12x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv)();
extern void ABISELECT(_ZThn40_N6E12x133fooEv,_ZThn28_N6E12x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G12x13y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x13y2[0]),
  (VTBL_ENTRY)&_ZN6E12x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G12x13y2[0]),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G12x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G12x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G12x13y2[];
extern void _ZN6E12x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x13__8G12x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
  (VTBL_ENTRY)&_ZN6E12x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__6E12x13__8G12x13y2[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv)();
extern void ABISELECT(_ZThn40_N6E12x133fooEv,_ZThn28_N6E12x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x13__8G12x13y2[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C12__8G12x13y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__8G12x13y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x13y2[] = {
  {&(_ZTV8G12x13y2[5]),  5,17},
  {&(_tg__ZTV6E12x13__8G12x13y2[4]),  4,5},
  {&(_tg__ZTV3C12__6E12x13__8G12x13y2[3]),  3,3},
  {&(_tg__ZTV2B1__6E12x13__8G12x13y2[3]),  3,4},
  {&(_ZTV8G12x13y2[9]),  9,17},
  {&(_ZTV8G12x13y2[12]),  12,17},
  {&(_ZTV8G12x13y2[16]),  16,17},
  {&(_tg__ZTV3C12__8G12x13y2[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__8G12x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x13y2[];
extern  VTBL_ENTRY _ZTV8G12x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x13y2[];
static VTBL_ENTRY alt_thunk_names209[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E12x133fooEv,_ZThn28_N6E12x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E12x133fooEv,_ZThn28_N6E12x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x13y2 = {  "G12x13y2", // class name
  bases_G12x13y2, 6,
  &(vtc_G12x13y2[0]), // expected_vtbl_contents
  &(vtt_G12x13y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G12x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x13y2),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x13y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names209,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x13y3  : virtual E12x13 , virtual F1 {
  int ff;
  ~G12x13y3(); // tgen
  G12x13y3(); // tgen
};
//SIG(1 G12x13y3) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G12x13y3 ::~G12x13y3(){ note_dtor("G12x13y3", this);} // tgen
G12x13y3 ::G12x13y3(){ note_ctor("G12x13y3", this);} // tgen

static void Test_G12x13y3()
{
  extern Class_Descriptor cd_G12x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G12x13y3, buf);
    G12x13y3 *dp, &lv = *(dp=new (buf) G12x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G12x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x13y3)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,24), "G12x13y3");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,32), "G12x13y3");
    check_base_class_offset(lv, (C12*)(E12x13*), ABISELECT(32,20), "G12x13y3");
    check_base_class_offset(lv, (D0*)(E12x13*), ABISELECT(24,12), "G12x13y3");
    check_base_class_offset(lv, (E12x13*), ABISELECT(16,8), "G12x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G12x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G12x13y3.ff");
    test_class_info(&lv, &cd_G12x13y3);
    dp->~G12x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x13y3(Test_G12x13y3, "G12x13y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G12x13y3C1Ev();
extern void _ZN8G12x13y3D1Ev();
Name_Map name_map_G12x13y3[] = {
  NSPAIR(_ZN8G12x13y3C1Ev),
  NSPAIR(_ZN8G12x13y3D1Ev),
  {0,0}
};
extern Class_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_E12x13;
extern VTBL_ENTRY _ZTI6E12x13[];
extern  VTBL_ENTRY _ZTV6E12x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x13y3[] = {
  // 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
    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_E12x13,    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
    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 _ZTI8G12x13y3[];
extern void _ZN6E12x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv)();
extern void ABISELECT(_ZThn32_N6E12x133fooEv,_ZThn24_N6E12x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G12x13y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G12x13y3[0]),
  (VTBL_ENTRY)&_ZN6E12x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G12x13y3[0]),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G12x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G12x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G12x13y3[];
extern void _ZN6E12x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x13__8G12x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
  (VTBL_ENTRY)&_ZN6E12x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__6E12x13__8G12x13y3[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv)();
extern void ABISELECT(_ZThn32_N6E12x133fooEv,_ZThn24_N6E12x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x13__8G12x13y3[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C12__8G12x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__8G12x13y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x13y3[] = {
  {&(_ZTV8G12x13y3[6]),  6,23},
  {&(_ZTV8G12x13y3[11]),  11,23},
  {&(_ZTV8G12x13y3[15]),  15,23},
  {&(_ZTV8G12x13y3[18]),  18,23},
  {&(_ZTV8G12x13y3[22]),  22,23},
  {&(_tg__ZTV6E12x13__8G12x13y3[4]),  4,5},
  {&(_tg__ZTV3C12__6E12x13__8G12x13y3[3]),  3,3},
  {&(_tg__ZTV2B1__6E12x13__8G12x13y3[3]),  3,4},
  {&(_tg__ZTV3C12__8G12x13y3[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__8G12x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x13y3[];
extern  VTBL_ENTRY _ZTV8G12x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x13y3[];
static VTBL_ENTRY alt_thunk_names210[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x133fooEv,_ZThn24_N6E12x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x133fooEv,_ZThn24_N6E12x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x13y3 = {  "G12x13y3", // class name
  bases_G12x13y3, 6,
  &(vtc_G12x13y3[0]), // expected_vtbl_contents
  &(vtt_G12x13y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G12x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x13y3),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x13y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names210,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x13y4  : E12x13 , F0 {
  int ff;
  ~G12x13y4(); // tgen
  G12x13y4(); // tgen
};
//SIG(1 G12x13y4) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G12x13y4 ::~G12x13y4(){ note_dtor("G12x13y4", this);} // tgen
G12x13y4 ::G12x13y4(){ note_ctor("G12x13y4", this);} // tgen

static void Test_G12x13y4()
{
  extern Class_Descriptor cd_G12x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x13y4, buf);
    G12x13y4 *dp, &lv = *(dp=new (buf) G12x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x13y4)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(32,24), "G12x13y4");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(40,32), "G12x13y4");
    check_base_class_offset(lv, (C12*)(E12x13*), ABISELECT(24,20), "G12x13y4");
    check_base_class_offset(lv, (D0*)(E12x13*), ABISELECT(8,4), "G12x13y4");
    check_base_class_offset(lv, (E12x13*), 0, "G12x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G12x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G12x13y4.ff");
    test_class_info(&lv, &cd_G12x13y4);
    dp->~G12x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x13y4(Test_G12x13y4, "G12x13y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G12x13y4C1Ev();
extern void _ZN8G12x13y4D1Ev();
Name_Map name_map_G12x13y4[] = {
  NSPAIR(_ZN8G12x13y4C1Ev),
  NSPAIR(_ZN8G12x13y4D1Ev),
  {0,0}
};
extern Class_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_E12x13;
extern VTBL_ENTRY _ZTI6E12x13[];
extern  VTBL_ENTRY _ZTV6E12x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x13y4[] = {
  // 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
    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,20), //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_E12x13,    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 _ZTI8G12x13y4[];
extern void _ZN6E12x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv)();
extern void ABISELECT(_ZThn40_N6E12x133fooEv,_ZThn32_N6E12x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x13y4[0]),
  (VTBL_ENTRY)&_ZN6E12x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G12x13y4[0]),
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G12x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv),
};
extern VTBL_ENTRY _ZTV8G12x13y4[];
extern void _ZN6E12x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x13__8G12x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
  (VTBL_ENTRY)&_ZN6E12x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__6E12x13__8G12x13y4[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv)();
extern void ABISELECT(_ZThn40_N6E12x133fooEv,_ZThn32_N6E12x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x13__8G12x13y4[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C12__8G12x13y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__8G12x13y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x13y4[] = {
  {&(_ZTV8G12x13y4[4]),  4,12},
  {&(_tg__ZTV6E12x13__8G12x13y4[4]),  4,5},
  {&(_tg__ZTV3C12__6E12x13__8G12x13y4[3]),  3,3},
  {&(_tg__ZTV2B1__6E12x13__8G12x13y4[3]),  3,4},
  {&(_ZTV8G12x13y4[8]),  8,12},
  {&(_ZTV8G12x13y4[11]),  11,12},
  {&(_tg__ZTV3C12__8G12x13y4[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__8G12x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x13y4[];
extern  VTBL_ENTRY _ZTV8G12x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x13y4[];
static VTBL_ENTRY alt_thunk_names211[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E12x133fooEv,_ZThn32_N6E12x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E12x133fooEv,_ZThn32_N6E12x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x13y4 = {  "G12x13y4", // class name
  bases_G12x13y4, 6,
  &(vtc_G12x13y4[0]), // expected_vtbl_contents
  &(vtt_G12x13y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G12x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x13y4),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x13y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names211,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x13y5  : virtual E12x13 , F0 {
  int ff;
  ~G12x13y5(); // tgen
  G12x13y5(); // tgen
};
//SIG(1 G12x13y5) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G12x13y5 ::~G12x13y5(){ note_dtor("G12x13y5", this);} // tgen
G12x13y5 ::G12x13y5(){ note_ctor("G12x13y5", this);} // tgen

static void Test_G12x13y5()
{
  extern Class_Descriptor cd_G12x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G12x13y5, buf);
    G12x13y5 *dp, &lv = *(dp=new (buf) G12x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G12x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x13y5)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,28), "G12x13y5");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,36), "G12x13y5");
    check_base_class_offset(lv, (C12*)(E12x13*), ABISELECT(32,24), "G12x13y5");
    check_base_class_offset(lv, (D0*)(E12x13*), ABISELECT(24,16), "G12x13y5");
    check_base_class_offset(lv, (E12x13*), ABISELECT(16,12), "G12x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G12x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x13y5.ff");
    test_class_info(&lv, &cd_G12x13y5);
    dp->~G12x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x13y5(Test_G12x13y5, "G12x13y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G12x13y5C1Ev();
extern void _ZN8G12x13y5D1Ev();
Name_Map name_map_G12x13y5[] = {
  NSPAIR(_ZN8G12x13y5C1Ev),
  NSPAIR(_ZN8G12x13y5D1Ev),
  {0,0}
};
extern Class_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_E12x13;
extern VTBL_ENTRY _ZTI6E12x13[];
extern  VTBL_ENTRY _ZTV6E12x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x13y5[] = {
  // 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_C12,    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
    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_E12x13,    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_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 _ZTI8G12x13y5[];
extern void _ZN6E12x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv)();
extern void ABISELECT(_ZThn32_N6E12x133fooEv,_ZThn24_N6E12x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G12x13y5[0]),
  (VTBL_ENTRY)&_ZN6E12x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G12x13y5[0]),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G12x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv),
};
extern VTBL_ENTRY _ZTV8G12x13y5[];
extern void _ZN6E12x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x13__8G12x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
  (VTBL_ENTRY)&_ZN6E12x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__6E12x13__8G12x13y5[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv)();
extern void ABISELECT(_ZThn32_N6E12x133fooEv,_ZThn24_N6E12x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x13__8G12x13y5[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C12__8G12x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__8G12x13y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x13y5[] = {
  {&(_ZTV8G12x13y5[5]),  5,18},
  {&(_ZTV8G12x13y5[10]),  10,18},
  {&(_ZTV8G12x13y5[14]),  14,18},
  {&(_ZTV8G12x13y5[17]),  17,18},
  {&(_tg__ZTV6E12x13__8G12x13y5[4]),  4,5},
  {&(_tg__ZTV3C12__6E12x13__8G12x13y5[3]),  3,3},
  {&(_tg__ZTV2B1__6E12x13__8G12x13y5[3]),  3,4},
  {&(_tg__ZTV3C12__8G12x13y5[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__8G12x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x13y5[];
extern  VTBL_ENTRY _ZTV8G12x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x13y5[];
static VTBL_ENTRY alt_thunk_names212[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x133fooEv,_ZThn24_N6E12x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x133fooEv,_ZThn24_N6E12x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x13y5 = {  "G12x13y5", // class name
  bases_G12x13y5, 6,
  &(vtc_G12x13y5[0]), // expected_vtbl_contents
  &(vtt_G12x13y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G12x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x13y5),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x13y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names212,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x13y6  : E12x13 , virtual F0 {
  int ff;
  ~G12x13y6(); // tgen
  G12x13y6(); // tgen
};
//SIG(1 G12x13y6) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G12x13y6 ::~G12x13y6(){ note_dtor("G12x13y6", this);} // tgen
G12x13y6 ::G12x13y6(){ note_ctor("G12x13y6", this);} // tgen

static void Test_G12x13y6()
{
  extern Class_Descriptor cd_G12x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x13y6, buf);
    G12x13y6 *dp, &lv = *(dp=new (buf) G12x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x13y6)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(32,20), "G12x13y6");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(40,28), "G12x13y6");
    check_base_class_offset(lv, (C12*)(E12x13*), ABISELECT(24,16), "G12x13y6");
    check_base_class_offset(lv, (D0*)(E12x13*), ABISELECT(8,4), "G12x13y6");
    check_base_class_offset(lv, (E12x13*), 0, "G12x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G12x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G12x13y6.ff");
    test_class_info(&lv, &cd_G12x13y6);
    dp->~G12x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x13y6(Test_G12x13y6, "G12x13y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G12x13y6C1Ev();
extern void _ZN8G12x13y6D1Ev();
Name_Map name_map_G12x13y6[] = {
  NSPAIR(_ZN8G12x13y6C1Ev),
  NSPAIR(_ZN8G12x13y6D1Ev),
  {0,0}
};
extern Class_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_E12x13;
extern VTBL_ENTRY _ZTI6E12x13[];
extern  VTBL_ENTRY _ZTV6E12x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x13y6[] = {
  // 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
    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(24,16), //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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E12x13,    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 _ZTI8G12x13y6[];
extern void _ZN6E12x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv)();
extern void ABISELECT(_ZThn40_N6E12x133fooEv,_ZThn28_N6E12x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x13y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x13y6[0]),
  (VTBL_ENTRY)&_ZN6E12x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G12x13y6[0]),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G12x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv),
};
extern VTBL_ENTRY _ZTV8G12x13y6[];
extern void _ZN6E12x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x13__8G12x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
  (VTBL_ENTRY)&_ZN6E12x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__6E12x13__8G12x13y6[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv)();
extern void ABISELECT(_ZThn40_N6E12x133fooEv,_ZThn28_N6E12x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x13__8G12x13y6[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C12__8G12x13y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__8G12x13y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x13y6[] = {
  {&(_ZTV8G12x13y6[5]),  5,13},
  {&(_tg__ZTV6E12x13__8G12x13y6[4]),  4,5},
  {&(_tg__ZTV3C12__6E12x13__8G12x13y6[3]),  3,3},
  {&(_tg__ZTV2B1__6E12x13__8G12x13y6[3]),  3,4},
  {&(_ZTV8G12x13y6[9]),  9,13},
  {&(_ZTV8G12x13y6[12]),  12,13},
  {&(_tg__ZTV3C12__8G12x13y6[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__8G12x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x13y6[];
extern  VTBL_ENTRY _ZTV8G12x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x13y6[];
static VTBL_ENTRY alt_thunk_names213[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E12x133fooEv,_ZThn28_N6E12x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E12x133fooEv,_ZThn28_N6E12x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x13y6 = {  "G12x13y6", // class name
  bases_G12x13y6, 6,
  &(vtc_G12x13y6[0]), // expected_vtbl_contents
  &(vtt_G12x13y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G12x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x13y6),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x13y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names213,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x13y7  : virtual E12x13 , virtual F0 {
  int ff;
  ~G12x13y7(); // tgen
  G12x13y7(); // tgen
};
//SIG(1 G12x13y7) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G12x13y7 ::~G12x13y7(){ note_dtor("G12x13y7", this);} // tgen
G12x13y7 ::G12x13y7(){ note_ctor("G12x13y7", this);} // tgen

static void Test_G12x13y7()
{
  extern Class_Descriptor cd_G12x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G12x13y7, buf);
    G12x13y7 *dp, &lv = *(dp=new (buf) G12x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G12x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x13y7)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,24), "G12x13y7");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,32), "G12x13y7");
    check_base_class_offset(lv, (C12*)(E12x13*), ABISELECT(32,20), "G12x13y7");
    check_base_class_offset(lv, (D0*)(E12x13*), ABISELECT(24,12), "G12x13y7");
    check_base_class_offset(lv, (E12x13*), ABISELECT(16,8), "G12x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G12x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G12x13y7.ff");
    test_class_info(&lv, &cd_G12x13y7);
    dp->~G12x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x13y7(Test_G12x13y7, "G12x13y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G12x13y7C1Ev();
extern void _ZN8G12x13y7D1Ev();
Name_Map name_map_G12x13y7[] = {
  NSPAIR(_ZN8G12x13y7C1Ev),
  NSPAIR(_ZN8G12x13y7D1Ev),
  {0,0}
};
extern Class_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_E12x13;
extern VTBL_ENTRY _ZTI6E12x13[];
extern  VTBL_ENTRY _ZTV6E12x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x13y7[] = {
  // 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(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_E12x13,    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_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 _ZTI8G12x13y7[];
extern void _ZN6E12x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv)();
extern void ABISELECT(_ZThn32_N6E12x133fooEv,_ZThn24_N6E12x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x13y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G12x13y7[0]),
  (VTBL_ENTRY)&_ZN6E12x133fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G12x13y7[0]),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G12x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv),
};
extern VTBL_ENTRY _ZTV8G12x13y7[];
extern void _ZN6E12x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x13__8G12x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
  (VTBL_ENTRY)&_ZN6E12x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__6E12x13__8G12x13y7[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv)();
extern void ABISELECT(_ZThn32_N6E12x133fooEv,_ZThn24_N6E12x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x13__8G12x13y7[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E12x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C12__8G12x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__8G12x13y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x13y7[] = {
  {&(_ZTV8G12x13y7[6]),  6,19},
  {&(_ZTV8G12x13y7[11]),  11,19},
  {&(_ZTV8G12x13y7[15]),  15,19},
  {&(_ZTV8G12x13y7[18]),  18,19},
  {&(_tg__ZTV6E12x13__8G12x13y7[4]),  4,5},
  {&(_tg__ZTV3C12__6E12x13__8G12x13y7[3]),  3,3},
  {&(_tg__ZTV2B1__6E12x13__8G12x13y7[3]),  3,4},
  {&(_tg__ZTV3C12__8G12x13y7[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__8G12x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x13y7[];
extern  VTBL_ENTRY _ZTV8G12x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x13y7[];
static VTBL_ENTRY alt_thunk_names214[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x133fooEv,_ZTv0_n12_N6E12x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x133fooEv,_ZThn24_N6E12x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x133fooEv,_ZThn24_N6E12x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x13y7 = {  "G12x13y7", // class name
  bases_G12x13y7, 6,
  &(vtc_G12x13y7[0]), // expected_vtbl_contents
  &(vtt_G12x13y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G12x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x13y7),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x13y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names214,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E13x13  : virtual C13 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E13x133fooEv
  ~E13x13(); // tgen
  E13x13(); // tgen
};
//SIG(-1 E13x13) C1{ VBC2{ BC3{ v1 Fi} VBC4{ v1 Fi} Fi} BC5{ Fi} v1 Fi}


void  E13x13 ::foo(){vfunc_called(this, "_ZN6E13x133fooEv");}
E13x13 ::~E13x13(){ note_dtor("E13x13", this);} // tgen
E13x13 ::E13x13(){ note_ctor("E13x13", this);} // tgen

static void Test_E13x13()
{
  extern Class_Descriptor cd_E13x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E13x13, buf);
    E13x13 *dp, &lv = *(dp=new (buf) E13x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E13x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E13x13)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(16,12), "E13x13");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(32,24), "E13x13");
    check_base_class_offset(lv, (C13*), ABISELECT(16,12), "E13x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E13x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E13x13.fd");
    test_class_info(&lv, &cd_E13x13);
    dp->~E13x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE13x13(Test_E13x13, "E13x13", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E13x13C1Ev();
extern void _ZN6E13x13D1Ev();
Name_Map name_map_E13x13[] = {
  NSPAIR(_ZN6E13x13C1Ev),
  NSPAIR(_ZN6E13x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x13[] = {
  // 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
    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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6E13x13[];
extern void _ZN6E13x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv)();
extern void ABISELECT(_ZThn16_N6E13x133fooEv,_ZThn12_N6E13x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv)();
extern void ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E13x13[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&_ZN6E13x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv),
};
extern VTBL_ENTRY _ZTV6E13x13[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__6E13x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__6E13x13[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E13x13[] = {
  {&(_ZTV6E13x13[4]),  4,14},
  {&(_ZTV6E13x13[9]),  9,14},
  {&(_ZTV6E13x13[13]),  13,14},
  {&(_tg__ZTV3C13__6E13x13[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__6E13x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E13x13[];
extern  VTBL_ENTRY _ZTV6E13x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x13[];
static VTBL_ENTRY alt_thunk_names215[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x133fooEv,_ZThn12_N6E13x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E13x13 = {  "E13x13", // class name
  bases_E13x13, 4,
  &(vtc_E13x13[0]), // expected_vtbl_contents
  &(vtt_E13x13[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E13x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E13x13),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E13x13),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names215,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x13y0  : E13x13 , F1 {
  int ff;
  ~G13x13y0(); // tgen
  G13x13y0(); // tgen
};
//SIG(1 G13x13y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G13x13y0 ::~G13x13y0(){ note_dtor("G13x13y0", this);} // tgen
G13x13y0 ::G13x13y0(){ note_ctor("G13x13y0", this);} // tgen

static void Test_G13x13y0()
{
  extern Class_Descriptor cd_G13x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G13x13y0, buf);
    G13x13y0 *dp, &lv = *(dp=new (buf) G13x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G13x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x13y0)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,24), "G13x13y0");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,36), "G13x13y0");
    check_base_class_offset(lv, (C13*)(E13x13*), ABISELECT(32,24), "G13x13y0");
    check_base_class_offset(lv, (D0*)(E13x13*), ABISELECT(8,4), "G13x13y0");
    check_base_class_offset(lv, (E13x13*), 0, "G13x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G13x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G13x13y0.ff");
    test_class_info(&lv, &cd_G13x13y0);
    dp->~G13x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x13y0(Test_G13x13y0, "G13x13y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G13x13y0C1Ev();
extern void _ZN8G13x13y0D1Ev();
Name_Map name_map_G13x13y0[] = {
  NSPAIR(_ZN8G13x13y0C1Ev),
  NSPAIR(_ZN8G13x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x13;
extern VTBL_ENTRY _ZTI6E13x13[];
extern  VTBL_ENTRY _ZTV6E13x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x13y0[] = {
  // 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
    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,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
    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_E13x13,    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
    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 _ZTI8G13x13y0[];
extern void _ZN6E13x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv)();
extern void ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv)();
extern void ABISELECT(_ZThn48_N6E13x133fooEv,_ZThn36_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x13y0[0]),
  (VTBL_ENTRY)&_ZN6E13x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G13x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G13x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv),
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G13x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv),
};
extern VTBL_ENTRY _ZTV8G13x13y0[];
extern void _ZN6E13x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x13__8G13x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&_ZN6E13x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv)();
extern void ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C13__6E13x13__8G13x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv)();
extern void ABISELECT(_ZThn48_N6E13x133fooEv,_ZThn36_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x13__8G13x13y0[] = {
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__8G13x13y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__8G13x13y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x13y0[] = {
  {&(_ZTV8G13x13y0[4]),  4,17},
  {&(_tg__ZTV6E13x13__8G13x13y0[4]),  4,5},
  {&(_tg__ZTV3C13__6E13x13__8G13x13y0[4]),  4,5},
  {&(_tg__ZTV2B1__6E13x13__8G13x13y0[3]),  3,4},
  {&(_ZTV8G13x13y0[12]),  12,17},
  {&(_ZTV8G13x13y0[16]),  16,17},
  {&(_tg__ZTV3C13__8G13x13y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__8G13x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x13y0[];
extern  VTBL_ENTRY _ZTV8G13x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x13y0[];
static VTBL_ENTRY alt_thunk_names216[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E13x133fooEv,_ZThn36_N6E13x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E13x133fooEv,_ZThn36_N6E13x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x13y0 = {  "G13x13y0", // class name
  bases_G13x13y0, 6,
  &(vtc_G13x13y0[0]), // expected_vtbl_contents
  &(vtt_G13x13y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G13x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x13y0),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x13y0),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names216,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x13y1  : virtual E13x13 , F1 {
  int ff;
  ~G13x13y1(); // tgen
  G13x13y1(); // tgen
};
//SIG(1 G13x13y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G13x13y1 ::~G13x13y1(){ note_dtor("G13x13y1", this);} // tgen
G13x13y1 ::G13x13y1(){ note_ctor("G13x13y1", this);} // tgen

static void Test_G13x13y1()
{
  extern Class_Descriptor cd_G13x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G13x13y1, buf);
    G13x13y1 *dp, &lv = *(dp=new (buf) G13x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G13x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x13y1)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,24), "G13x13y1");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,36), "G13x13y1");
    check_base_class_offset(lv, (C13*)(E13x13*), ABISELECT(32,24), "G13x13y1");
    check_base_class_offset(lv, (D0*)(E13x13*), ABISELECT(24,16), "G13x13y1");
    check_base_class_offset(lv, (E13x13*), ABISELECT(16,12), "G13x13y1");
    check_base_class_offset(lv, (F1*), 0, "G13x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x13y1.ff");
    test_class_info(&lv, &cd_G13x13y1);
    dp->~G13x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x13y1(Test_G13x13y1, "G13x13y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G13x13y1C1Ev();
extern void _ZN8G13x13y1D1Ev();
Name_Map name_map_G13x13y1[] = {
  NSPAIR(_ZN8G13x13y1C1Ev),
  NSPAIR(_ZN8G13x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x13;
extern VTBL_ENTRY _ZTI6E13x13[];
extern  VTBL_ENTRY _ZTV6E13x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x13y1[] = {
  // 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
    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,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
    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_E13x13,    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 _ZTI8G13x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E13x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv)();
extern void ABISELECT(_ZThn16_N6E13x133fooEv,_ZThn12_N6E13x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv)();
extern void ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G13x13y1[0]),
  (VTBL_ENTRY)&_ZN6E13x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G13x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G13x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv),
};
extern VTBL_ENTRY _ZTV8G13x13y1[];
extern void _ZN6E13x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x13__8G13x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&_ZN6E13x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv)();
extern void ABISELECT(_ZThn16_N6E13x133fooEv,_ZThn12_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C13__6E13x13__8G13x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv)();
extern void ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x13__8G13x13y1[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__8G13x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__8G13x13y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x13y1[] = {
  {&(_ZTV8G13x13y1[5]),  5,21},
  {&(_ZTV8G13x13y1[11]),  11,21},
  {&(_ZTV8G13x13y1[16]),  16,21},
  {&(_ZTV8G13x13y1[20]),  20,21},
  {&(_tg__ZTV6E13x13__8G13x13y1[4]),  4,5},
  {&(_tg__ZTV3C13__6E13x13__8G13x13y1[4]),  4,5},
  {&(_tg__ZTV2B1__6E13x13__8G13x13y1[3]),  3,4},
  {&(_tg__ZTV3C13__8G13x13y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__8G13x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x13y1[];
extern  VTBL_ENTRY _ZTV8G13x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x13y1[];
static VTBL_ENTRY alt_thunk_names217[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x133fooEv,_ZThn12_N6E13x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x133fooEv,_ZThn12_N6E13x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x13y1 = {  "G13x13y1", // class name
  bases_G13x13y1, 6,
  &(vtc_G13x13y1[0]), // expected_vtbl_contents
  &(vtt_G13x13y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G13x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x13y1),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x13y1),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names217,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x13y2  : E13x13 , virtual F1 {
  int ff;
  ~G13x13y2(); // tgen
  G13x13y2(); // tgen
};
//SIG(1 G13x13y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G13x13y2 ::~G13x13y2(){ note_dtor("G13x13y2", this);} // tgen
G13x13y2 ::G13x13y2(){ note_ctor("G13x13y2", this);} // tgen

static void Test_G13x13y2()
{
  extern Class_Descriptor cd_G13x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G13x13y2, buf);
    G13x13y2 *dp, &lv = *(dp=new (buf) G13x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G13x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x13y2)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(24,16), "G13x13y2");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(40,28), "G13x13y2");
    check_base_class_offset(lv, (C13*)(E13x13*), ABISELECT(24,16), "G13x13y2");
    check_base_class_offset(lv, (D0*)(E13x13*), ABISELECT(8,4), "G13x13y2");
    check_base_class_offset(lv, (E13x13*), 0, "G13x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G13x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G13x13y2.ff");
    test_class_info(&lv, &cd_G13x13y2);
    dp->~G13x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x13y2(Test_G13x13y2, "G13x13y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G13x13y2C1Ev();
extern void _ZN8G13x13y2D1Ev();
Name_Map name_map_G13x13y2[] = {
  NSPAIR(_ZN8G13x13y2C1Ev),
  NSPAIR(_ZN8G13x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x13;
extern VTBL_ENTRY _ZTI6E13x13[];
extern  VTBL_ENTRY _ZTV6E13x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x13y2[] = {
  // 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
    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(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
    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_E13x13,    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
    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 _ZTI8G13x13y2[];
extern void _ZN6E13x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv)();
extern void ABISELECT(_ZThn24_N6E13x133fooEv,_ZThn16_N6E13x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv)();
extern void ABISELECT(_ZThn40_N6E13x133fooEv,_ZThn28_N6E13x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G13x13y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x13y2[0]),
  (VTBL_ENTRY)&_ZN6E13x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G13x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G13x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G13x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G13x13y2[];
extern void _ZN6E13x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x13__8G13x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&_ZN6E13x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv)();
extern void ABISELECT(_ZThn24_N6E13x133fooEv,_ZThn16_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C13__6E13x13__8G13x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv)();
extern void ABISELECT(_ZThn40_N6E13x133fooEv,_ZThn28_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x13__8G13x13y2[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__8G13x13y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__8G13x13y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x13y2[] = {
  {&(_ZTV8G13x13y2[5]),  5,19},
  {&(_tg__ZTV6E13x13__8G13x13y2[4]),  4,5},
  {&(_tg__ZTV3C13__6E13x13__8G13x13y2[4]),  4,5},
  {&(_tg__ZTV2B1__6E13x13__8G13x13y2[3]),  3,4},
  {&(_ZTV8G13x13y2[10]),  10,19},
  {&(_ZTV8G13x13y2[14]),  14,19},
  {&(_ZTV8G13x13y2[18]),  18,19},
  {&(_tg__ZTV3C13__8G13x13y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__8G13x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x13y2[];
extern  VTBL_ENTRY _ZTV8G13x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x13y2[];
static VTBL_ENTRY alt_thunk_names218[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E13x133fooEv,_ZThn28_N6E13x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E13x133fooEv,_ZThn28_N6E13x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x133fooEv,_ZThn16_N6E13x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x133fooEv,_ZThn16_N6E13x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x13y2 = {  "G13x13y2", // class name
  bases_G13x13y2, 6,
  &(vtc_G13x13y2[0]), // expected_vtbl_contents
  &(vtt_G13x13y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G13x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x13y2),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x13y2),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names218,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x13y3  : virtual E13x13 , virtual F1 {
  int ff;
  ~G13x13y3(); // tgen
  G13x13y3(); // tgen
};
//SIG(1 G13x13y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G13x13y3 ::~G13x13y3(){ note_dtor("G13x13y3", this);} // tgen
G13x13y3 ::G13x13y3(){ note_ctor("G13x13y3", this);} // tgen

static void Test_G13x13y3()
{
  extern Class_Descriptor cd_G13x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G13x13y3, buf);
    G13x13y3 *dp, &lv = *(dp=new (buf) G13x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G13x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x13y3)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,20), "G13x13y3");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,32), "G13x13y3");
    check_base_class_offset(lv, (C13*)(E13x13*), ABISELECT(32,20), "G13x13y3");
    check_base_class_offset(lv, (D0*)(E13x13*), ABISELECT(24,12), "G13x13y3");
    check_base_class_offset(lv, (E13x13*), ABISELECT(16,8), "G13x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G13x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G13x13y3.ff");
    test_class_info(&lv, &cd_G13x13y3);
    dp->~G13x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x13y3(Test_G13x13y3, "G13x13y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G13x13y3C1Ev();
extern void _ZN8G13x13y3D1Ev();
Name_Map name_map_G13x13y3[] = {
  NSPAIR(_ZN8G13x13y3C1Ev),
  NSPAIR(_ZN8G13x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x13;
extern VTBL_ENTRY _ZTI6E13x13[];
extern  VTBL_ENTRY _ZTV6E13x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x13y3[] = {
  // 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
    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_E13x13,    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(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 _ZTI8G13x13y3[];
extern void _ZN6E13x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv)();
extern void ABISELECT(_ZThn16_N6E13x133fooEv,_ZThn12_N6E13x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv)();
extern void ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G13x13y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G13x13y3[0]),
  (VTBL_ENTRY)&_ZN6E13x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G13x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G13x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G13x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G13x13y3[];
extern void _ZN6E13x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x13__8G13x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&_ZN6E13x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv)();
extern void ABISELECT(_ZThn16_N6E13x133fooEv,_ZThn12_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C13__6E13x13__8G13x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv)();
extern void ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x13__8G13x13y3[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__8G13x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__8G13x13y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x13y3[] = {
  {&(_ZTV8G13x13y3[6]),  6,25},
  {&(_ZTV8G13x13y3[11]),  11,25},
  {&(_ZTV8G13x13y3[16]),  16,25},
  {&(_ZTV8G13x13y3[20]),  20,25},
  {&(_ZTV8G13x13y3[24]),  24,25},
  {&(_tg__ZTV6E13x13__8G13x13y3[4]),  4,5},
  {&(_tg__ZTV3C13__6E13x13__8G13x13y3[4]),  4,5},
  {&(_tg__ZTV2B1__6E13x13__8G13x13y3[3]),  3,4},
  {&(_tg__ZTV3C13__8G13x13y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__8G13x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x13y3[];
extern  VTBL_ENTRY _ZTV8G13x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x13y3[];
static VTBL_ENTRY alt_thunk_names219[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x133fooEv,_ZThn12_N6E13x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x133fooEv,_ZThn12_N6E13x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x13y3 = {  "G13x13y3", // class name
  bases_G13x13y3, 6,
  &(vtc_G13x13y3[0]), // expected_vtbl_contents
  &(vtt_G13x13y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G13x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x13y3),25, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x13y3),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names219,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x13y4  : E13x13 , F0 {
  int ff;
  ~G13x13y4(); // tgen
  G13x13y4(); // tgen
};
//SIG(1 G13x13y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G13x13y4 ::~G13x13y4(){ note_dtor("G13x13y4", this);} // tgen
G13x13y4 ::G13x13y4(){ note_ctor("G13x13y4", this);} // tgen

static void Test_G13x13y4()
{
  extern Class_Descriptor cd_G13x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x13y4, buf);
    G13x13y4 *dp, &lv = *(dp=new (buf) G13x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x13y4)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(24,20), "G13x13y4");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(40,32), "G13x13y4");
    check_base_class_offset(lv, (C13*)(E13x13*), ABISELECT(24,20), "G13x13y4");
    check_base_class_offset(lv, (D0*)(E13x13*), ABISELECT(8,4), "G13x13y4");
    check_base_class_offset(lv, (E13x13*), 0, "G13x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G13x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G13x13y4.ff");
    test_class_info(&lv, &cd_G13x13y4);
    dp->~G13x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x13y4(Test_G13x13y4, "G13x13y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G13x13y4C1Ev();
extern void _ZN8G13x13y4D1Ev();
Name_Map name_map_G13x13y4[] = {
  NSPAIR(_ZN8G13x13y4C1Ev),
  NSPAIR(_ZN8G13x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x13;
extern VTBL_ENTRY _ZTI6E13x13[];
extern  VTBL_ENTRY _ZTV6E13x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x13y4[] = {
  // 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
    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,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
    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_E13x13,    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 _ZTI8G13x13y4[];
extern void _ZN6E13x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv)();
extern void ABISELECT(_ZThn24_N6E13x133fooEv,_ZThn20_N6E13x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv)();
extern void ABISELECT(_ZThn40_N6E13x133fooEv,_ZThn32_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x13y4[0]),
  (VTBL_ENTRY)&_ZN6E13x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G13x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv),
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G13x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv),
};
extern VTBL_ENTRY _ZTV8G13x13y4[];
extern void _ZN6E13x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x13__8G13x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&_ZN6E13x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv)();
extern void ABISELECT(_ZThn24_N6E13x133fooEv,_ZThn20_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C13__6E13x13__8G13x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv)();
extern void ABISELECT(_ZThn40_N6E13x133fooEv,_ZThn32_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x13__8G13x13y4[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__8G13x13y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__8G13x13y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x13y4[] = {
  {&(_ZTV8G13x13y4[4]),  4,14},
  {&(_tg__ZTV6E13x13__8G13x13y4[4]),  4,5},
  {&(_tg__ZTV3C13__6E13x13__8G13x13y4[4]),  4,5},
  {&(_tg__ZTV2B1__6E13x13__8G13x13y4[3]),  3,4},
  {&(_ZTV8G13x13y4[9]),  9,14},
  {&(_ZTV8G13x13y4[13]),  13,14},
  {&(_tg__ZTV3C13__8G13x13y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__8G13x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x13y4[];
extern  VTBL_ENTRY _ZTV8G13x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x13y4[];
static VTBL_ENTRY alt_thunk_names220[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E13x133fooEv,_ZThn32_N6E13x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E13x133fooEv,_ZThn32_N6E13x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x133fooEv,_ZThn20_N6E13x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x133fooEv,_ZThn20_N6E13x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x13y4 = {  "G13x13y4", // class name
  bases_G13x13y4, 6,
  &(vtc_G13x13y4[0]), // expected_vtbl_contents
  &(vtt_G13x13y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G13x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x13y4),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x13y4),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names220,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x13y5  : virtual E13x13 , F0 {
  int ff;
  ~G13x13y5(); // tgen
  G13x13y5(); // tgen
};
//SIG(1 G13x13y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G13x13y5 ::~G13x13y5(){ note_dtor("G13x13y5", this);} // tgen
G13x13y5 ::G13x13y5(){ note_ctor("G13x13y5", this);} // tgen

static void Test_G13x13y5()
{
  extern Class_Descriptor cd_G13x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G13x13y5, buf);
    G13x13y5 *dp, &lv = *(dp=new (buf) G13x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G13x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x13y5)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,24), "G13x13y5");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,36), "G13x13y5");
    check_base_class_offset(lv, (C13*)(E13x13*), ABISELECT(32,24), "G13x13y5");
    check_base_class_offset(lv, (D0*)(E13x13*), ABISELECT(24,16), "G13x13y5");
    check_base_class_offset(lv, (E13x13*), ABISELECT(16,12), "G13x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G13x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x13y5.ff");
    test_class_info(&lv, &cd_G13x13y5);
    dp->~G13x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x13y5(Test_G13x13y5, "G13x13y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G13x13y5C1Ev();
extern void _ZN8G13x13y5D1Ev();
Name_Map name_map_G13x13y5[] = {
  NSPAIR(_ZN8G13x13y5C1Ev),
  NSPAIR(_ZN8G13x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x13;
extern VTBL_ENTRY _ZTI6E13x13[];
extern  VTBL_ENTRY _ZTV6E13x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x13y5[] = {
  // 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
    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,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
    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_E13x13,    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 _ZTI8G13x13y5[];
extern void _ZN6E13x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv)();
extern void ABISELECT(_ZThn16_N6E13x133fooEv,_ZThn12_N6E13x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv)();
extern void ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G13x13y5[0]),
  (VTBL_ENTRY)&_ZN6E13x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G13x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G13x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv),
};
extern VTBL_ENTRY _ZTV8G13x13y5[];
extern void _ZN6E13x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x13__8G13x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&_ZN6E13x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv)();
extern void ABISELECT(_ZThn16_N6E13x133fooEv,_ZThn12_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C13__6E13x13__8G13x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv)();
extern void ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x13__8G13x13y5[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__8G13x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__8G13x13y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x13y5[] = {
  {&(_ZTV8G13x13y5[5]),  5,20},
  {&(_ZTV8G13x13y5[10]),  10,20},
  {&(_ZTV8G13x13y5[15]),  15,20},
  {&(_ZTV8G13x13y5[19]),  19,20},
  {&(_tg__ZTV6E13x13__8G13x13y5[4]),  4,5},
  {&(_tg__ZTV3C13__6E13x13__8G13x13y5[4]),  4,5},
  {&(_tg__ZTV2B1__6E13x13__8G13x13y5[3]),  3,4},
  {&(_tg__ZTV3C13__8G13x13y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__8G13x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x13y5[];
extern  VTBL_ENTRY _ZTV8G13x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x13y5[];
static VTBL_ENTRY alt_thunk_names221[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x133fooEv,_ZThn12_N6E13x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x133fooEv,_ZThn12_N6E13x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x13y5 = {  "G13x13y5", // class name
  bases_G13x13y5, 6,
  &(vtc_G13x13y5[0]), // expected_vtbl_contents
  &(vtt_G13x13y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G13x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x13y5),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x13y5),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names221,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x13y6  : E13x13 , virtual F0 {
  int ff;
  ~G13x13y6(); // tgen
  G13x13y6(); // tgen
};
//SIG(1 G13x13y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G13x13y6 ::~G13x13y6(){ note_dtor("G13x13y6", this);} // tgen
G13x13y6 ::G13x13y6(){ note_ctor("G13x13y6", this);} // tgen

static void Test_G13x13y6()
{
  extern Class_Descriptor cd_G13x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x13y6, buf);
    G13x13y6 *dp, &lv = *(dp=new (buf) G13x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x13y6)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(24,16), "G13x13y6");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(40,28), "G13x13y6");
    check_base_class_offset(lv, (C13*)(E13x13*), ABISELECT(24,16), "G13x13y6");
    check_base_class_offset(lv, (D0*)(E13x13*), ABISELECT(8,4), "G13x13y6");
    check_base_class_offset(lv, (E13x13*), 0, "G13x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G13x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G13x13y6.ff");
    test_class_info(&lv, &cd_G13x13y6);
    dp->~G13x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x13y6(Test_G13x13y6, "G13x13y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G13x13y6C1Ev();
extern void _ZN8G13x13y6D1Ev();
Name_Map name_map_G13x13y6[] = {
  NSPAIR(_ZN8G13x13y6C1Ev),
  NSPAIR(_ZN8G13x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x13;
extern VTBL_ENTRY _ZTI6E13x13[];
extern  VTBL_ENTRY _ZTV6E13x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x13y6[] = {
  // 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
    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(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
    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_E13x13,    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 _ZTI8G13x13y6[];
extern void _ZN6E13x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv)();
extern void ABISELECT(_ZThn24_N6E13x133fooEv,_ZThn16_N6E13x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv)();
extern void ABISELECT(_ZThn40_N6E13x133fooEv,_ZThn28_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x13y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x13y6[0]),
  (VTBL_ENTRY)&_ZN6E13x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G13x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G13x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv),
};
extern VTBL_ENTRY _ZTV8G13x13y6[];
extern void _ZN6E13x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x13__8G13x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&_ZN6E13x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv)();
extern void ABISELECT(_ZThn24_N6E13x133fooEv,_ZThn16_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C13__6E13x13__8G13x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv)();
extern void ABISELECT(_ZThn40_N6E13x133fooEv,_ZThn28_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x13__8G13x13y6[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__8G13x13y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__8G13x13y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x13y6[] = {
  {&(_ZTV8G13x13y6[5]),  5,15},
  {&(_tg__ZTV6E13x13__8G13x13y6[4]),  4,5},
  {&(_tg__ZTV3C13__6E13x13__8G13x13y6[4]),  4,5},
  {&(_tg__ZTV2B1__6E13x13__8G13x13y6[3]),  3,4},
  {&(_ZTV8G13x13y6[10]),  10,15},
  {&(_ZTV8G13x13y6[14]),  14,15},
  {&(_tg__ZTV3C13__8G13x13y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__8G13x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x13y6[];
extern  VTBL_ENTRY _ZTV8G13x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x13y6[];
static VTBL_ENTRY alt_thunk_names222[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E13x133fooEv,_ZThn28_N6E13x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E13x133fooEv,_ZThn28_N6E13x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x133fooEv,_ZThn16_N6E13x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x133fooEv,_ZThn16_N6E13x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x13y6 = {  "G13x13y6", // class name
  bases_G13x13y6, 6,
  &(vtc_G13x13y6[0]), // expected_vtbl_contents
  &(vtt_G13x13y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G13x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x13y6),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x13y6),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names222,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x13y7  : virtual E13x13 , virtual F0 {
  int ff;
  ~G13x13y7(); // tgen
  G13x13y7(); // tgen
};
//SIG(1 G13x13y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G13x13y7 ::~G13x13y7(){ note_dtor("G13x13y7", this);} // tgen
G13x13y7 ::G13x13y7(){ note_ctor("G13x13y7", this);} // tgen

static void Test_G13x13y7()
{
  extern Class_Descriptor cd_G13x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G13x13y7, buf);
    G13x13y7 *dp, &lv = *(dp=new (buf) G13x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G13x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x13y7)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,20), "G13x13y7");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,32), "G13x13y7");
    check_base_class_offset(lv, (C13*)(E13x13*), ABISELECT(32,20), "G13x13y7");
    check_base_class_offset(lv, (D0*)(E13x13*), ABISELECT(24,12), "G13x13y7");
    check_base_class_offset(lv, (E13x13*), ABISELECT(16,8), "G13x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G13x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G13x13y7.ff");
    test_class_info(&lv, &cd_G13x13y7);
    dp->~G13x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x13y7(Test_G13x13y7, "G13x13y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G13x13y7C1Ev();
extern void _ZN8G13x13y7D1Ev();
Name_Map name_map_G13x13y7[] = {
  NSPAIR(_ZN8G13x13y7C1Ev),
  NSPAIR(_ZN8G13x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x13;
extern VTBL_ENTRY _ZTI6E13x13[];
extern  VTBL_ENTRY _ZTV6E13x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x13y7[] = {
  // 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(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_E13x13,    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(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 _ZTI8G13x13y7[];
extern void _ZN6E13x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv)();
extern void ABISELECT(_ZThn16_N6E13x133fooEv,_ZThn12_N6E13x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv)();
extern void ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x13y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G13x13y7[0]),
  (VTBL_ENTRY)&_ZN6E13x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G13x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G13x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv),
};
extern VTBL_ENTRY _ZTV8G13x13y7[];
extern void _ZN6E13x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x13__8G13x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&_ZN6E13x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv)();
extern void ABISELECT(_ZThn16_N6E13x133fooEv,_ZThn12_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C13__6E13x13__8G13x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv)();
extern void ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x13__8G13x13y7[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E13x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__8G13x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__8G13x13y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x13y7[] = {
  {&(_ZTV8G13x13y7[6]),  6,21},
  {&(_ZTV8G13x13y7[11]),  11,21},
  {&(_ZTV8G13x13y7[16]),  16,21},
  {&(_ZTV8G13x13y7[20]),  20,21},
  {&(_tg__ZTV6E13x13__8G13x13y7[4]),  4,5},
  {&(_tg__ZTV3C13__6E13x13__8G13x13y7[4]),  4,5},
  {&(_tg__ZTV2B1__6E13x13__8G13x13y7[3]),  3,4},
  {&(_tg__ZTV3C13__8G13x13y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__8G13x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x13y7[];
extern  VTBL_ENTRY _ZTV8G13x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x13y7[];
static VTBL_ENTRY alt_thunk_names223[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x133fooEv,_ZTv0_n12_N6E13x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x133fooEv,_ZThn24_N6E13x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E13x133fooEv,_ZTv0_n16_N6E13x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x133fooEv,_ZThn12_N6E13x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x133fooEv,_ZThn12_N6E13x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x13y7 = {  "G13x13y7", // class name
  bases_G13x13y7, 6,
  &(vtc_G13x13y7[0]), // expected_vtbl_contents
  &(vtt_G13x13y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G13x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x13y7),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x13y7),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names223,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E14x13  : virtual C14 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E14x133fooEv
  ~E14x13(); // tgen
  E14x13(); // tgen
};
//SIG(-1 E14x13) C1{ VBC2{ VBC3{ Fi} VBC4{ v1 Fi} Fi} BC5{ Fi} v1 Fi}


void  E14x13 ::foo(){vfunc_called(this, "_ZN6E14x133fooEv");}
E14x13 ::~E14x13(){ note_dtor("E14x13", this);} // tgen
E14x13 ::E14x13(){ note_ctor("E14x13", this);} // tgen

static void Test_E14x13()
{
  extern Class_Descriptor cd_E14x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E14x13, buf);
    E14x13 *dp, &lv = *(dp=new (buf) E14x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E14x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E14x13)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(28,20), "E14x13");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(32,24), "E14x13");
    check_base_class_offset(lv, (C14*), ABISELECT(16,12), "E14x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E14x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E14x13.fd");
    test_class_info(&lv, &cd_E14x13);
    dp->~E14x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE14x13(Test_E14x13, "E14x13", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E14x13C1Ev();
extern void _ZN6E14x13D1Ev();
Name_Map name_map_E14x13[] = {
  NSPAIR(_ZN6E14x13C1Ev),
  NSPAIR(_ZN6E14x13D1Ev),
  {0,0}
};
extern Class_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_E14x13[] = {
  // 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
    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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6E14x13[];
extern void _ZN6E14x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv)();
extern void ABISELECT(_ZThn32_N6E14x133fooEv,_ZThn24_N6E14x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E14x13[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
  (VTBL_ENTRY)&_ZN6E14x133fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv),
};
extern VTBL_ENTRY _ZTV6E14x13[];
static  VTBL_ENTRY _tg__ZTV3C14__6E14x13[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__6E14x13[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E14x13[] = {
  {&(_ZTV6E14x13[5]),  5,14},
  {&(_ZTV6E14x13[10]),  10,14},
  {&(_ZTV6E14x13[13]),  13,14},
  {&(_tg__ZTV3C14__6E14x13[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__6E14x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E14x13[];
extern  VTBL_ENTRY _ZTV6E14x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x13[];
static VTBL_ENTRY alt_thunk_names224[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x133fooEv,_ZThn24_N6E14x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E14x13 = {  "E14x13", // class name
  bases_E14x13, 4,
  &(vtc_E14x13[0]), // expected_vtbl_contents
  &(vtt_E14x13[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E14x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E14x13),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E14x13),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  G14x13y0  : E14x13 , F1 {
  int ff;
  ~G14x13y0(); // tgen
  G14x13y0(); // tgen
};
//SIG(1 G14x13y0) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G14x13y0 ::~G14x13y0(){ note_dtor("G14x13y0", this);} // tgen
G14x13y0 ::G14x13y0(){ note_ctor("G14x13y0", this);} // tgen

static void Test_G14x13y0()
{
  extern Class_Descriptor cd_G14x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G14x13y0, buf);
    G14x13y0 *dp, &lv = *(dp=new (buf) G14x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G14x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x13y0)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,32), "G14x13y0");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,36), "G14x13y0");
    check_base_class_offset(lv, (C14*)(E14x13*), ABISELECT(32,24), "G14x13y0");
    check_base_class_offset(lv, (D0*)(E14x13*), ABISELECT(8,4), "G14x13y0");
    check_base_class_offset(lv, (E14x13*), 0, "G14x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G14x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G14x13y0.ff");
    test_class_info(&lv, &cd_G14x13y0);
    dp->~G14x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x13y0(Test_G14x13y0, "G14x13y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G14x13y0C1Ev();
extern void _ZN8G14x13y0D1Ev();
Name_Map name_map_G14x13y0[] = {
  NSPAIR(_ZN8G14x13y0C1Ev),
  NSPAIR(_ZN8G14x13y0D1Ev),
  {0,0}
};
extern Class_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_E14x13;
extern VTBL_ENTRY _ZTI6E14x13[];
extern  VTBL_ENTRY _ZTV6E14x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x13y0[] = {
  // 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
    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,24), //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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E14x13,    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 _ZTI8G14x13y0[];
extern void _ZN6E14x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv)();
extern void ABISELECT(_ZThn48_N6E14x133fooEv,_ZThn36_N6E14x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x13y0[0]),
  (VTBL_ENTRY)&_ZN6E14x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G14x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G14x13y0[0]),
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G14x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv),
};
extern VTBL_ENTRY _ZTV8G14x13y0[];
extern void _ZN6E14x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x13__8G14x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
  (VTBL_ENTRY)&_ZN6E14x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__6E14x13__8G14x13y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv)();
extern void ABISELECT(_ZThn48_N6E14x133fooEv,_ZThn36_N6E14x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x13__8G14x13y0[] = {
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C14__8G14x13y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__8G14x13y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x13y0[] = {
  {&(_ZTV8G14x13y0[5]),  5,17},
  {&(_tg__ZTV6E14x13__8G14x13y0[5]),  5,6},
  {&(_tg__ZTV3C14__6E14x13__8G14x13y0[4]),  4,4},
  {&(_tg__ZTV2B1__6E14x13__8G14x13y0[3]),  3,4},
  {&(_ZTV8G14x13y0[13]),  13,17},
  {&(_ZTV8G14x13y0[16]),  16,17},
  {&(_tg__ZTV3C14__8G14x13y0[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__8G14x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x13y0[];
extern  VTBL_ENTRY _ZTV8G14x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x13y0[];
static VTBL_ENTRY alt_thunk_names225[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E14x133fooEv,_ZThn36_N6E14x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E14x133fooEv,_ZThn36_N6E14x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x13y0 = {  "G14x13y0", // class name
  bases_G14x13y0, 6,
  &(vtc_G14x13y0[0]), // expected_vtbl_contents
  &(vtt_G14x13y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G14x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x13y0),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x13y0),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  G14x13y1  : virtual E14x13 , F1 {
  int ff;
  ~G14x13y1(); // tgen
  G14x13y1(); // tgen
};
//SIG(1 G14x13y1) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G14x13y1 ::~G14x13y1(){ note_dtor("G14x13y1", this);} // tgen
G14x13y1 ::G14x13y1(){ note_ctor("G14x13y1", this);} // tgen

static void Test_G14x13y1()
{
  extern Class_Descriptor cd_G14x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G14x13y1, buf);
    G14x13y1 *dp, &lv = *(dp=new (buf) G14x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G14x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x13y1)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,32), "G14x13y1");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,36), "G14x13y1");
    check_base_class_offset(lv, (C14*)(E14x13*), ABISELECT(32,24), "G14x13y1");
    check_base_class_offset(lv, (D0*)(E14x13*), ABISELECT(24,16), "G14x13y1");
    check_base_class_offset(lv, (E14x13*), ABISELECT(16,12), "G14x13y1");
    check_base_class_offset(lv, (F1*), 0, "G14x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x13y1.ff");
    test_class_info(&lv, &cd_G14x13y1);
    dp->~G14x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x13y1(Test_G14x13y1, "G14x13y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G14x13y1C1Ev();
extern void _ZN8G14x13y1D1Ev();
Name_Map name_map_G14x13y1[] = {
  NSPAIR(_ZN8G14x13y1C1Ev),
  NSPAIR(_ZN8G14x13y1D1Ev),
  {0,0}
};
extern Class_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_E14x13;
extern VTBL_ENTRY _ZTI6E14x13[];
extern  VTBL_ENTRY _ZTV6E14x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x13y1[] = {
  // 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_C14,    ABISELECT(32,24), //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(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_E14x13,    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_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 _ZTI8G14x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E14x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv)();
extern void ABISELECT(_ZThn32_N6E14x133fooEv,_ZThn24_N6E14x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G14x13y1[0]),
  (VTBL_ENTRY)&_ZN6E14x133fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G14x13y1[0]),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G14x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv),
};
extern VTBL_ENTRY _ZTV8G14x13y1[];
extern void _ZN6E14x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x13__8G14x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
  (VTBL_ENTRY)&_ZN6E14x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__6E14x13__8G14x13y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv)();
extern void ABISELECT(_ZThn32_N6E14x133fooEv,_ZThn24_N6E14x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x13__8G14x13y1[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C14__8G14x13y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__8G14x13y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x13y1[] = {
  {&(_ZTV8G14x13y1[6]),  6,22},
  {&(_ZTV8G14x13y1[13]),  13,22},
  {&(_ZTV8G14x13y1[18]),  18,22},
  {&(_ZTV8G14x13y1[21]),  21,22},
  {&(_tg__ZTV6E14x13__8G14x13y1[5]),  5,6},
  {&(_tg__ZTV3C14__6E14x13__8G14x13y1[4]),  4,4},
  {&(_tg__ZTV2B1__6E14x13__8G14x13y1[3]),  3,4},
  {&(_tg__ZTV3C14__8G14x13y1[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__8G14x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x13y1[];
extern  VTBL_ENTRY _ZTV8G14x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x13y1[];
static VTBL_ENTRY alt_thunk_names226[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x133fooEv,_ZThn24_N6E14x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x133fooEv,_ZThn24_N6E14x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x13y1 = {  "G14x13y1", // class name
  bases_G14x13y1, 6,
  &(vtc_G14x13y1[0]), // expected_vtbl_contents
  &(vtt_G14x13y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G14x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x13y1),22, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x13y1),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  G14x13y2  : E14x13 , virtual F1 {
  int ff;
  ~G14x13y2(); // tgen
  G14x13y2(); // tgen
};
//SIG(1 G14x13y2) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G14x13y2 ::~G14x13y2(){ note_dtor("G14x13y2", this);} // tgen
G14x13y2 ::G14x13y2(){ note_ctor("G14x13y2", this);} // tgen

static void Test_G14x13y2()
{
  extern Class_Descriptor cd_G14x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G14x13y2, buf);
    G14x13y2 *dp, &lv = *(dp=new (buf) G14x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G14x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x13y2)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(36,24), "G14x13y2");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(40,28), "G14x13y2");
    check_base_class_offset(lv, (C14*)(E14x13*), ABISELECT(24,16), "G14x13y2");
    check_base_class_offset(lv, (D0*)(E14x13*), ABISELECT(8,4), "G14x13y2");
    check_base_class_offset(lv, (E14x13*), 0, "G14x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G14x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G14x13y2.ff");
    test_class_info(&lv, &cd_G14x13y2);
    dp->~G14x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x13y2(Test_G14x13y2, "G14x13y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G14x13y2C1Ev();
extern void _ZN8G14x13y2D1Ev();
Name_Map name_map_G14x13y2[] = {
  NSPAIR(_ZN8G14x13y2C1Ev),
  NSPAIR(_ZN8G14x13y2D1Ev),
  {0,0}
};
extern Class_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_E14x13;
extern VTBL_ENTRY _ZTI6E14x13[];
extern  VTBL_ENTRY _ZTV6E14x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x13y2[] = {
  // 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
    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(24,16), //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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E14x13,    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
    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 _ZTI8G14x13y2[];
extern void _ZN6E14x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv)();
extern void ABISELECT(_ZThn40_N6E14x133fooEv,_ZThn28_N6E14x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G14x13y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x13y2[0]),
  (VTBL_ENTRY)&_ZN6E14x133fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G14x13y2[0]),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G14x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G14x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G14x13y2[];
extern void _ZN6E14x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x13__8G14x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
  (VTBL_ENTRY)&_ZN6E14x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__6E14x13__8G14x13y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv)();
extern void ABISELECT(_ZThn40_N6E14x133fooEv,_ZThn28_N6E14x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x13__8G14x13y2[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C14__8G14x13y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__8G14x13y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x13y2[] = {
  {&(_ZTV8G14x13y2[6]),  6,19},
  {&(_tg__ZTV6E14x13__8G14x13y2[5]),  5,6},
  {&(_tg__ZTV3C14__6E14x13__8G14x13y2[4]),  4,4},
  {&(_tg__ZTV2B1__6E14x13__8G14x13y2[3]),  3,4},
  {&(_ZTV8G14x13y2[11]),  11,19},
  {&(_ZTV8G14x13y2[14]),  14,19},
  {&(_ZTV8G14x13y2[18]),  18,19},
  {&(_tg__ZTV3C14__8G14x13y2[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__8G14x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x13y2[];
extern  VTBL_ENTRY _ZTV8G14x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x13y2[];
static VTBL_ENTRY alt_thunk_names227[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E14x133fooEv,_ZThn28_N6E14x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E14x133fooEv,_ZThn28_N6E14x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x13y2 = {  "G14x13y2", // class name
  bases_G14x13y2, 6,
  &(vtc_G14x13y2[0]), // expected_vtbl_contents
  &(vtt_G14x13y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G14x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x13y2),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x13y2),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  G14x13y3  : virtual E14x13 , virtual F1 {
  int ff;
  ~G14x13y3(); // tgen
  G14x13y3(); // tgen
};
//SIG(1 G14x13y3) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G14x13y3 ::~G14x13y3(){ note_dtor("G14x13y3", this);} // tgen
G14x13y3 ::G14x13y3(){ note_ctor("G14x13y3", this);} // tgen

static void Test_G14x13y3()
{
  extern Class_Descriptor cd_G14x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G14x13y3, buf);
    G14x13y3 *dp, &lv = *(dp=new (buf) G14x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G14x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x13y3)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,28), "G14x13y3");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,32), "G14x13y3");
    check_base_class_offset(lv, (C14*)(E14x13*), ABISELECT(32,20), "G14x13y3");
    check_base_class_offset(lv, (D0*)(E14x13*), ABISELECT(24,12), "G14x13y3");
    check_base_class_offset(lv, (E14x13*), ABISELECT(16,8), "G14x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G14x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G14x13y3.ff");
    test_class_info(&lv, &cd_G14x13y3);
    dp->~G14x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x13y3(Test_G14x13y3, "G14x13y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G14x13y3C1Ev();
extern void _ZN8G14x13y3D1Ev();
Name_Map name_map_G14x13y3[] = {
  NSPAIR(_ZN8G14x13y3C1Ev),
  NSPAIR(_ZN8G14x13y3D1Ev),
  {0,0}
};
extern Class_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_E14x13;
extern VTBL_ENTRY _ZTI6E14x13[];
extern  VTBL_ENTRY _ZTV6E14x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x13y3[] = {
  // 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
    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_E14x13,    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
    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 _ZTI8G14x13y3[];
extern void _ZN6E14x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv)();
extern void ABISELECT(_ZThn32_N6E14x133fooEv,_ZThn24_N6E14x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G14x13y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G14x13y3[0]),
  (VTBL_ENTRY)&_ZN6E14x133fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G14x13y3[0]),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G14x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G14x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G14x13y3[];
extern void _ZN6E14x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x13__8G14x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
  (VTBL_ENTRY)&_ZN6E14x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__6E14x13__8G14x13y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv)();
extern void ABISELECT(_ZThn32_N6E14x133fooEv,_ZThn24_N6E14x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x13__8G14x13y3[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C14__8G14x13y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__8G14x13y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x13y3[] = {
  {&(_ZTV8G14x13y3[7]),  7,26},
  {&(_ZTV8G14x13y3[13]),  13,26},
  {&(_ZTV8G14x13y3[18]),  18,26},
  {&(_ZTV8G14x13y3[21]),  21,26},
  {&(_ZTV8G14x13y3[25]),  25,26},
  {&(_tg__ZTV6E14x13__8G14x13y3[5]),  5,6},
  {&(_tg__ZTV3C14__6E14x13__8G14x13y3[4]),  4,4},
  {&(_tg__ZTV2B1__6E14x13__8G14x13y3[3]),  3,4},
  {&(_tg__ZTV3C14__8G14x13y3[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__8G14x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x13y3[];
extern  VTBL_ENTRY _ZTV8G14x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x13y3[];
static VTBL_ENTRY alt_thunk_names228[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x133fooEv,_ZThn24_N6E14x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x133fooEv,_ZThn24_N6E14x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x13y3 = {  "G14x13y3", // class name
  bases_G14x13y3, 6,
  &(vtc_G14x13y3[0]), // expected_vtbl_contents
  &(vtt_G14x13y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G14x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x13y3),26, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x13y3),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  G14x13y4  : E14x13 , F0 {
  int ff;
  ~G14x13y4(); // tgen
  G14x13y4(); // tgen
};
//SIG(1 G14x13y4) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G14x13y4 ::~G14x13y4(){ note_dtor("G14x13y4", this);} // tgen
G14x13y4 ::G14x13y4(){ note_ctor("G14x13y4", this);} // tgen

static void Test_G14x13y4()
{
  extern Class_Descriptor cd_G14x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x13y4, buf);
    G14x13y4 *dp, &lv = *(dp=new (buf) G14x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x13y4)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(36,28), "G14x13y4");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(40,32), "G14x13y4");
    check_base_class_offset(lv, (C14*)(E14x13*), ABISELECT(24,20), "G14x13y4");
    check_base_class_offset(lv, (D0*)(E14x13*), ABISELECT(8,4), "G14x13y4");
    check_base_class_offset(lv, (E14x13*), 0, "G14x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G14x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G14x13y4.ff");
    test_class_info(&lv, &cd_G14x13y4);
    dp->~G14x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x13y4(Test_G14x13y4, "G14x13y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G14x13y4C1Ev();
extern void _ZN8G14x13y4D1Ev();
Name_Map name_map_G14x13y4[] = {
  NSPAIR(_ZN8G14x13y4C1Ev),
  NSPAIR(_ZN8G14x13y4D1Ev),
  {0,0}
};
extern Class_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_E14x13;
extern VTBL_ENTRY _ZTI6E14x13[];
extern  VTBL_ENTRY _ZTV6E14x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x13y4[] = {
  // 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)
    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
    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_E14x13,    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 _ZTI8G14x13y4[];
extern void _ZN6E14x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv)();
extern void ABISELECT(_ZThn40_N6E14x133fooEv,_ZThn32_N6E14x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x13y4[0]),
  (VTBL_ENTRY)&_ZN6E14x133fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G14x13y4[0]),
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G14x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv),
};
extern VTBL_ENTRY _ZTV8G14x13y4[];
extern void _ZN6E14x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x13__8G14x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
  (VTBL_ENTRY)&_ZN6E14x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__6E14x13__8G14x13y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv)();
extern void ABISELECT(_ZThn40_N6E14x133fooEv,_ZThn32_N6E14x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x13__8G14x13y4[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C14__8G14x13y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__8G14x13y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x13y4[] = {
  {&(_ZTV8G14x13y4[5]),  5,14},
  {&(_tg__ZTV6E14x13__8G14x13y4[5]),  5,6},
  {&(_tg__ZTV3C14__6E14x13__8G14x13y4[4]),  4,4},
  {&(_tg__ZTV2B1__6E14x13__8G14x13y4[3]),  3,4},
  {&(_ZTV8G14x13y4[10]),  10,14},
  {&(_ZTV8G14x13y4[13]),  13,14},
  {&(_tg__ZTV3C14__8G14x13y4[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__8G14x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x13y4[];
extern  VTBL_ENTRY _ZTV8G14x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x13y4[];
static VTBL_ENTRY alt_thunk_names229[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E14x133fooEv,_ZThn32_N6E14x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E14x133fooEv,_ZThn32_N6E14x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x13y4 = {  "G14x13y4", // class name
  bases_G14x13y4, 6,
  &(vtc_G14x13y4[0]), // expected_vtbl_contents
  &(vtt_G14x13y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G14x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x13y4),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x13y4),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  G14x13y5  : virtual E14x13 , F0 {
  int ff;
  ~G14x13y5(); // tgen
  G14x13y5(); // tgen
};
//SIG(1 G14x13y5) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G14x13y5 ::~G14x13y5(){ note_dtor("G14x13y5", this);} // tgen
G14x13y5 ::G14x13y5(){ note_ctor("G14x13y5", this);} // tgen

static void Test_G14x13y5()
{
  extern Class_Descriptor cd_G14x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G14x13y5, buf);
    G14x13y5 *dp, &lv = *(dp=new (buf) G14x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G14x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x13y5)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,32), "G14x13y5");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,36), "G14x13y5");
    check_base_class_offset(lv, (C14*)(E14x13*), ABISELECT(32,24), "G14x13y5");
    check_base_class_offset(lv, (D0*)(E14x13*), ABISELECT(24,16), "G14x13y5");
    check_base_class_offset(lv, (E14x13*), ABISELECT(16,12), "G14x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G14x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x13y5.ff");
    test_class_info(&lv, &cd_G14x13y5);
    dp->~G14x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x13y5(Test_G14x13y5, "G14x13y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G14x13y5C1Ev();
extern void _ZN8G14x13y5D1Ev();
Name_Map name_map_G14x13y5[] = {
  NSPAIR(_ZN8G14x13y5C1Ev),
  NSPAIR(_ZN8G14x13y5D1Ev),
  {0,0}
};
extern Class_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_E14x13;
extern VTBL_ENTRY _ZTI6E14x13[];
extern  VTBL_ENTRY _ZTV6E14x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x13y5[] = {
  // 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_C14,    ABISELECT(32,24), //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(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_E14x13,    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
    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 _ZTI8G14x13y5[];
extern void _ZN6E14x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv)();
extern void ABISELECT(_ZThn32_N6E14x133fooEv,_ZThn24_N6E14x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G14x13y5[0]),
  (VTBL_ENTRY)&_ZN6E14x133fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G14x13y5[0]),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G14x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv),
};
extern VTBL_ENTRY _ZTV8G14x13y5[];
extern void _ZN6E14x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x13__8G14x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
  (VTBL_ENTRY)&_ZN6E14x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__6E14x13__8G14x13y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv)();
extern void ABISELECT(_ZThn32_N6E14x133fooEv,_ZThn24_N6E14x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x13__8G14x13y5[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C14__8G14x13y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__8G14x13y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x13y5[] = {
  {&(_ZTV8G14x13y5[6]),  6,21},
  {&(_ZTV8G14x13y5[12]),  12,21},
  {&(_ZTV8G14x13y5[17]),  17,21},
  {&(_ZTV8G14x13y5[20]),  20,21},
  {&(_tg__ZTV6E14x13__8G14x13y5[5]),  5,6},
  {&(_tg__ZTV3C14__6E14x13__8G14x13y5[4]),  4,4},
  {&(_tg__ZTV2B1__6E14x13__8G14x13y5[3]),  3,4},
  {&(_tg__ZTV3C14__8G14x13y5[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__8G14x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x13y5[];
extern  VTBL_ENTRY _ZTV8G14x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x13y5[];
static VTBL_ENTRY alt_thunk_names230[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x133fooEv,_ZThn24_N6E14x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x133fooEv,_ZThn24_N6E14x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x13y5 = {  "G14x13y5", // class name
  bases_G14x13y5, 6,
  &(vtc_G14x13y5[0]), // expected_vtbl_contents
  &(vtt_G14x13y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G14x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x13y5),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x13y5),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  G14x13y6  : E14x13 , virtual F0 {
  int ff;
  ~G14x13y6(); // tgen
  G14x13y6(); // tgen
};
//SIG(1 G14x13y6) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G14x13y6 ::~G14x13y6(){ note_dtor("G14x13y6", this);} // tgen
G14x13y6 ::G14x13y6(){ note_ctor("G14x13y6", this);} // tgen

static void Test_G14x13y6()
{
  extern Class_Descriptor cd_G14x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x13y6, buf);
    G14x13y6 *dp, &lv = *(dp=new (buf) G14x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x13y6)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(36,24), "G14x13y6");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(40,28), "G14x13y6");
    check_base_class_offset(lv, (C14*)(E14x13*), ABISELECT(24,16), "G14x13y6");
    check_base_class_offset(lv, (D0*)(E14x13*), ABISELECT(8,4), "G14x13y6");
    check_base_class_offset(lv, (E14x13*), 0, "G14x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G14x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G14x13y6.ff");
    test_class_info(&lv, &cd_G14x13y6);
    dp->~G14x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x13y6(Test_G14x13y6, "G14x13y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G14x13y6C1Ev();
extern void _ZN8G14x13y6D1Ev();
Name_Map name_map_G14x13y6[] = {
  NSPAIR(_ZN8G14x13y6C1Ev),
  NSPAIR(_ZN8G14x13y6D1Ev),
  {0,0}
};
extern Class_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_E14x13;
extern VTBL_ENTRY _ZTI6E14x13[];
extern  VTBL_ENTRY _ZTV6E14x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x13y6[] = {
  // 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
    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(24,16), //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_E14x13,    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 _ZTI8G14x13y6[];
extern void _ZN6E14x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv)();
extern void ABISELECT(_ZThn40_N6E14x133fooEv,_ZThn28_N6E14x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x13y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x13y6[0]),
  (VTBL_ENTRY)&_ZN6E14x133fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G14x13y6[0]),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G14x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv),
};
extern VTBL_ENTRY _ZTV8G14x13y6[];
extern void _ZN6E14x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x13__8G14x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
  (VTBL_ENTRY)&_ZN6E14x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__6E14x13__8G14x13y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv)();
extern void ABISELECT(_ZThn40_N6E14x133fooEv,_ZThn28_N6E14x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x13__8G14x13y6[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C14__8G14x13y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__8G14x13y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x13y6[] = {
  {&(_ZTV8G14x13y6[6]),  6,15},
  {&(_tg__ZTV6E14x13__8G14x13y6[5]),  5,6},
  {&(_tg__ZTV3C14__6E14x13__8G14x13y6[4]),  4,4},
  {&(_tg__ZTV2B1__6E14x13__8G14x13y6[3]),  3,4},
  {&(_ZTV8G14x13y6[11]),  11,15},
  {&(_ZTV8G14x13y6[14]),  14,15},
  {&(_tg__ZTV3C14__8G14x13y6[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__8G14x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x13y6[];
extern  VTBL_ENTRY _ZTV8G14x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x13y6[];
static VTBL_ENTRY alt_thunk_names231[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E14x133fooEv,_ZThn28_N6E14x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E14x133fooEv,_ZThn28_N6E14x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x13y6 = {  "G14x13y6", // class name
  bases_G14x13y6, 6,
  &(vtc_G14x13y6[0]), // expected_vtbl_contents
  &(vtt_G14x13y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G14x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x13y6),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x13y6),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  G14x13y7  : virtual E14x13 , virtual F0 {
  int ff;
  ~G14x13y7(); // tgen
  G14x13y7(); // tgen
};
//SIG(1 G14x13y7) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G14x13y7 ::~G14x13y7(){ note_dtor("G14x13y7", this);} // tgen
G14x13y7 ::G14x13y7(){ note_ctor("G14x13y7", this);} // tgen

static void Test_G14x13y7()
{
  extern Class_Descriptor cd_G14x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G14x13y7, buf);
    G14x13y7 *dp, &lv = *(dp=new (buf) G14x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G14x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x13y7)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,28), "G14x13y7");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,32), "G14x13y7");
    check_base_class_offset(lv, (C14*)(E14x13*), ABISELECT(32,20), "G14x13y7");
    check_base_class_offset(lv, (D0*)(E14x13*), ABISELECT(24,12), "G14x13y7");
    check_base_class_offset(lv, (E14x13*), ABISELECT(16,8), "G14x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G14x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G14x13y7.ff");
    test_class_info(&lv, &cd_G14x13y7);
    dp->~G14x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x13y7(Test_G14x13y7, "G14x13y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G14x13y7C1Ev();
extern void _ZN8G14x13y7D1Ev();
Name_Map name_map_G14x13y7[] = {
  NSPAIR(_ZN8G14x13y7C1Ev),
  NSPAIR(_ZN8G14x13y7D1Ev),
  {0,0}
};
extern Class_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_E14x13;
extern VTBL_ENTRY _ZTI6E14x13[];
extern  VTBL_ENTRY _ZTV6E14x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x13y7[] = {
  // 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(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_E14x13,    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_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 _ZTI8G14x13y7[];
extern void _ZN6E14x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv)();
extern void ABISELECT(_ZThn32_N6E14x133fooEv,_ZThn24_N6E14x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x13y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G14x13y7[0]),
  (VTBL_ENTRY)&_ZN6E14x133fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G14x13y7[0]),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G14x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv),
};
extern VTBL_ENTRY _ZTV8G14x13y7[];
extern void _ZN6E14x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x13__8G14x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
  (VTBL_ENTRY)&_ZN6E14x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__6E14x13__8G14x13y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv)();
extern void ABISELECT(_ZThn32_N6E14x133fooEv,_ZThn24_N6E14x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x13__8G14x13y7[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E14x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C14__8G14x13y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__8G14x13y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x13y7[] = {
  {&(_ZTV8G14x13y7[7]),  7,22},
  {&(_ZTV8G14x13y7[13]),  13,22},
  {&(_ZTV8G14x13y7[18]),  18,22},
  {&(_ZTV8G14x13y7[21]),  21,22},
  {&(_tg__ZTV6E14x13__8G14x13y7[5]),  5,6},
  {&(_tg__ZTV3C14__6E14x13__8G14x13y7[4]),  4,4},
  {&(_tg__ZTV2B1__6E14x13__8G14x13y7[3]),  3,4},
  {&(_tg__ZTV3C14__8G14x13y7[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__8G14x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x13y7[];
extern  VTBL_ENTRY _ZTV8G14x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x13y7[];
static VTBL_ENTRY alt_thunk_names232[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x133fooEv,_ZTv0_n12_N6E14x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x133fooEv,_ZThn24_N6E14x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x133fooEv,_ZThn24_N6E14x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x13y7 = {  "G14x13y7", // class name
  bases_G14x13y7, 6,
  &(vtc_G14x13y7[0]), // expected_vtbl_contents
  &(vtt_G14x13y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G14x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x13y7),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x13y7),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  E15x13  : virtual C15 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E15x133fooEv
  ~E15x13(); // tgen
  E15x13(); // tgen
};
//SIG(-1 E15x13) C1{ VBC2{ VBC3{ v1 Fi} VBC4{ v1 Fi} Fi} BC5{ Fi} v1 Fi}


void  E15x13 ::foo(){vfunc_called(this, "_ZN6E15x133fooEv");}
E15x13 ::~E15x13(){ note_dtor("E15x13", this);} // tgen
E15x13 ::E15x13(){ note_ctor("E15x13", this);} // tgen

static void Test_E15x13()
{
  extern Class_Descriptor cd_E15x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_E15x13, buf);
    E15x13 *dp, &lv = *(dp=new (buf) E15x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(E15x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E15x13)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(32,20), "E15x13");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(48,28), "E15x13");
    check_base_class_offset(lv, (C15*), ABISELECT(16,12), "E15x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E15x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E15x13.fd");
    test_class_info(&lv, &cd_E15x13);
    dp->~E15x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE15x13(Test_E15x13, "E15x13", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN6E15x13C1Ev();
extern void _ZN6E15x13D1Ev();
Name_Map name_map_E15x13[] = {
  NSPAIR(_ZN6E15x13C1Ev),
  NSPAIR(_ZN6E15x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x13[] = {
  // 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(48,28), //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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6E15x13[];
extern void _ZN6E15x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn32_N6E15x133fooEv,_ZThn20_N6E15x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn28_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E15x13[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&_ZN6E15x133fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
extern VTBL_ENTRY _ZTV6E15x13[];
static  VTBL_ENTRY _tg__ZTV3C15__6E15x13[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__6E15x13[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__6E15x13[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E15x13[] = {
  {&(_ZTV6E15x13[5]),  5,18},
  {&(_ZTV6E15x13[10]),  10,18},
  {&(_ZTV6E15x13[13]),  13,18},
  {&(_ZTV6E15x13[17]),  17,18},
  {&(_tg__ZTV3C15__6E15x13[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__6E15x13[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__6E15x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E15x13[];
extern  VTBL_ENTRY _ZTV6E15x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x13[];
static VTBL_ENTRY alt_thunk_names233[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn28_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x133fooEv,_ZThn20_N6E15x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E15x13 = {  "E15x13", // class name
  bases_E15x13, 4,
  &(vtc_E15x13[0]), // expected_vtbl_contents
  &(vtt_E15x13[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI6E15x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E15x13),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E15x13),7, //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  G15x13y0  : E15x13 , F1 {
  int ff;
  ~G15x13y0(); // tgen
  G15x13y0(); // tgen
};
//SIG(1 G15x13y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G15x13y0 ::~G15x13y0(){ note_dtor("G15x13y0", this);} // tgen
G15x13y0 ::G15x13y0(){ note_ctor("G15x13y0", this);} // tgen

static void Test_G15x13y0()
{
  extern Class_Descriptor cd_G15x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G15x13y0, buf);
    G15x13y0 *dp, &lv = *(dp=new (buf) G15x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G15x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x13y0)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,32), "G15x13y0");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,40), "G15x13y0");
    check_base_class_offset(lv, (C15*)(E15x13*), ABISELECT(32,24), "G15x13y0");
    check_base_class_offset(lv, (D0*)(E15x13*), ABISELECT(8,4), "G15x13y0");
    check_base_class_offset(lv, (E15x13*), 0, "G15x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G15x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G15x13y0.ff");
    test_class_info(&lv, &cd_G15x13y0);
    dp->~G15x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x13y0(Test_G15x13y0, "G15x13y0", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G15x13y0C1Ev();
extern void _ZN8G15x13y0D1Ev();
Name_Map name_map_G15x13y0[] = {
  NSPAIR(_ZN8G15x13y0C1Ev),
  NSPAIR(_ZN8G15x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x13;
extern VTBL_ENTRY _ZTI6E15x13[];
extern  VTBL_ENTRY _ZTV6E15x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x13y0[] = {
  // 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)
    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
    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,24), //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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E15x13,    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 _ZTI8G15x13y0[];
extern void _ZN6E15x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn32_N6E15x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn64_N6E15x133fooEv,_ZThn40_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x13y0[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x13y0[0]),
  (VTBL_ENTRY)&_ZN6E15x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G15x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G15x13y0[0]),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G15x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
  ABISELECT(-64,-40),
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G15x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
extern VTBL_ENTRY _ZTV8G15x13y0[];
extern void _ZN6E15x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x13__8G15x13y0[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&_ZN6E15x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__6E15x13__8G15x13y0[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn32_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x13__8G15x13y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn64_N6E15x133fooEv,_ZThn40_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x13__8G15x13y0[] = {
  ABISELECT(-64,-40),
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C15__8G15x13y0[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__8G15x13y0[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__8G15x13y0[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x13y0[] = {
  {&(_ZTV8G15x13y0[5]),  5,21},
  {&(_tg__ZTV6E15x13__8G15x13y0[5]),  5,6},
  {&(_tg__ZTV3C15__6E15x13__8G15x13y0[4]),  4,4},
  {&(_tg__ZTV2A1__6E15x13__8G15x13y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x13__8G15x13y0[3]),  3,4},
  {&(_ZTV8G15x13y0[13]),  13,21},
  {&(_ZTV8G15x13y0[16]),  16,21},
  {&(_ZTV8G15x13y0[20]),  20,21},
  {&(_tg__ZTV3C15__8G15x13y0[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__8G15x13y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__8G15x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x13y0[];
extern  VTBL_ENTRY _ZTV8G15x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x13y0[];
static VTBL_ENTRY alt_thunk_names234[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn64_N6E15x133fooEv,_ZThn40_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn32_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn64_N6E15x133fooEv,_ZThn40_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn32_N6E15x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x13y0 = {  "G15x13y0", // class name
  bases_G15x13y0, 6,
  &(vtc_G15x13y0[0]), // expected_vtbl_contents
  &(vtt_G15x13y0[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G15x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x13y0),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x13y0),11, //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  G15x13y1  : virtual E15x13 , F1 {
  int ff;
  ~G15x13y1(); // tgen
  G15x13y1(); // tgen
};
//SIG(1 G15x13y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G15x13y1 ::~G15x13y1(){ note_dtor("G15x13y1", this);} // tgen
G15x13y1 ::G15x13y1(){ note_ctor("G15x13y1", this);} // tgen

static void Test_G15x13y1()
{
  extern Class_Descriptor cd_G15x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G15x13y1, buf);
    G15x13y1 *dp, &lv = *(dp=new (buf) G15x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G15x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x13y1)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,32), "G15x13y1");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,40), "G15x13y1");
    check_base_class_offset(lv, (C15*)(E15x13*), ABISELECT(32,24), "G15x13y1");
    check_base_class_offset(lv, (D0*)(E15x13*), ABISELECT(24,16), "G15x13y1");
    check_base_class_offset(lv, (E15x13*), ABISELECT(16,12), "G15x13y1");
    check_base_class_offset(lv, (F1*), 0, "G15x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x13y1.ff");
    test_class_info(&lv, &cd_G15x13y1);
    dp->~G15x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x13y1(Test_G15x13y1, "G15x13y1", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G15x13y1C1Ev();
extern void _ZN8G15x13y1D1Ev();
Name_Map name_map_G15x13y1[] = {
  NSPAIR(_ZN8G15x13y1C1Ev),
  NSPAIR(_ZN8G15x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x13;
extern VTBL_ENTRY _ZTI6E15x13[];
extern  VTBL_ENTRY _ZTV6E15x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x13y1[] = {
  // 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_C15,    ABISELECT(32,24), //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(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_E15x13,    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_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 _ZTI8G15x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E15x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn32_N6E15x133fooEv,_ZThn20_N6E15x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn28_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x13y1[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G15x13y1[0]),
  (VTBL_ENTRY)&_ZN6E15x133fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G15x13y1[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G15x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
  ABISELECT(-48,-28),
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G15x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
extern VTBL_ENTRY _ZTV8G15x13y1[];
extern void _ZN6E15x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x13__8G15x13y1[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&_ZN6E15x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__6E15x13__8G15x13y1[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn32_N6E15x133fooEv,_ZThn20_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x13__8G15x13y1[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn28_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x13__8G15x13y1[] = {
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C15__8G15x13y1[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__8G15x13y1[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__8G15x13y1[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x13y1[] = {
  {&(_ZTV8G15x13y1[6]),  6,26},
  {&(_ZTV8G15x13y1[13]),  13,26},
  {&(_ZTV8G15x13y1[18]),  18,26},
  {&(_ZTV8G15x13y1[21]),  21,26},
  {&(_ZTV8G15x13y1[25]),  25,26},
  {&(_tg__ZTV6E15x13__8G15x13y1[5]),  5,6},
  {&(_tg__ZTV3C15__6E15x13__8G15x13y1[4]),  4,4},
  {&(_tg__ZTV2A1__6E15x13__8G15x13y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x13__8G15x13y1[3]),  3,4},
  {&(_tg__ZTV3C15__8G15x13y1[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__8G15x13y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__8G15x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x13y1[];
extern  VTBL_ENTRY _ZTV8G15x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x13y1[];
static VTBL_ENTRY alt_thunk_names235[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn28_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x133fooEv,_ZThn20_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn28_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x133fooEv,_ZThn20_N6E15x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x13y1 = {  "G15x13y1", // class name
  bases_G15x13y1, 6,
  &(vtc_G15x13y1[0]), // expected_vtbl_contents
  &(vtt_G15x13y1[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G15x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x13y1),26, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x13y1),12, //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  G15x13y2  : E15x13 , virtual F1 {
  int ff;
  ~G15x13y2(); // tgen
  G15x13y2(); // tgen
};
//SIG(1 G15x13y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G15x13y2 ::~G15x13y2(){ note_dtor("G15x13y2", this);} // tgen
G15x13y2 ::G15x13y2(){ note_ctor("G15x13y2", this);} // tgen

static void Test_G15x13y2()
{
  extern Class_Descriptor cd_G15x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G15x13y2, buf);
    G15x13y2 *dp, &lv = *(dp=new (buf) G15x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G15x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x13y2)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(40,24), "G15x13y2");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(56,32), "G15x13y2");
    check_base_class_offset(lv, (C15*)(E15x13*), ABISELECT(24,16), "G15x13y2");
    check_base_class_offset(lv, (D0*)(E15x13*), ABISELECT(8,4), "G15x13y2");
    check_base_class_offset(lv, (E15x13*), 0, "G15x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(72,40), "G15x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G15x13y2.ff");
    test_class_info(&lv, &cd_G15x13y2);
    dp->~G15x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x13y2(Test_G15x13y2, "G15x13y2", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN8G15x13y2C1Ev();
extern void _ZN8G15x13y2D1Ev();
Name_Map name_map_G15x13y2[] = {
  NSPAIR(_ZN8G15x13y2C1Ev),
  NSPAIR(_ZN8G15x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x13;
extern VTBL_ENTRY _ZTI6E15x13[];
extern  VTBL_ENTRY _ZTV6E15x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x13y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //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,32), //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(24,16), //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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E15x13,    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
    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 _ZTI8G15x13y2[];
extern void _ZN6E15x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn40_N6E15x133fooEv,_ZThn24_N6E15x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn56_N6E15x133fooEv,_ZThn32_N6E15x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G15x13y2[] = {
  ABISELECT(72,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x13y2[0]),
  (VTBL_ENTRY)&_ZN6E15x133fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G15x13y2[0]),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G15x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
  ABISELECT(-56,-32),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI8G15x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
  0,
  ABISELECT(-72,-40),
  (VTBL_ENTRY)&(_ZTI8G15x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G15x13y2[];
extern void _ZN6E15x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x13__8G15x13y2[] = {
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&_ZN6E15x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__6E15x13__8G15x13y2[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn40_N6E15x133fooEv,_ZThn24_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x13__8G15x13y2[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn56_N6E15x133fooEv,_ZThn32_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x13__8G15x13y2[] = {
  ABISELECT(-56,-32),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C15__8G15x13y2[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__8G15x13y2[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__8G15x13y2[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x13y2[] = {
  {&(_ZTV8G15x13y2[6]),  6,23},
  {&(_tg__ZTV6E15x13__8G15x13y2[5]),  5,6},
  {&(_tg__ZTV3C15__6E15x13__8G15x13y2[4]),  4,4},
  {&(_tg__ZTV2A1__6E15x13__8G15x13y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x13__8G15x13y2[3]),  3,4},
  {&(_ZTV8G15x13y2[11]),  11,23},
  {&(_ZTV8G15x13y2[14]),  14,23},
  {&(_ZTV8G15x13y2[18]),  18,23},
  {&(_ZTV8G15x13y2[22]),  22,23},
  {&(_tg__ZTV3C15__8G15x13y2[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__8G15x13y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__8G15x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x13y2[];
extern  VTBL_ENTRY _ZTV8G15x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x13y2[];
static VTBL_ENTRY alt_thunk_names236[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E15x133fooEv,_ZThn32_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x133fooEv,_ZThn24_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E15x133fooEv,_ZThn32_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x133fooEv,_ZThn24_N6E15x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x13y2 = {  "G15x13y2", // class name
  bases_G15x13y2, 6,
  &(vtc_G15x13y2[0]), // expected_vtbl_contents
  &(vtt_G15x13y2[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI8G15x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x13y2),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x13y2),12, //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  G15x13y3  : virtual E15x13 , virtual F1 {
  int ff;
  ~G15x13y3(); // tgen
  G15x13y3(); // tgen
};
//SIG(1 G15x13y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G15x13y3 ::~G15x13y3(){ note_dtor("G15x13y3", this);} // tgen
G15x13y3 ::G15x13y3(){ note_ctor("G15x13y3", this);} // tgen

static void Test_G15x13y3()
{
  extern Class_Descriptor cd_G15x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(13,14)];
    init_test(&cd_G15x13y3, buf);
    G15x13y3 *dp, &lv = *(dp=new (buf) G15x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(96,52), "sizeof(G15x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x13y3)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,28), "G15x13y3");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,36), "G15x13y3");
    check_base_class_offset(lv, (C15*)(E15x13*), ABISELECT(32,20), "G15x13y3");
    check_base_class_offset(lv, (D0*)(E15x13*), ABISELECT(24,12), "G15x13y3");
    check_base_class_offset(lv, (E15x13*), ABISELECT(16,8), "G15x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(80,44), "G15x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G15x13y3.ff");
    test_class_info(&lv, &cd_G15x13y3);
    dp->~G15x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x13y3(Test_G15x13y3, "G15x13y3", ABISELECT(96,52));

#else // __cplusplus

extern void _ZN8G15x13y3C1Ev();
extern void _ZN8G15x13y3D1Ev();
Name_Map name_map_G15x13y3[] = {
  NSPAIR(_ZN8G15x13y3C1Ev),
  NSPAIR(_ZN8G15x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x13;
extern VTBL_ENTRY _ZTI6E15x13[];
extern  VTBL_ENTRY _ZTV6E15x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x13y3[] = {
  // 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
    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_E15x13,    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
    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 _ZTI8G15x13y3[];
extern void _ZN6E15x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn32_N6E15x133fooEv,_ZThn20_N6E15x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn28_N6E15x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G15x13y3[] = {
  ABISELECT(80,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x13y3[0]),
  0,
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G15x13y3[0]),
  (VTBL_ENTRY)&_ZN6E15x133fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G15x13y3[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G15x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
  ABISELECT(-48,-28),
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI8G15x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
  0,
  ABISELECT(-80,-44),
  (VTBL_ENTRY)&(_ZTI8G15x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G15x13y3[];
extern void _ZN6E15x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x13__8G15x13y3[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&_ZN6E15x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__6E15x13__8G15x13y3[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn32_N6E15x133fooEv,_ZThn20_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x13__8G15x13y3[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn28_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x13__8G15x13y3[] = {
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C15__8G15x13y3[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__8G15x13y3[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__8G15x13y3[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x13y3[] = {
  {&(_ZTV8G15x13y3[7]),  7,30},
  {&(_ZTV8G15x13y3[13]),  13,30},
  {&(_ZTV8G15x13y3[18]),  18,30},
  {&(_ZTV8G15x13y3[21]),  21,30},
  {&(_ZTV8G15x13y3[25]),  25,30},
  {&(_ZTV8G15x13y3[29]),  29,30},
  {&(_tg__ZTV6E15x13__8G15x13y3[5]),  5,6},
  {&(_tg__ZTV3C15__6E15x13__8G15x13y3[4]),  4,4},
  {&(_tg__ZTV2A1__6E15x13__8G15x13y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x13__8G15x13y3[3]),  3,4},
  {&(_tg__ZTV3C15__8G15x13y3[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__8G15x13y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__8G15x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x13y3[];
extern  VTBL_ENTRY _ZTV8G15x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x13y3[];
static VTBL_ENTRY alt_thunk_names237[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn28_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x133fooEv,_ZThn20_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn28_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x133fooEv,_ZThn20_N6E15x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x13y3 = {  "G15x13y3", // class name
  bases_G15x13y3, 6,
  &(vtc_G15x13y3[0]), // expected_vtbl_contents
  &(vtt_G15x13y3[0]), // expected_vtt_contents
  ABISELECT(96,52), // object size
  NSPAIRA(_ZTI8G15x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x13y3),30, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x13y3),13, //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  G15x13y4  : E15x13 , F0 {
  int ff;
  ~G15x13y4(); // tgen
  G15x13y4(); // tgen
};
//SIG(1 G15x13y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G15x13y4 ::~G15x13y4(){ note_dtor("G15x13y4", this);} // tgen
G15x13y4 ::G15x13y4(){ note_ctor("G15x13y4", this);} // tgen

static void Test_G15x13y4()
{
  extern Class_Descriptor cd_G15x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x13y4, buf);
    G15x13y4 *dp, &lv = *(dp=new (buf) G15x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x13y4)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(40,28), "G15x13y4");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(56,36), "G15x13y4");
    check_base_class_offset(lv, (C15*)(E15x13*), ABISELECT(24,20), "G15x13y4");
    check_base_class_offset(lv, (D0*)(E15x13*), ABISELECT(8,4), "G15x13y4");
    check_base_class_offset(lv, (E15x13*), 0, "G15x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G15x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G15x13y4.ff");
    test_class_info(&lv, &cd_G15x13y4);
    dp->~G15x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x13y4(Test_G15x13y4, "G15x13y4", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G15x13y4C1Ev();
extern void _ZN8G15x13y4D1Ev();
Name_Map name_map_G15x13y4[] = {
  NSPAIR(_ZN8G15x13y4C1Ev),
  NSPAIR(_ZN8G15x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x13;
extern VTBL_ENTRY _ZTI6E15x13[];
extern  VTBL_ENTRY _ZTV6E15x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x13y4[] = {
  // 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)
    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
    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,20), //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_E15x13,    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 _ZTI8G15x13y4[];
extern void _ZN6E15x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn40_N6E15x133fooEv,_ZThn28_N6E15x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn56_N6E15x133fooEv,_ZThn36_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x13y4[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x13y4[0]),
  (VTBL_ENTRY)&_ZN6E15x133fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G15x13y4[0]),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G15x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
  ABISELECT(-56,-36),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G15x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
extern VTBL_ENTRY _ZTV8G15x13y4[];
extern void _ZN6E15x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x13__8G15x13y4[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&_ZN6E15x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__6E15x13__8G15x13y4[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn40_N6E15x133fooEv,_ZThn28_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x13__8G15x13y4[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn56_N6E15x133fooEv,_ZThn36_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x13__8G15x13y4[] = {
  ABISELECT(-56,-36),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C15__8G15x13y4[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__8G15x13y4[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__8G15x13y4[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x13y4[] = {
  {&(_ZTV8G15x13y4[5]),  5,18},
  {&(_tg__ZTV6E15x13__8G15x13y4[5]),  5,6},
  {&(_tg__ZTV3C15__6E15x13__8G15x13y4[4]),  4,4},
  {&(_tg__ZTV2A1__6E15x13__8G15x13y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x13__8G15x13y4[3]),  3,4},
  {&(_ZTV8G15x13y4[10]),  10,18},
  {&(_ZTV8G15x13y4[13]),  13,18},
  {&(_ZTV8G15x13y4[17]),  17,18},
  {&(_tg__ZTV3C15__8G15x13y4[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__8G15x13y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__8G15x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x13y4[];
extern  VTBL_ENTRY _ZTV8G15x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x13y4[];
static VTBL_ENTRY alt_thunk_names238[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E15x133fooEv,_ZThn36_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x133fooEv,_ZThn28_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E15x133fooEv,_ZThn36_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x133fooEv,_ZThn28_N6E15x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x13y4 = {  "G15x13y4", // class name
  bases_G15x13y4, 6,
  &(vtc_G15x13y4[0]), // expected_vtbl_contents
  &(vtt_G15x13y4[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G15x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x13y4),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x13y4),11, //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  G15x13y5  : virtual E15x13 , F0 {
  int ff;
  ~G15x13y5(); // tgen
  G15x13y5(); // tgen
};
//SIG(1 G15x13y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G15x13y5 ::~G15x13y5(){ note_dtor("G15x13y5", this);} // tgen
G15x13y5 ::G15x13y5(){ note_ctor("G15x13y5", this);} // tgen

static void Test_G15x13y5()
{
  extern Class_Descriptor cd_G15x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G15x13y5, buf);
    G15x13y5 *dp, &lv = *(dp=new (buf) G15x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G15x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x13y5)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,32), "G15x13y5");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,40), "G15x13y5");
    check_base_class_offset(lv, (C15*)(E15x13*), ABISELECT(32,24), "G15x13y5");
    check_base_class_offset(lv, (D0*)(E15x13*), ABISELECT(24,16), "G15x13y5");
    check_base_class_offset(lv, (E15x13*), ABISELECT(16,12), "G15x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G15x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x13y5.ff");
    test_class_info(&lv, &cd_G15x13y5);
    dp->~G15x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x13y5(Test_G15x13y5, "G15x13y5", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G15x13y5C1Ev();
extern void _ZN8G15x13y5D1Ev();
Name_Map name_map_G15x13y5[] = {
  NSPAIR(_ZN8G15x13y5C1Ev),
  NSPAIR(_ZN8G15x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x13;
extern VTBL_ENTRY _ZTI6E15x13[];
extern  VTBL_ENTRY _ZTV6E15x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x13y5[] = {
  // 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_C15,    ABISELECT(32,24), //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(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_E15x13,    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
    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 _ZTI8G15x13y5[];
extern void _ZN6E15x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn32_N6E15x133fooEv,_ZThn20_N6E15x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn28_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x13y5[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x13y5[0]),
  0,
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G15x13y5[0]),
  (VTBL_ENTRY)&_ZN6E15x133fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G15x13y5[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G15x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
  ABISELECT(-48,-28),
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G15x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
extern VTBL_ENTRY _ZTV8G15x13y5[];
extern void _ZN6E15x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x13__8G15x13y5[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&_ZN6E15x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__6E15x13__8G15x13y5[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn32_N6E15x133fooEv,_ZThn20_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x13__8G15x13y5[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn28_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x13__8G15x13y5[] = {
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C15__8G15x13y5[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__8G15x13y5[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__8G15x13y5[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x13y5[] = {
  {&(_ZTV8G15x13y5[6]),  6,25},
  {&(_ZTV8G15x13y5[12]),  12,25},
  {&(_ZTV8G15x13y5[17]),  17,25},
  {&(_ZTV8G15x13y5[20]),  20,25},
  {&(_ZTV8G15x13y5[24]),  24,25},
  {&(_tg__ZTV6E15x13__8G15x13y5[5]),  5,6},
  {&(_tg__ZTV3C15__6E15x13__8G15x13y5[4]),  4,4},
  {&(_tg__ZTV2A1__6E15x13__8G15x13y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x13__8G15x13y5[3]),  3,4},
  {&(_tg__ZTV3C15__8G15x13y5[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__8G15x13y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__8G15x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x13y5[];
extern  VTBL_ENTRY _ZTV8G15x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x13y5[];
static VTBL_ENTRY alt_thunk_names239[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn28_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x133fooEv,_ZThn20_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn28_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x133fooEv,_ZThn20_N6E15x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x13y5 = {  "G15x13y5", // class name
  bases_G15x13y5, 6,
  &(vtc_G15x13y5[0]), // expected_vtbl_contents
  &(vtt_G15x13y5[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G15x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x13y5),25, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x13y5),12, //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  G15x13y6  : E15x13 , virtual F0 {
  int ff;
  ~G15x13y6(); // tgen
  G15x13y6(); // tgen
};
//SIG(1 G15x13y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G15x13y6 ::~G15x13y6(){ note_dtor("G15x13y6", this);} // tgen
G15x13y6 ::G15x13y6(){ note_ctor("G15x13y6", this);} // tgen

static void Test_G15x13y6()
{
  extern Class_Descriptor cd_G15x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x13y6, buf);
    G15x13y6 *dp, &lv = *(dp=new (buf) G15x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x13y6)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(40,24), "G15x13y6");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(56,32), "G15x13y6");
    check_base_class_offset(lv, (C15*)(E15x13*), ABISELECT(24,16), "G15x13y6");
    check_base_class_offset(lv, (D0*)(E15x13*), ABISELECT(8,4), "G15x13y6");
    check_base_class_offset(lv, (E15x13*), 0, "G15x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(68,40), "G15x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G15x13y6.ff");
    test_class_info(&lv, &cd_G15x13y6);
    dp->~G15x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x13y6(Test_G15x13y6, "G15x13y6", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G15x13y6C1Ev();
extern void _ZN8G15x13y6D1Ev();
Name_Map name_map_G15x13y6[] = {
  NSPAIR(_ZN8G15x13y6C1Ev),
  NSPAIR(_ZN8G15x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x13;
extern VTBL_ENTRY _ZTI6E15x13[];
extern  VTBL_ENTRY _ZTV6E15x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x13y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //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,32), //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(24,16), //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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E15x13,    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 _ZTI8G15x13y6[];
extern void _ZN6E15x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn40_N6E15x133fooEv,_ZThn24_N6E15x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn56_N6E15x133fooEv,_ZThn32_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x13y6[] = {
  ABISELECT(68,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x13y6[0]),
  (VTBL_ENTRY)&_ZN6E15x133fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G15x13y6[0]),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G15x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
  ABISELECT(-56,-32),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI8G15x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
extern VTBL_ENTRY _ZTV8G15x13y6[];
extern void _ZN6E15x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x13__8G15x13y6[] = {
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&_ZN6E15x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__6E15x13__8G15x13y6[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn40_N6E15x133fooEv,_ZThn24_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x13__8G15x13y6[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn56_N6E15x133fooEv,_ZThn32_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x13__8G15x13y6[] = {
  ABISELECT(-56,-32),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C15__8G15x13y6[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__8G15x13y6[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__8G15x13y6[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x13y6[] = {
  {&(_ZTV8G15x13y6[6]),  6,19},
  {&(_tg__ZTV6E15x13__8G15x13y6[5]),  5,6},
  {&(_tg__ZTV3C15__6E15x13__8G15x13y6[4]),  4,4},
  {&(_tg__ZTV2A1__6E15x13__8G15x13y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x13__8G15x13y6[3]),  3,4},
  {&(_ZTV8G15x13y6[11]),  11,19},
  {&(_ZTV8G15x13y6[14]),  14,19},
  {&(_ZTV8G15x13y6[18]),  18,19},
  {&(_tg__ZTV3C15__8G15x13y6[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__8G15x13y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__8G15x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x13y6[];
extern  VTBL_ENTRY _ZTV8G15x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x13y6[];
static VTBL_ENTRY alt_thunk_names240[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E15x133fooEv,_ZThn32_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x133fooEv,_ZThn24_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E15x133fooEv,_ZThn32_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x133fooEv,_ZThn24_N6E15x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x13y6 = {  "G15x13y6", // class name
  bases_G15x13y6, 6,
  &(vtc_G15x13y6[0]), // expected_vtbl_contents
  &(vtt_G15x13y6[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G15x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x13y6),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x13y6),11, //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  G15x13y7  : virtual E15x13 , virtual F0 {
  int ff;
  ~G15x13y7(); // tgen
  G15x13y7(); // tgen
};
//SIG(1 G15x13y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G15x13y7 ::~G15x13y7(){ note_dtor("G15x13y7", this);} // tgen
G15x13y7 ::G15x13y7(){ note_ctor("G15x13y7", this);} // tgen

static void Test_G15x13y7()
{
  extern Class_Descriptor cd_G15x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G15x13y7, buf);
    G15x13y7 *dp, &lv = *(dp=new (buf) G15x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G15x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x13y7)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,28), "G15x13y7");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,36), "G15x13y7");
    check_base_class_offset(lv, (C15*)(E15x13*), ABISELECT(32,20), "G15x13y7");
    check_base_class_offset(lv, (D0*)(E15x13*), ABISELECT(24,12), "G15x13y7");
    check_base_class_offset(lv, (E15x13*), ABISELECT(16,8), "G15x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(76,44), "G15x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G15x13y7.ff");
    test_class_info(&lv, &cd_G15x13y7);
    dp->~G15x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x13y7(Test_G15x13y7, "G15x13y7", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G15x13y7C1Ev();
extern void _ZN8G15x13y7D1Ev();
Name_Map name_map_G15x13y7[] = {
  NSPAIR(_ZN8G15x13y7C1Ev),
  NSPAIR(_ZN8G15x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x13;
extern VTBL_ENTRY _ZTI6E15x13[];
extern  VTBL_ENTRY _ZTV6E15x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x13y7[] = {
  // 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(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_E15x13,    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_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 _ZTI8G15x13y7[];
extern void _ZN6E15x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn32_N6E15x133fooEv,_ZThn20_N6E15x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn28_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x13y7[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x13y7[0]),
  0,
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G15x13y7[0]),
  (VTBL_ENTRY)&_ZN6E15x133fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G15x13y7[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G15x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
  ABISELECT(-48,-28),
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI8G15x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
extern VTBL_ENTRY _ZTV8G15x13y7[];
extern void _ZN6E15x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x13__8G15x13y7[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&_ZN6E15x133fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__6E15x13__8G15x13y7[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn32_N6E15x133fooEv,_ZThn20_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x13__8G15x13y7[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv)();
extern void ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn28_N6E15x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x13__8G15x13y7[] = {
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6E15x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C15__8G15x13y7[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__8G15x13y7[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__8G15x13y7[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x13y7[] = {
  {&(_ZTV8G15x13y7[7]),  7,26},
  {&(_ZTV8G15x13y7[13]),  13,26},
  {&(_ZTV8G15x13y7[18]),  18,26},
  {&(_ZTV8G15x13y7[21]),  21,26},
  {&(_ZTV8G15x13y7[25]),  25,26},
  {&(_tg__ZTV6E15x13__8G15x13y7[5]),  5,6},
  {&(_tg__ZTV3C15__6E15x13__8G15x13y7[4]),  4,4},
  {&(_tg__ZTV2A1__6E15x13__8G15x13y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x13__8G15x13y7[3]),  3,4},
  {&(_tg__ZTV3C15__8G15x13y7[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__8G15x13y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__8G15x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x13y7[];
extern  VTBL_ENTRY _ZTV8G15x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x13y7[];
static VTBL_ENTRY alt_thunk_names241[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x133fooEv,_ZTv0_n12_N6E15x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn28_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x133fooEv,_ZThn20_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x133fooEv,_ZThn28_N6E15x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x133fooEv,_ZThn20_N6E15x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x13y7 = {  "G15x13y7", // class name
  bases_G15x13y7, 6,
  &(vtc_G15x13y7[0]), // expected_vtbl_contents
  &(vtt_G15x13y7[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G15x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x13y7),26, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x13y7),12, //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  E16x13  : virtual C16 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E16x133fooEv
  ~E16x13(); // tgen
  E16x13(); // tgen
};
//SIG(-1 E16x13) C1{ VBC2{ BC3{ Fi} BC4{ Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E16x13 ::foo(){vfunc_called(this, "_ZN6E16x133fooEv");}
E16x13 ::~E16x13(){ note_dtor("E16x13", this);} // tgen
E16x13 ::E16x13(){ note_ctor("E16x13", this);} // tgen

static void Test_E16x13()
{
  extern Class_Descriptor cd_E16x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E16x13, buf);
    E16x13 *dp, &lv = *(dp=new (buf) E16x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E16x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E16x13)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(24,16), "E16x13");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(28,20), "E16x13");
    check_base_class_offset(lv, (C16*), ABISELECT(16,12), "E16x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E16x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E16x13.fd");
    test_class_info(&lv, &cd_E16x13);
    dp->~E16x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE16x13(Test_E16x13, "E16x13", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E16x13C1Ev();
extern void _ZN6E16x13D1Ev();
Name_Map name_map_E16x13[] = {
  NSPAIR(_ZN6E16x13C1Ev),
  NSPAIR(_ZN6E16x13D1Ev),
  {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_E16x13[] = {
  // 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)
    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 _ZTI6E16x13[];
extern void _ZN6E16x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv)();
extern void ABISELECT(_ZThn16_N6E16x133fooEv,_ZThn12_N6E16x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E16x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x13[0]),
  (VTBL_ENTRY)&_ZN6E16x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E16x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv),
};
extern VTBL_ENTRY _ZTV6E16x13[];
static  VTT_ENTRY vtt_E16x13[] = {
  {&(_ZTV6E16x13[3]),  3,8},
  {&(_ZTV6E16x13[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6E16x13[];
extern  VTBL_ENTRY _ZTV6E16x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x13[];
static VTBL_ENTRY alt_thunk_names242[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x133fooEv,_ZThn12_N6E16x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E16x13 = {  "E16x13", // class name
  bases_E16x13, 4,
  &(vtc_E16x13[0]), // expected_vtbl_contents
  &(vtt_E16x13[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E16x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E16x13),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E16x13),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names242,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x13y0  : E16x13 , F1 {
  int ff;
  ~G16x13y0(); // tgen
  G16x13y0(); // tgen
};
//SIG(1 G16x13y0) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G16x13y0 ::~G16x13y0(){ note_dtor("G16x13y0", this);} // tgen
G16x13y0 ::G16x13y0(){ note_ctor("G16x13y0", this);} // tgen

static void Test_G16x13y0()
{
  extern Class_Descriptor cd_G16x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G16x13y0, buf);
    G16x13y0 *dp, &lv = *(dp=new (buf) G16x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G16x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x13y0)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,28), "G16x13y0");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,32), "G16x13y0");
    check_base_class_offset(lv, (C16*)(E16x13*), ABISELECT(32,24), "G16x13y0");
    check_base_class_offset(lv, (D0*)(E16x13*), ABISELECT(8,4), "G16x13y0");
    check_base_class_offset(lv, (E16x13*), 0, "G16x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G16x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G16x13y0.ff");
    test_class_info(&lv, &cd_G16x13y0);
    dp->~G16x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x13y0(Test_G16x13y0, "G16x13y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G16x13y0C1Ev();
extern void _ZN8G16x13y0D1Ev();
Name_Map name_map_G16x13y0[] = {
  NSPAIR(_ZN8G16x13y0C1Ev),
  NSPAIR(_ZN8G16x13y0D1Ev),
  {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_E16x13;
extern VTBL_ENTRY _ZTI6E16x13[];
extern  VTBL_ENTRY _ZTV6E16x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x13y0[] = {
  // 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)
    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_E16x13,    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
    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 _ZTI8G16x13y0[];
extern void _ZN6E16x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv)();
extern void ABISELECT(_ZThn32_N6E16x133fooEv,_ZThn24_N6E16x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G16x13y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x13y0[0]),
  (VTBL_ENTRY)&_ZN6E16x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G16x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G16x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv),
};
extern VTBL_ENTRY _ZTV8G16x13y0[];
extern void _ZN6E16x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x13__8G16x13y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x13[0]),
  (VTBL_ENTRY)&_ZN6E16x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv)();
extern void ABISELECT(_ZThn32_N6E16x133fooEv,_ZThn24_N6E16x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C16__6E16x13__8G16x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E16x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv),
};
static  VTT_ENTRY vtt_G16x13y0[] = {
  {&(_ZTV8G16x13y0[3]),  3,11},
  {&(_tg__ZTV6E16x13__8G16x13y0[3]),  3,4},
  {&(_tg__ZTV3C16__6E16x13__8G16x13y0[3]),  3,4},
  {&(_ZTV8G16x13y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI8G16x13y0[];
extern  VTBL_ENTRY _ZTV8G16x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x13y0[];
static VTBL_ENTRY alt_thunk_names243[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E16x133fooEv,_ZThn24_N6E16x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E16x133fooEv,_ZThn24_N6E16x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G16x13y0 = {  "G16x13y0", // class name
  bases_G16x13y0, 6,
  &(vtc_G16x13y0[0]), // expected_vtbl_contents
  &(vtt_G16x13y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G16x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x13y0),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x13y0),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names243,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x13y1  : virtual E16x13 , F1 {
  int ff;
  ~G16x13y1(); // tgen
  G16x13y1(); // tgen
};
//SIG(1 G16x13y1) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G16x13y1 ::~G16x13y1(){ note_dtor("G16x13y1", this);} // tgen
G16x13y1 ::G16x13y1(){ note_ctor("G16x13y1", this);} // tgen

static void Test_G16x13y1()
{
  extern Class_Descriptor cd_G16x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G16x13y1, buf);
    G16x13y1 *dp, &lv = *(dp=new (buf) G16x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G16x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x13y1)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,28), "G16x13y1");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,32), "G16x13y1");
    check_base_class_offset(lv, (C16*)(E16x13*), ABISELECT(32,24), "G16x13y1");
    check_base_class_offset(lv, (D0*)(E16x13*), ABISELECT(24,16), "G16x13y1");
    check_base_class_offset(lv, (E16x13*), ABISELECT(16,12), "G16x13y1");
    check_base_class_offset(lv, (F1*), 0, "G16x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x13y1.ff");
    test_class_info(&lv, &cd_G16x13y1);
    dp->~G16x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x13y1(Test_G16x13y1, "G16x13y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G16x13y1C1Ev();
extern void _ZN8G16x13y1D1Ev();
Name_Map name_map_G16x13y1[] = {
  NSPAIR(_ZN8G16x13y1C1Ev),
  NSPAIR(_ZN8G16x13y1D1Ev),
  {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_E16x13;
extern VTBL_ENTRY _ZTI6E16x13[];
extern  VTBL_ENTRY _ZTV6E16x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x13y1[] = {
  // 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
    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(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_E16x13,    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_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 _ZTI8G16x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E16x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv)();
extern void ABISELECT(_ZThn16_N6E16x133fooEv,_ZThn12_N6E16x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G16x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G16x13y1[0]),
  (VTBL_ENTRY)&_ZN6E16x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G16x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv),
};
extern VTBL_ENTRY _ZTV8G16x13y1[];
extern void _ZN6E16x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x13__8G16x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x13[0]),
  (VTBL_ENTRY)&_ZN6E16x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv)();
extern void ABISELECT(_ZThn16_N6E16x133fooEv,_ZThn12_N6E16x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C16__6E16x13__8G16x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E16x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv),
};
static  VTT_ENTRY vtt_G16x13y1[] = {
  {&(_ZTV8G16x13y1[4]),  4,14},
  {&(_ZTV8G16x13y1[9]),  9,14},
  {&(_ZTV8G16x13y1[13]),  13,14},
  {&(_tg__ZTV6E16x13__8G16x13y1[3]),  3,4},
  {&(_tg__ZTV3C16__6E16x13__8G16x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G16x13y1[];
extern  VTBL_ENTRY _ZTV8G16x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x13y1[];
static VTBL_ENTRY alt_thunk_names244[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x133fooEv,_ZThn12_N6E16x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x133fooEv,_ZThn12_N6E16x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G16x13y1 = {  "G16x13y1", // class name
  bases_G16x13y1, 6,
  &(vtc_G16x13y1[0]), // expected_vtbl_contents
  &(vtt_G16x13y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G16x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x13y1),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x13y1),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names244,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x13y2  : E16x13 , virtual F1 {
  int ff;
  ~G16x13y2(); // tgen
  G16x13y2(); // tgen
};
//SIG(1 G16x13y2) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G16x13y2 ::~G16x13y2(){ note_dtor("G16x13y2", this);} // tgen
G16x13y2 ::G16x13y2(){ note_ctor("G16x13y2", this);} // tgen

static void Test_G16x13y2()
{
  extern Class_Descriptor cd_G16x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G16x13y2, buf);
    G16x13y2 *dp, &lv = *(dp=new (buf) G16x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G16x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x13y2)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(32,20), "G16x13y2");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(36,24), "G16x13y2");
    check_base_class_offset(lv, (C16*)(E16x13*), ABISELECT(24,16), "G16x13y2");
    check_base_class_offset(lv, (D0*)(E16x13*), ABISELECT(8,4), "G16x13y2");
    check_base_class_offset(lv, (E16x13*), 0, "G16x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G16x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G16x13y2.ff");
    test_class_info(&lv, &cd_G16x13y2);
    dp->~G16x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x13y2(Test_G16x13y2, "G16x13y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G16x13y2C1Ev();
extern void _ZN8G16x13y2D1Ev();
Name_Map name_map_G16x13y2[] = {
  NSPAIR(_ZN8G16x13y2C1Ev),
  NSPAIR(_ZN8G16x13y2D1Ev),
  {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_E16x13;
extern VTBL_ENTRY _ZTI6E16x13[];
extern  VTBL_ENTRY _ZTV6E16x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x13y2[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E16x13,    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
    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 _ZTI8G16x13y2[];
extern void _ZN6E16x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv)();
extern void ABISELECT(_ZThn24_N6E16x133fooEv,_ZThn16_N6E16x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x13y2[] = {
  ABISELECT(48,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x13y2[0]),
  (VTBL_ENTRY)&_ZN6E16x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G16x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G16x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G16x13y2[];
extern void _ZN6E16x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x13__8G16x13y2[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x13[0]),
  (VTBL_ENTRY)&_ZN6E16x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv)();
extern void ABISELECT(_ZThn24_N6E16x133fooEv,_ZThn16_N6E16x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C16__6E16x13__8G16x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E16x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv),
};
static  VTT_ENTRY vtt_G16x13y2[] = {
  {&(_ZTV8G16x13y2[4]),  4,13},
  {&(_tg__ZTV6E16x13__8G16x13y2[3]),  3,4},
  {&(_tg__ZTV3C16__6E16x13__8G16x13y2[3]),  3,4},
  {&(_ZTV8G16x13y2[8]),  8,13},
  {&(_ZTV8G16x13y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI8G16x13y2[];
extern  VTBL_ENTRY _ZTV8G16x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x13y2[];
static VTBL_ENTRY alt_thunk_names245[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E16x133fooEv,_ZThn16_N6E16x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E16x133fooEv,_ZThn16_N6E16x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G16x13y2 = {  "G16x13y2", // class name
  bases_G16x13y2, 6,
  &(vtc_G16x13y2[0]), // expected_vtbl_contents
  &(vtt_G16x13y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G16x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x13y2),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x13y2),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names245,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x13y3  : virtual E16x13 , virtual F1 {
  int ff;
  ~G16x13y3(); // tgen
  G16x13y3(); // tgen
};
//SIG(1 G16x13y3) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G16x13y3 ::~G16x13y3(){ note_dtor("G16x13y3", this);} // tgen
G16x13y3 ::G16x13y3(){ note_ctor("G16x13y3", this);} // tgen

static void Test_G16x13y3()
{
  extern Class_Descriptor cd_G16x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G16x13y3, buf);
    G16x13y3 *dp, &lv = *(dp=new (buf) G16x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G16x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x13y3)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,24), "G16x13y3");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,28), "G16x13y3");
    check_base_class_offset(lv, (C16*)(E16x13*), ABISELECT(32,20), "G16x13y3");
    check_base_class_offset(lv, (D0*)(E16x13*), ABISELECT(24,12), "G16x13y3");
    check_base_class_offset(lv, (E16x13*), ABISELECT(16,8), "G16x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G16x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G16x13y3.ff");
    test_class_info(&lv, &cd_G16x13y3);
    dp->~G16x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x13y3(Test_G16x13y3, "G16x13y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G16x13y3C1Ev();
extern void _ZN8G16x13y3D1Ev();
Name_Map name_map_G16x13y3[] = {
  NSPAIR(_ZN8G16x13y3C1Ev),
  NSPAIR(_ZN8G16x13y3D1Ev),
  {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_E16x13;
extern VTBL_ENTRY _ZTI6E16x13[];
extern  VTBL_ENTRY _ZTV6E16x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x13y3[] = {
  // 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(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_E16x13,    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
    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 _ZTI8G16x13y3[];
extern void _ZN6E16x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv)();
extern void ABISELECT(_ZThn16_N6E16x133fooEv,_ZThn12_N6E16x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x13y3[] = {
  ABISELECT(56,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x13y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G16x13y3[0]),
  (VTBL_ENTRY)&_ZN6E16x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G16x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G16x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G16x13y3[];
extern void _ZN6E16x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x13__8G16x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x13[0]),
  (VTBL_ENTRY)&_ZN6E16x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv)();
extern void ABISELECT(_ZThn16_N6E16x133fooEv,_ZThn12_N6E16x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C16__6E16x13__8G16x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E16x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv),
};
static  VTT_ENTRY vtt_G16x13y3[] = {
  {&(_ZTV8G16x13y3[5]),  5,18},
  {&(_ZTV8G16x13y3[9]),  9,18},
  {&(_ZTV8G16x13y3[13]),  13,18},
  {&(_ZTV8G16x13y3[17]),  17,18},
  {&(_tg__ZTV6E16x13__8G16x13y3[3]),  3,4},
  {&(_tg__ZTV3C16__6E16x13__8G16x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G16x13y3[];
extern  VTBL_ENTRY _ZTV8G16x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x13y3[];
static VTBL_ENTRY alt_thunk_names246[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x133fooEv,_ZThn12_N6E16x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x133fooEv,_ZThn12_N6E16x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G16x13y3 = {  "G16x13y3", // class name
  bases_G16x13y3, 6,
  &(vtc_G16x13y3[0]), // expected_vtbl_contents
  &(vtt_G16x13y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G16x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x13y3),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x13y3),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names246,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x13y4  : E16x13 , F0 {
  int ff;
  ~G16x13y4(); // tgen
  G16x13y4(); // tgen
};
//SIG(1 G16x13y4) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G16x13y4 ::~G16x13y4(){ note_dtor("G16x13y4", this);} // tgen
G16x13y4 ::G16x13y4(){ note_ctor("G16x13y4", this);} // tgen

static void Test_G16x13y4()
{
  extern Class_Descriptor cd_G16x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x13y4, buf);
    G16x13y4 *dp, &lv = *(dp=new (buf) G16x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x13y4)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(32,24), "G16x13y4");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(36,28), "G16x13y4");
    check_base_class_offset(lv, (C16*)(E16x13*), ABISELECT(24,20), "G16x13y4");
    check_base_class_offset(lv, (D0*)(E16x13*), ABISELECT(8,4), "G16x13y4");
    check_base_class_offset(lv, (E16x13*), 0, "G16x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G16x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G16x13y4.ff");
    test_class_info(&lv, &cd_G16x13y4);
    dp->~G16x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x13y4(Test_G16x13y4, "G16x13y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G16x13y4C1Ev();
extern void _ZN8G16x13y4D1Ev();
Name_Map name_map_G16x13y4[] = {
  NSPAIR(_ZN8G16x13y4C1Ev),
  NSPAIR(_ZN8G16x13y4D1Ev),
  {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_E16x13;
extern VTBL_ENTRY _ZTI6E16x13[];
extern  VTBL_ENTRY _ZTV6E16x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x13y4[] = {
  // 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
    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_E16x13,    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 _ZTI8G16x13y4[];
extern void _ZN6E16x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv)();
extern void ABISELECT(_ZThn24_N6E16x133fooEv,_ZThn20_N6E16x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G16x13y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x13y4[0]),
  (VTBL_ENTRY)&_ZN6E16x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G16x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv),
};
extern VTBL_ENTRY _ZTV8G16x13y4[];
extern void _ZN6E16x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x13__8G16x13y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x13[0]),
  (VTBL_ENTRY)&_ZN6E16x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv)();
extern void ABISELECT(_ZThn24_N6E16x133fooEv,_ZThn20_N6E16x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C16__6E16x13__8G16x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E16x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv),
};
static  VTT_ENTRY vtt_G16x13y4[] = {
  {&(_ZTV8G16x13y4[3]),  3,8},
  {&(_tg__ZTV6E16x13__8G16x13y4[3]),  3,4},
  {&(_tg__ZTV3C16__6E16x13__8G16x13y4[3]),  3,4},
  {&(_ZTV8G16x13y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI8G16x13y4[];
extern  VTBL_ENTRY _ZTV8G16x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x13y4[];
static VTBL_ENTRY alt_thunk_names247[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E16x133fooEv,_ZThn20_N6E16x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E16x133fooEv,_ZThn20_N6E16x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G16x13y4 = {  "G16x13y4", // class name
  bases_G16x13y4, 6,
  &(vtc_G16x13y4[0]), // expected_vtbl_contents
  &(vtt_G16x13y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G16x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x13y4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x13y4),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names247,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x13y5  : virtual E16x13 , F0 {
  int ff;
  ~G16x13y5(); // tgen
  G16x13y5(); // tgen
};
//SIG(1 G16x13y5) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G16x13y5 ::~G16x13y5(){ note_dtor("G16x13y5", this);} // tgen
G16x13y5 ::G16x13y5(){ note_ctor("G16x13y5", this);} // tgen

static void Test_G16x13y5()
{
  extern Class_Descriptor cd_G16x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G16x13y5, buf);
    G16x13y5 *dp, &lv = *(dp=new (buf) G16x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G16x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x13y5)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,28), "G16x13y5");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,32), "G16x13y5");
    check_base_class_offset(lv, (C16*)(E16x13*), ABISELECT(32,24), "G16x13y5");
    check_base_class_offset(lv, (D0*)(E16x13*), ABISELECT(24,16), "G16x13y5");
    check_base_class_offset(lv, (E16x13*), ABISELECT(16,12), "G16x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G16x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x13y5.ff");
    test_class_info(&lv, &cd_G16x13y5);
    dp->~G16x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x13y5(Test_G16x13y5, "G16x13y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G16x13y5C1Ev();
extern void _ZN8G16x13y5D1Ev();
Name_Map name_map_G16x13y5[] = {
  NSPAIR(_ZN8G16x13y5C1Ev),
  NSPAIR(_ZN8G16x13y5D1Ev),
  {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_E16x13;
extern VTBL_ENTRY _ZTI6E16x13[];
extern  VTBL_ENTRY _ZTV6E16x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x13y5[] = {
  // 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
    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(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_E16x13,    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_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 _ZTI8G16x13y5[];
extern void _ZN6E16x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv)();
extern void ABISELECT(_ZThn16_N6E16x133fooEv,_ZThn12_N6E16x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G16x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x13y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G16x13y5[0]),
  (VTBL_ENTRY)&_ZN6E16x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G16x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv),
};
extern VTBL_ENTRY _ZTV8G16x13y5[];
extern void _ZN6E16x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x13__8G16x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x13[0]),
  (VTBL_ENTRY)&_ZN6E16x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv)();
extern void ABISELECT(_ZThn16_N6E16x133fooEv,_ZThn12_N6E16x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C16__6E16x13__8G16x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E16x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv),
};
static  VTT_ENTRY vtt_G16x13y5[] = {
  {&(_ZTV8G16x13y5[4]),  4,13},
  {&(_ZTV8G16x13y5[8]),  8,13},
  {&(_ZTV8G16x13y5[12]),  12,13},
  {&(_tg__ZTV6E16x13__8G16x13y5[3]),  3,4},
  {&(_tg__ZTV3C16__6E16x13__8G16x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G16x13y5[];
extern  VTBL_ENTRY _ZTV8G16x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x13y5[];
static VTBL_ENTRY alt_thunk_names248[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x133fooEv,_ZThn12_N6E16x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x133fooEv,_ZThn12_N6E16x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G16x13y5 = {  "G16x13y5", // class name
  bases_G16x13y5, 6,
  &(vtc_G16x13y5[0]), // expected_vtbl_contents
  &(vtt_G16x13y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G16x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x13y5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x13y5),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names248,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x13y6  : E16x13 , virtual F0 {
  int ff;
  ~G16x13y6(); // tgen
  G16x13y6(); // tgen
};
//SIG(1 G16x13y6) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G16x13y6 ::~G16x13y6(){ note_dtor("G16x13y6", this);} // tgen
G16x13y6 ::G16x13y6(){ note_ctor("G16x13y6", this);} // tgen

static void Test_G16x13y6()
{
  extern Class_Descriptor cd_G16x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x13y6, buf);
    G16x13y6 *dp, &lv = *(dp=new (buf) G16x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x13y6)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(32,20), "G16x13y6");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(36,24), "G16x13y6");
    check_base_class_offset(lv, (C16*)(E16x13*), ABISELECT(24,16), "G16x13y6");
    check_base_class_offset(lv, (D0*)(E16x13*), ABISELECT(8,4), "G16x13y6");
    check_base_class_offset(lv, (E16x13*), 0, "G16x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G16x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G16x13y6.ff");
    test_class_info(&lv, &cd_G16x13y6);
    dp->~G16x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x13y6(Test_G16x13y6, "G16x13y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G16x13y6C1Ev();
extern void _ZN8G16x13y6D1Ev();
Name_Map name_map_G16x13y6[] = {
  NSPAIR(_ZN8G16x13y6C1Ev),
  NSPAIR(_ZN8G16x13y6D1Ev),
  {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_E16x13;
extern VTBL_ENTRY _ZTI6E16x13[];
extern  VTBL_ENTRY _ZTV6E16x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x13y6[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E16x13,    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 _ZTI8G16x13y6[];
extern void _ZN6E16x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv)();
extern void ABISELECT(_ZThn24_N6E16x133fooEv,_ZThn16_N6E16x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G16x13y6[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x13y6[0]),
  (VTBL_ENTRY)&_ZN6E16x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G16x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv),
};
extern VTBL_ENTRY _ZTV8G16x13y6[];
extern void _ZN6E16x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x13__8G16x13y6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x13[0]),
  (VTBL_ENTRY)&_ZN6E16x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv)();
extern void ABISELECT(_ZThn24_N6E16x133fooEv,_ZThn16_N6E16x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C16__6E16x13__8G16x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E16x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv),
};
static  VTT_ENTRY vtt_G16x13y6[] = {
  {&(_ZTV8G16x13y6[4]),  4,9},
  {&(_tg__ZTV6E16x13__8G16x13y6[3]),  3,4},
  {&(_tg__ZTV3C16__6E16x13__8G16x13y6[3]),  3,4},
  {&(_ZTV8G16x13y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G16x13y6[];
extern  VTBL_ENTRY _ZTV8G16x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x13y6[];
static VTBL_ENTRY alt_thunk_names249[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E16x133fooEv,_ZThn16_N6E16x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E16x133fooEv,_ZThn16_N6E16x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G16x13y6 = {  "G16x13y6", // class name
  bases_G16x13y6, 6,
  &(vtc_G16x13y6[0]), // expected_vtbl_contents
  &(vtt_G16x13y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G16x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x13y6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x13y6),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names249,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x13y7  : virtual E16x13 , virtual F0 {
  int ff;
  ~G16x13y7(); // tgen
  G16x13y7(); // tgen
};
//SIG(1 G16x13y7) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G16x13y7 ::~G16x13y7(){ note_dtor("G16x13y7", this);} // tgen
G16x13y7 ::G16x13y7(){ note_ctor("G16x13y7", this);} // tgen

static void Test_G16x13y7()
{
  extern Class_Descriptor cd_G16x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G16x13y7, buf);
    G16x13y7 *dp, &lv = *(dp=new (buf) G16x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G16x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x13y7)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,24), "G16x13y7");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,28), "G16x13y7");
    check_base_class_offset(lv, (C16*)(E16x13*), ABISELECT(32,20), "G16x13y7");
    check_base_class_offset(lv, (D0*)(E16x13*), ABISELECT(24,12), "G16x13y7");
    check_base_class_offset(lv, (E16x13*), ABISELECT(16,8), "G16x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G16x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G16x13y7.ff");
    test_class_info(&lv, &cd_G16x13y7);
    dp->~G16x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x13y7(Test_G16x13y7, "G16x13y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G16x13y7C1Ev();
extern void _ZN8G16x13y7D1Ev();
Name_Map name_map_G16x13y7[] = {
  NSPAIR(_ZN8G16x13y7C1Ev),
  NSPAIR(_ZN8G16x13y7D1Ev),
  {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_E16x13;
extern VTBL_ENTRY _ZTI6E16x13[];
extern  VTBL_ENTRY _ZTV6E16x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x13y7[] = {
  // 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(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_E16x13,    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_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 _ZTI8G16x13y7[];
extern void _ZN6E16x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv)();
extern void ABISELECT(_ZThn16_N6E16x133fooEv,_ZThn12_N6E16x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G16x13y7[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x13y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G16x13y7[0]),
  (VTBL_ENTRY)&_ZN6E16x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G16x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv),
};
extern VTBL_ENTRY _ZTV8G16x13y7[];
extern void _ZN6E16x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x13__8G16x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x13[0]),
  (VTBL_ENTRY)&_ZN6E16x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv)();
extern void ABISELECT(_ZThn16_N6E16x133fooEv,_ZThn12_N6E16x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C16__6E16x13__8G16x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E16x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv),
};
static  VTT_ENTRY vtt_G16x13y7[] = {
  {&(_ZTV8G16x13y7[5]),  5,14},
  {&(_ZTV8G16x13y7[9]),  9,14},
  {&(_ZTV8G16x13y7[13]),  13,14},
  {&(_tg__ZTV6E16x13__8G16x13y7[3]),  3,4},
  {&(_tg__ZTV3C16__6E16x13__8G16x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G16x13y7[];
extern  VTBL_ENTRY _ZTV8G16x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x13y7[];
static VTBL_ENTRY alt_thunk_names250[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E16x133fooEv,_ZTv0_n12_N6E16x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x133fooEv,_ZThn12_N6E16x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x133fooEv,_ZThn12_N6E16x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G16x13y7 = {  "G16x13y7", // class name
  bases_G16x13y7, 6,
  &(vtc_G16x13y7[0]), // expected_vtbl_contents
  &(vtt_G16x13y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G16x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x13y7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x13y7),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names250,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E17x13  : virtual C17 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E17x133fooEv
  ~E17x13(); // tgen
  E17x13(); // tgen
};
//SIG(-1 E17x13) C1{ VBC2{ BC3{ v1 Fi} BC4{ Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E17x13 ::foo(){vfunc_called(this, "_ZN6E17x133fooEv");}
E17x13 ::~E17x13(){ note_dtor("E17x13", this);} // tgen
E17x13 ::E17x13(){ note_ctor("E17x13", this);} // tgen

static void Test_E17x13()
{
  extern Class_Descriptor cd_E17x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E17x13, buf);
    E17x13 *dp, &lv = *(dp=new (buf) E17x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E17x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E17x13)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(16,12), "E17x13");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(28,20), "E17x13");
    check_base_class_offset(lv, (C17*), ABISELECT(16,12), "E17x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E17x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E17x13.fd");
    test_class_info(&lv, &cd_E17x13);
    dp->~E17x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE17x13(Test_E17x13, "E17x13", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E17x13C1Ev();
extern void _ZN6E17x13D1Ev();
Name_Map name_map_E17x13[] = {
  NSPAIR(_ZN6E17x13C1Ev),
  NSPAIR(_ZN6E17x13D1Ev),
  {0,0}
};
extern Class_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_E17x13[] = {
  // 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)
    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 _ZTI6E17x13[];
extern void _ZN6E17x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv)();
extern void ABISELECT(_ZThn16_N6E17x133fooEv,_ZThn12_N6E17x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E17x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x13[0]),
  (VTBL_ENTRY)&_ZN6E17x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E17x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv),
};
extern VTBL_ENTRY _ZTV6E17x13[];
static  VTT_ENTRY vtt_E17x13[] = {
  {&(_ZTV6E17x13[3]),  3,8},
  {&(_ZTV6E17x13[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6E17x13[];
extern  VTBL_ENTRY _ZTV6E17x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x13[];
static VTBL_ENTRY alt_thunk_names251[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x133fooEv,_ZThn12_N6E17x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E17x13 = {  "E17x13", // class name
  bases_E17x13, 4,
  &(vtc_E17x13[0]), // expected_vtbl_contents
  &(vtt_E17x13[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E17x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E17x13),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E17x13),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names251,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x13y0  : E17x13 , F1 {
  int ff;
  ~G17x13y0(); // tgen
  G17x13y0(); // tgen
};
//SIG(1 G17x13y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G17x13y0 ::~G17x13y0(){ note_dtor("G17x13y0", this);} // tgen
G17x13y0 ::G17x13y0(){ note_ctor("G17x13y0", this);} // tgen

static void Test_G17x13y0()
{
  extern Class_Descriptor cd_G17x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G17x13y0, buf);
    G17x13y0 *dp, &lv = *(dp=new (buf) G17x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G17x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x13y0)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,24), "G17x13y0");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,32), "G17x13y0");
    check_base_class_offset(lv, (C17*)(E17x13*), ABISELECT(32,24), "G17x13y0");
    check_base_class_offset(lv, (D0*)(E17x13*), ABISELECT(8,4), "G17x13y0");
    check_base_class_offset(lv, (E17x13*), 0, "G17x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G17x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G17x13y0.ff");
    test_class_info(&lv, &cd_G17x13y0);
    dp->~G17x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x13y0(Test_G17x13y0, "G17x13y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G17x13y0C1Ev();
extern void _ZN8G17x13y0D1Ev();
Name_Map name_map_G17x13y0[] = {
  NSPAIR(_ZN8G17x13y0C1Ev),
  NSPAIR(_ZN8G17x13y0D1Ev),
  {0,0}
};
extern Class_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_E17x13;
extern VTBL_ENTRY _ZTI6E17x13[];
extern  VTBL_ENTRY _ZTV6E17x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x13y0[] = {
  // 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)
    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_E17x13,    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
    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 _ZTI8G17x13y0[];
extern void _ZN6E17x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv)();
extern void ABISELECT(_ZThn32_N6E17x133fooEv,_ZThn24_N6E17x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G17x13y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x13y0[0]),
  (VTBL_ENTRY)&_ZN6E17x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G17x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G17x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv),
};
extern VTBL_ENTRY _ZTV8G17x13y0[];
extern void _ZN6E17x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x13__8G17x13y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x13[0]),
  (VTBL_ENTRY)&_ZN6E17x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv)();
extern void ABISELECT(_ZThn32_N6E17x133fooEv,_ZThn24_N6E17x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C17__6E17x13__8G17x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E17x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv),
};
static  VTT_ENTRY vtt_G17x13y0[] = {
  {&(_ZTV8G17x13y0[3]),  3,11},
  {&(_tg__ZTV6E17x13__8G17x13y0[3]),  3,4},
  {&(_tg__ZTV3C17__6E17x13__8G17x13y0[3]),  3,4},
  {&(_ZTV8G17x13y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI8G17x13y0[];
extern  VTBL_ENTRY _ZTV8G17x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x13y0[];
static VTBL_ENTRY alt_thunk_names252[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E17x133fooEv,_ZThn24_N6E17x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E17x133fooEv,_ZThn24_N6E17x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G17x13y0 = {  "G17x13y0", // class name
  bases_G17x13y0, 6,
  &(vtc_G17x13y0[0]), // expected_vtbl_contents
  &(vtt_G17x13y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G17x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x13y0),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x13y0),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names252,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x13y1  : virtual E17x13 , F1 {
  int ff;
  ~G17x13y1(); // tgen
  G17x13y1(); // tgen
};
//SIG(1 G17x13y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G17x13y1 ::~G17x13y1(){ note_dtor("G17x13y1", this);} // tgen
G17x13y1 ::G17x13y1(){ note_ctor("G17x13y1", this);} // tgen

static void Test_G17x13y1()
{
  extern Class_Descriptor cd_G17x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G17x13y1, buf);
    G17x13y1 *dp, &lv = *(dp=new (buf) G17x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G17x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x13y1)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,24), "G17x13y1");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,32), "G17x13y1");
    check_base_class_offset(lv, (C17*)(E17x13*), ABISELECT(32,24), "G17x13y1");
    check_base_class_offset(lv, (D0*)(E17x13*), ABISELECT(24,16), "G17x13y1");
    check_base_class_offset(lv, (E17x13*), ABISELECT(16,12), "G17x13y1");
    check_base_class_offset(lv, (F1*), 0, "G17x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x13y1.ff");
    test_class_info(&lv, &cd_G17x13y1);
    dp->~G17x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x13y1(Test_G17x13y1, "G17x13y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G17x13y1C1Ev();
extern void _ZN8G17x13y1D1Ev();
Name_Map name_map_G17x13y1[] = {
  NSPAIR(_ZN8G17x13y1C1Ev),
  NSPAIR(_ZN8G17x13y1D1Ev),
  {0,0}
};
extern Class_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_E17x13;
extern VTBL_ENTRY _ZTI6E17x13[];
extern  VTBL_ENTRY _ZTV6E17x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x13y1[] = {
  // 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
    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(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_E17x13,    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 _ZTI8G17x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E17x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv)();
extern void ABISELECT(_ZThn16_N6E17x133fooEv,_ZThn12_N6E17x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G17x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G17x13y1[0]),
  (VTBL_ENTRY)&_ZN6E17x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G17x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv),
};
extern VTBL_ENTRY _ZTV8G17x13y1[];
extern void _ZN6E17x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x13__8G17x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x13[0]),
  (VTBL_ENTRY)&_ZN6E17x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv)();
extern void ABISELECT(_ZThn16_N6E17x133fooEv,_ZThn12_N6E17x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C17__6E17x13__8G17x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E17x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv),
};
static  VTT_ENTRY vtt_G17x13y1[] = {
  {&(_ZTV8G17x13y1[4]),  4,14},
  {&(_ZTV8G17x13y1[9]),  9,14},
  {&(_ZTV8G17x13y1[13]),  13,14},
  {&(_tg__ZTV6E17x13__8G17x13y1[3]),  3,4},
  {&(_tg__ZTV3C17__6E17x13__8G17x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G17x13y1[];
extern  VTBL_ENTRY _ZTV8G17x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x13y1[];
static VTBL_ENTRY alt_thunk_names253[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x133fooEv,_ZThn12_N6E17x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x133fooEv,_ZThn12_N6E17x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G17x13y1 = {  "G17x13y1", // class name
  bases_G17x13y1, 6,
  &(vtc_G17x13y1[0]), // expected_vtbl_contents
  &(vtt_G17x13y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G17x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x13y1),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x13y1),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names253,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x13y2  : E17x13 , virtual F1 {
  int ff;
  ~G17x13y2(); // tgen
  G17x13y2(); // tgen
};
//SIG(1 G17x13y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G17x13y2 ::~G17x13y2(){ note_dtor("G17x13y2", this);} // tgen
G17x13y2 ::G17x13y2(){ note_ctor("G17x13y2", this);} // tgen

static void Test_G17x13y2()
{
  extern Class_Descriptor cd_G17x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G17x13y2, buf);
    G17x13y2 *dp, &lv = *(dp=new (buf) G17x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G17x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x13y2)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(24,16), "G17x13y2");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(36,24), "G17x13y2");
    check_base_class_offset(lv, (C17*)(E17x13*), ABISELECT(24,16), "G17x13y2");
    check_base_class_offset(lv, (D0*)(E17x13*), ABISELECT(8,4), "G17x13y2");
    check_base_class_offset(lv, (E17x13*), 0, "G17x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G17x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G17x13y2.ff");
    test_class_info(&lv, &cd_G17x13y2);
    dp->~G17x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x13y2(Test_G17x13y2, "G17x13y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G17x13y2C1Ev();
extern void _ZN8G17x13y2D1Ev();
Name_Map name_map_G17x13y2[] = {
  NSPAIR(_ZN8G17x13y2C1Ev),
  NSPAIR(_ZN8G17x13y2D1Ev),
  {0,0}
};
extern Class_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_E17x13;
extern VTBL_ENTRY _ZTI6E17x13[];
extern  VTBL_ENTRY _ZTV6E17x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x13y2[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E17x13,    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)
    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 _ZTI8G17x13y2[];
extern void _ZN6E17x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv)();
extern void ABISELECT(_ZThn24_N6E17x133fooEv,_ZThn16_N6E17x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x13y2[] = {
  ABISELECT(48,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x13y2[0]),
  (VTBL_ENTRY)&_ZN6E17x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G17x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G17x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G17x13y2[];
extern void _ZN6E17x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x13__8G17x13y2[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x13[0]),
  (VTBL_ENTRY)&_ZN6E17x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv)();
extern void ABISELECT(_ZThn24_N6E17x133fooEv,_ZThn16_N6E17x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C17__6E17x13__8G17x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E17x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv),
};
static  VTT_ENTRY vtt_G17x13y2[] = {
  {&(_ZTV8G17x13y2[4]),  4,13},
  {&(_tg__ZTV6E17x13__8G17x13y2[3]),  3,4},
  {&(_tg__ZTV3C17__6E17x13__8G17x13y2[3]),  3,4},
  {&(_ZTV8G17x13y2[8]),  8,13},
  {&(_ZTV8G17x13y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI8G17x13y2[];
extern  VTBL_ENTRY _ZTV8G17x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x13y2[];
static VTBL_ENTRY alt_thunk_names254[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E17x133fooEv,_ZThn16_N6E17x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E17x133fooEv,_ZThn16_N6E17x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G17x13y2 = {  "G17x13y2", // class name
  bases_G17x13y2, 6,
  &(vtc_G17x13y2[0]), // expected_vtbl_contents
  &(vtt_G17x13y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G17x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x13y2),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x13y2),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names254,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x13y3  : virtual E17x13 , virtual F1 {
  int ff;
  ~G17x13y3(); // tgen
  G17x13y3(); // tgen
};
//SIG(1 G17x13y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G17x13y3 ::~G17x13y3(){ note_dtor("G17x13y3", this);} // tgen
G17x13y3 ::G17x13y3(){ note_ctor("G17x13y3", this);} // tgen

static void Test_G17x13y3()
{
  extern Class_Descriptor cd_G17x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G17x13y3, buf);
    G17x13y3 *dp, &lv = *(dp=new (buf) G17x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G17x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x13y3)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,20), "G17x13y3");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,28), "G17x13y3");
    check_base_class_offset(lv, (C17*)(E17x13*), ABISELECT(32,20), "G17x13y3");
    check_base_class_offset(lv, (D0*)(E17x13*), ABISELECT(24,12), "G17x13y3");
    check_base_class_offset(lv, (E17x13*), ABISELECT(16,8), "G17x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G17x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G17x13y3.ff");
    test_class_info(&lv, &cd_G17x13y3);
    dp->~G17x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x13y3(Test_G17x13y3, "G17x13y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G17x13y3C1Ev();
extern void _ZN8G17x13y3D1Ev();
Name_Map name_map_G17x13y3[] = {
  NSPAIR(_ZN8G17x13y3C1Ev),
  NSPAIR(_ZN8G17x13y3D1Ev),
  {0,0}
};
extern Class_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_E17x13;
extern VTBL_ENTRY _ZTI6E17x13[];
extern  VTBL_ENTRY _ZTV6E17x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x13y3[] = {
  // 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(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_E17x13,    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 _ZTI8G17x13y3[];
extern void _ZN6E17x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv)();
extern void ABISELECT(_ZThn16_N6E17x133fooEv,_ZThn12_N6E17x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x13y3[] = {
  ABISELECT(56,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x13y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G17x13y3[0]),
  (VTBL_ENTRY)&_ZN6E17x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G17x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G17x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G17x13y3[];
extern void _ZN6E17x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x13__8G17x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x13[0]),
  (VTBL_ENTRY)&_ZN6E17x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv)();
extern void ABISELECT(_ZThn16_N6E17x133fooEv,_ZThn12_N6E17x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C17__6E17x13__8G17x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E17x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv),
};
static  VTT_ENTRY vtt_G17x13y3[] = {
  {&(_ZTV8G17x13y3[5]),  5,18},
  {&(_ZTV8G17x13y3[9]),  9,18},
  {&(_ZTV8G17x13y3[13]),  13,18},
  {&(_ZTV8G17x13y3[17]),  17,18},
  {&(_tg__ZTV6E17x13__8G17x13y3[3]),  3,4},
  {&(_tg__ZTV3C17__6E17x13__8G17x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G17x13y3[];
extern  VTBL_ENTRY _ZTV8G17x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x13y3[];
static VTBL_ENTRY alt_thunk_names255[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x133fooEv,_ZThn12_N6E17x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x133fooEv,_ZThn12_N6E17x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G17x13y3 = {  "G17x13y3", // class name
  bases_G17x13y3, 6,
  &(vtc_G17x13y3[0]), // expected_vtbl_contents
  &(vtt_G17x13y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G17x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x13y3),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x13y3),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names255,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x13y4  : E17x13 , F0 {
  int ff;
  ~G17x13y4(); // tgen
  G17x13y4(); // tgen
};
//SIG(1 G17x13y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G17x13y4 ::~G17x13y4(){ note_dtor("G17x13y4", this);} // tgen
G17x13y4 ::G17x13y4(){ note_ctor("G17x13y4", this);} // tgen

static void Test_G17x13y4()
{
  extern Class_Descriptor cd_G17x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x13y4, buf);
    G17x13y4 *dp, &lv = *(dp=new (buf) G17x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x13y4)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(24,20), "G17x13y4");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(36,28), "G17x13y4");
    check_base_class_offset(lv, (C17*)(E17x13*), ABISELECT(24,20), "G17x13y4");
    check_base_class_offset(lv, (D0*)(E17x13*), ABISELECT(8,4), "G17x13y4");
    check_base_class_offset(lv, (E17x13*), 0, "G17x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G17x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G17x13y4.ff");
    test_class_info(&lv, &cd_G17x13y4);
    dp->~G17x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x13y4(Test_G17x13y4, "G17x13y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G17x13y4C1Ev();
extern void _ZN8G17x13y4D1Ev();
Name_Map name_map_G17x13y4[] = {
  NSPAIR(_ZN8G17x13y4C1Ev),
  NSPAIR(_ZN8G17x13y4D1Ev),
  {0,0}
};
extern Class_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_E17x13;
extern VTBL_ENTRY _ZTI6E17x13[];
extern  VTBL_ENTRY _ZTV6E17x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x13y4[] = {
  // 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
    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_E17x13,    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 _ZTI8G17x13y4[];
extern void _ZN6E17x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv)();
extern void ABISELECT(_ZThn24_N6E17x133fooEv,_ZThn20_N6E17x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G17x13y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x13y4[0]),
  (VTBL_ENTRY)&_ZN6E17x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G17x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv),
};
extern VTBL_ENTRY _ZTV8G17x13y4[];
extern void _ZN6E17x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x13__8G17x13y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x13[0]),
  (VTBL_ENTRY)&_ZN6E17x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv)();
extern void ABISELECT(_ZThn24_N6E17x133fooEv,_ZThn20_N6E17x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C17__6E17x13__8G17x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E17x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv),
};
static  VTT_ENTRY vtt_G17x13y4[] = {
  {&(_ZTV8G17x13y4[3]),  3,8},
  {&(_tg__ZTV6E17x13__8G17x13y4[3]),  3,4},
  {&(_tg__ZTV3C17__6E17x13__8G17x13y4[3]),  3,4},
  {&(_ZTV8G17x13y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI8G17x13y4[];
extern  VTBL_ENTRY _ZTV8G17x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x13y4[];
static VTBL_ENTRY alt_thunk_names256[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E17x133fooEv,_ZThn20_N6E17x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E17x133fooEv,_ZThn20_N6E17x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G17x13y4 = {  "G17x13y4", // class name
  bases_G17x13y4, 6,
  &(vtc_G17x13y4[0]), // expected_vtbl_contents
  &(vtt_G17x13y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G17x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x13y4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x13y4),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names256,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x13y5  : virtual E17x13 , F0 {
  int ff;
  ~G17x13y5(); // tgen
  G17x13y5(); // tgen
};
//SIG(1 G17x13y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G17x13y5 ::~G17x13y5(){ note_dtor("G17x13y5", this);} // tgen
G17x13y5 ::G17x13y5(){ note_ctor("G17x13y5", this);} // tgen

static void Test_G17x13y5()
{
  extern Class_Descriptor cd_G17x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G17x13y5, buf);
    G17x13y5 *dp, &lv = *(dp=new (buf) G17x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G17x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x13y5)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,24), "G17x13y5");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,32), "G17x13y5");
    check_base_class_offset(lv, (C17*)(E17x13*), ABISELECT(32,24), "G17x13y5");
    check_base_class_offset(lv, (D0*)(E17x13*), ABISELECT(24,16), "G17x13y5");
    check_base_class_offset(lv, (E17x13*), ABISELECT(16,12), "G17x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G17x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x13y5.ff");
    test_class_info(&lv, &cd_G17x13y5);
    dp->~G17x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x13y5(Test_G17x13y5, "G17x13y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G17x13y5C1Ev();
extern void _ZN8G17x13y5D1Ev();
Name_Map name_map_G17x13y5[] = {
  NSPAIR(_ZN8G17x13y5C1Ev),
  NSPAIR(_ZN8G17x13y5D1Ev),
  {0,0}
};
extern Class_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_E17x13;
extern VTBL_ENTRY _ZTI6E17x13[];
extern  VTBL_ENTRY _ZTV6E17x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x13y5[] = {
  // 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
    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(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_E17x13,    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 _ZTI8G17x13y5[];
extern void _ZN6E17x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv)();
extern void ABISELECT(_ZThn16_N6E17x133fooEv,_ZThn12_N6E17x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G17x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x13y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G17x13y5[0]),
  (VTBL_ENTRY)&_ZN6E17x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G17x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv),
};
extern VTBL_ENTRY _ZTV8G17x13y5[];
extern void _ZN6E17x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x13__8G17x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x13[0]),
  (VTBL_ENTRY)&_ZN6E17x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv)();
extern void ABISELECT(_ZThn16_N6E17x133fooEv,_ZThn12_N6E17x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C17__6E17x13__8G17x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E17x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv),
};
static  VTT_ENTRY vtt_G17x13y5[] = {
  {&(_ZTV8G17x13y5[4]),  4,13},
  {&(_ZTV8G17x13y5[8]),  8,13},
  {&(_ZTV8G17x13y5[12]),  12,13},
  {&(_tg__ZTV6E17x13__8G17x13y5[3]),  3,4},
  {&(_tg__ZTV3C17__6E17x13__8G17x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G17x13y5[];
extern  VTBL_ENTRY _ZTV8G17x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x13y5[];
static VTBL_ENTRY alt_thunk_names257[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x133fooEv,_ZThn12_N6E17x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x133fooEv,_ZThn12_N6E17x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G17x13y5 = {  "G17x13y5", // class name
  bases_G17x13y5, 6,
  &(vtc_G17x13y5[0]), // expected_vtbl_contents
  &(vtt_G17x13y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G17x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x13y5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x13y5),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names257,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x13y6  : E17x13 , virtual F0 {
  int ff;
  ~G17x13y6(); // tgen
  G17x13y6(); // tgen
};
//SIG(1 G17x13y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G17x13y6 ::~G17x13y6(){ note_dtor("G17x13y6", this);} // tgen
G17x13y6 ::G17x13y6(){ note_ctor("G17x13y6", this);} // tgen

static void Test_G17x13y6()
{
  extern Class_Descriptor cd_G17x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x13y6, buf);
    G17x13y6 *dp, &lv = *(dp=new (buf) G17x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x13y6)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(24,16), "G17x13y6");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(36,24), "G17x13y6");
    check_base_class_offset(lv, (C17*)(E17x13*), ABISELECT(24,16), "G17x13y6");
    check_base_class_offset(lv, (D0*)(E17x13*), ABISELECT(8,4), "G17x13y6");
    check_base_class_offset(lv, (E17x13*), 0, "G17x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G17x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G17x13y6.ff");
    test_class_info(&lv, &cd_G17x13y6);
    dp->~G17x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x13y6(Test_G17x13y6, "G17x13y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G17x13y6C1Ev();
extern void _ZN8G17x13y6D1Ev();
Name_Map name_map_G17x13y6[] = {
  NSPAIR(_ZN8G17x13y6C1Ev),
  NSPAIR(_ZN8G17x13y6D1Ev),
  {0,0}
};
extern Class_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_E17x13;
extern VTBL_ENTRY _ZTI6E17x13[];
extern  VTBL_ENTRY _ZTV6E17x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x13y6[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E17x13,    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 _ZTI8G17x13y6[];
extern void _ZN6E17x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv)();
extern void ABISELECT(_ZThn24_N6E17x133fooEv,_ZThn16_N6E17x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G17x13y6[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x13y6[0]),
  (VTBL_ENTRY)&_ZN6E17x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G17x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv),
};
extern VTBL_ENTRY _ZTV8G17x13y6[];
extern void _ZN6E17x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x13__8G17x13y6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x13[0]),
  (VTBL_ENTRY)&_ZN6E17x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv)();
extern void ABISELECT(_ZThn24_N6E17x133fooEv,_ZThn16_N6E17x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C17__6E17x13__8G17x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E17x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv),
};
static  VTT_ENTRY vtt_G17x13y6[] = {
  {&(_ZTV8G17x13y6[4]),  4,9},
  {&(_tg__ZTV6E17x13__8G17x13y6[3]),  3,4},
  {&(_tg__ZTV3C17__6E17x13__8G17x13y6[3]),  3,4},
  {&(_ZTV8G17x13y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G17x13y6[];
extern  VTBL_ENTRY _ZTV8G17x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x13y6[];
static VTBL_ENTRY alt_thunk_names258[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E17x133fooEv,_ZThn16_N6E17x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E17x133fooEv,_ZThn16_N6E17x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G17x13y6 = {  "G17x13y6", // class name
  bases_G17x13y6, 6,
  &(vtc_G17x13y6[0]), // expected_vtbl_contents
  &(vtt_G17x13y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G17x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x13y6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x13y6),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names258,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x13y7  : virtual E17x13 , virtual F0 {
  int ff;
  ~G17x13y7(); // tgen
  G17x13y7(); // tgen
};
//SIG(1 G17x13y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G17x13y7 ::~G17x13y7(){ note_dtor("G17x13y7", this);} // tgen
G17x13y7 ::G17x13y7(){ note_ctor("G17x13y7", this);} // tgen

static void Test_G17x13y7()
{
  extern Class_Descriptor cd_G17x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G17x13y7, buf);
    G17x13y7 *dp, &lv = *(dp=new (buf) G17x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G17x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x13y7)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,20), "G17x13y7");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,28), "G17x13y7");
    check_base_class_offset(lv, (C17*)(E17x13*), ABISELECT(32,20), "G17x13y7");
    check_base_class_offset(lv, (D0*)(E17x13*), ABISELECT(24,12), "G17x13y7");
    check_base_class_offset(lv, (E17x13*), ABISELECT(16,8), "G17x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G17x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G17x13y7.ff");
    test_class_info(&lv, &cd_G17x13y7);
    dp->~G17x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x13y7(Test_G17x13y7, "G17x13y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G17x13y7C1Ev();
extern void _ZN8G17x13y7D1Ev();
Name_Map name_map_G17x13y7[] = {
  NSPAIR(_ZN8G17x13y7C1Ev),
  NSPAIR(_ZN8G17x13y7D1Ev),
  {0,0}
};
extern Class_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_E17x13;
extern VTBL_ENTRY _ZTI6E17x13[];
extern  VTBL_ENTRY _ZTV6E17x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x13y7[] = {
  // 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(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_E17x13,    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 _ZTI8G17x13y7[];
extern void _ZN6E17x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv)();
extern void ABISELECT(_ZThn16_N6E17x133fooEv,_ZThn12_N6E17x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G17x13y7[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x13y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G17x13y7[0]),
  (VTBL_ENTRY)&_ZN6E17x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G17x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv),
};
extern VTBL_ENTRY _ZTV8G17x13y7[];
extern void _ZN6E17x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x13__8G17x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x13[0]),
  (VTBL_ENTRY)&_ZN6E17x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv)();
extern void ABISELECT(_ZThn16_N6E17x133fooEv,_ZThn12_N6E17x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C17__6E17x13__8G17x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E17x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv),
};
static  VTT_ENTRY vtt_G17x13y7[] = {
  {&(_ZTV8G17x13y7[5]),  5,14},
  {&(_ZTV8G17x13y7[9]),  9,14},
  {&(_ZTV8G17x13y7[13]),  13,14},
  {&(_tg__ZTV6E17x13__8G17x13y7[3]),  3,4},
  {&(_tg__ZTV3C17__6E17x13__8G17x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G17x13y7[];
extern  VTBL_ENTRY _ZTV8G17x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x13y7[];
static VTBL_ENTRY alt_thunk_names259[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E17x133fooEv,_ZTv0_n12_N6E17x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x133fooEv,_ZThn12_N6E17x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x133fooEv,_ZThn12_N6E17x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G17x13y7 = {  "G17x13y7", // class name
  bases_G17x13y7, 6,
  &(vtc_G17x13y7[0]), // expected_vtbl_contents
  &(vtt_G17x13y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G17x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x13y7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x13y7),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names259,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E18x13  : virtual C18 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E18x133fooEv
  ~E18x13(); // tgen
  E18x13(); // tgen
};
//SIG(-1 E18x13) C1{ VBC2{ VBC3{ Fi} BC4{ Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E18x13 ::foo(){vfunc_called(this, "_ZN6E18x133fooEv");}
E18x13 ::~E18x13(){ note_dtor("E18x13", this);} // tgen
E18x13 ::E18x13(){ note_ctor("E18x13", this);} // tgen

static void Test_E18x13()
{
  extern Class_Descriptor cd_E18x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E18x13, buf);
    E18x13 *dp, &lv = *(dp=new (buf) E18x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E18x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E18x13)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(32,24), "E18x13");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(24,16), "E18x13");
    check_base_class_offset(lv, (C18*), ABISELECT(16,12), "E18x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E18x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E18x13.fd");
    test_class_info(&lv, &cd_E18x13);
    dp->~E18x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE18x13(Test_E18x13, "E18x13", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E18x13C1Ev();
extern void _ZN6E18x13D1Ev();
Name_Map name_map_E18x13[] = {
  NSPAIR(_ZN6E18x13C1Ev),
  NSPAIR(_ZN6E18x13D1Ev),
  {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_E18x13[] = {
  // 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
    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 _ZTI6E18x13[];
extern void _ZN6E18x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv)();
extern void ABISELECT(_ZThn16_N6E18x133fooEv,_ZThn12_N6E18x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E18x13[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x13[0]),
  (VTBL_ENTRY)&_ZN6E18x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E18x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv),
};
extern VTBL_ENTRY _ZTV6E18x13[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__6E18x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_E18x13[] = {
  {&(_ZTV6E18x13[4]),  4,10},
  {&(_ZTV6E18x13[9]),  9,10},
  {&(_tg__ZTV3C18__6E18x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E18x13[];
extern  VTBL_ENTRY _ZTV6E18x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x13[];
static VTBL_ENTRY alt_thunk_names260[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x133fooEv,_ZThn12_N6E18x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E18x13 = {  "E18x13", // class name
  bases_E18x13, 4,
  &(vtc_E18x13[0]), // expected_vtbl_contents
  &(vtt_E18x13[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E18x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E18x13),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E18x13),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names260,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x13y0  : E18x13 , F1 {
  int ff;
  ~G18x13y0(); // tgen
  G18x13y0(); // tgen
};
//SIG(1 G18x13y0) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G18x13y0 ::~G18x13y0(){ note_dtor("G18x13y0", this);} // tgen
G18x13y0 ::G18x13y0(){ note_ctor("G18x13y0", this);} // tgen

static void Test_G18x13y0()
{
  extern Class_Descriptor cd_G18x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G18x13y0, buf);
    G18x13y0 *dp, &lv = *(dp=new (buf) G18x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G18x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x13y0)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,36), "G18x13y0");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,28), "G18x13y0");
    check_base_class_offset(lv, (C18*)(E18x13*), ABISELECT(32,24), "G18x13y0");
    check_base_class_offset(lv, (D0*)(E18x13*), ABISELECT(8,4), "G18x13y0");
    check_base_class_offset(lv, (E18x13*), 0, "G18x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G18x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G18x13y0.ff");
    test_class_info(&lv, &cd_G18x13y0);
    dp->~G18x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x13y0(Test_G18x13y0, "G18x13y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G18x13y0C1Ev();
extern void _ZN8G18x13y0D1Ev();
Name_Map name_map_G18x13y0[] = {
  NSPAIR(_ZN8G18x13y0C1Ev),
  NSPAIR(_ZN8G18x13y0D1Ev),
  {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_E18x13;
extern VTBL_ENTRY _ZTI6E18x13[];
extern  VTBL_ENTRY _ZTV6E18x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x13y0[] = {
  // 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
    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_E18x13,    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
    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 _ZTI8G18x13y0[];
extern void _ZN6E18x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv)();
extern void ABISELECT(_ZThn32_N6E18x133fooEv,_ZThn24_N6E18x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G18x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x13y0[0]),
  (VTBL_ENTRY)&_ZN6E18x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G18x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G18x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv),
};
extern VTBL_ENTRY _ZTV8G18x13y0[];
extern void _ZN6E18x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x13__8G18x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x13[0]),
  (VTBL_ENTRY)&_ZN6E18x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv)();
extern void ABISELECT(_ZThn32_N6E18x133fooEv,_ZThn24_N6E18x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C18__6E18x13__8G18x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E18x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__8G18x13y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x13y0[] = {
  {&(_ZTV8G18x13y0[4]),  4,13},
  {&(_tg__ZTV6E18x13__8G18x13y0[4]),  4,5},
  {&(_tg__ZTV3C18__6E18x13__8G18x13y0[4]),  4,5},
  {&(_ZTV8G18x13y0[12]),  12,13},
  {&(_tg__ZTV3C18__8G18x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x13y0[];
extern  VTBL_ENTRY _ZTV8G18x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x13y0[];
static VTBL_ENTRY alt_thunk_names261[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E18x133fooEv,_ZThn24_N6E18x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E18x133fooEv,_ZThn24_N6E18x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G18x13y0 = {  "G18x13y0", // class name
  bases_G18x13y0, 6,
  &(vtc_G18x13y0[0]), // expected_vtbl_contents
  &(vtt_G18x13y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G18x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x13y0),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x13y0),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names261,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x13y1  : virtual E18x13 , F1 {
  int ff;
  ~G18x13y1(); // tgen
  G18x13y1(); // tgen
};
//SIG(1 G18x13y1) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G18x13y1 ::~G18x13y1(){ note_dtor("G18x13y1", this);} // tgen
G18x13y1 ::G18x13y1(){ note_ctor("G18x13y1", this);} // tgen

static void Test_G18x13y1()
{
  extern Class_Descriptor cd_G18x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G18x13y1, buf);
    G18x13y1 *dp, &lv = *(dp=new (buf) G18x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G18x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x13y1)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,36), "G18x13y1");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,28), "G18x13y1");
    check_base_class_offset(lv, (C18*)(E18x13*), ABISELECT(32,24), "G18x13y1");
    check_base_class_offset(lv, (D0*)(E18x13*), ABISELECT(24,16), "G18x13y1");
    check_base_class_offset(lv, (E18x13*), ABISELECT(16,12), "G18x13y1");
    check_base_class_offset(lv, (F1*), 0, "G18x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x13y1.ff");
    test_class_info(&lv, &cd_G18x13y1);
    dp->~G18x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x13y1(Test_G18x13y1, "G18x13y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G18x13y1C1Ev();
extern void _ZN8G18x13y1D1Ev();
Name_Map name_map_G18x13y1[] = {
  NSPAIR(_ZN8G18x13y1C1Ev),
  NSPAIR(_ZN8G18x13y1D1Ev),
  {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_E18x13;
extern VTBL_ENTRY _ZTI6E18x13[];
extern  VTBL_ENTRY _ZTV6E18x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x13y1[] = {
  // 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
    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_E18x13,    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_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 _ZTI8G18x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E18x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv)();
extern void ABISELECT(_ZThn16_N6E18x133fooEv,_ZThn12_N6E18x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G18x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G18x13y1[0]),
  (VTBL_ENTRY)&_ZN6E18x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G18x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv),
};
extern VTBL_ENTRY _ZTV8G18x13y1[];
extern void _ZN6E18x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x13__8G18x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x13[0]),
  (VTBL_ENTRY)&_ZN6E18x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv)();
extern void ABISELECT(_ZThn16_N6E18x133fooEv,_ZThn12_N6E18x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C18__6E18x13__8G18x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E18x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__8G18x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x13y1[] = {
  {&(_ZTV8G18x13y1[5]),  5,17},
  {&(_ZTV8G18x13y1[11]),  11,17},
  {&(_ZTV8G18x13y1[16]),  16,17},
  {&(_tg__ZTV6E18x13__8G18x13y1[4]),  4,5},
  {&(_tg__ZTV3C18__6E18x13__8G18x13y1[4]),  4,5},
  {&(_tg__ZTV3C18__8G18x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x13y1[];
extern  VTBL_ENTRY _ZTV8G18x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x13y1[];
static VTBL_ENTRY alt_thunk_names262[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x133fooEv,_ZThn12_N6E18x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x133fooEv,_ZThn12_N6E18x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G18x13y1 = {  "G18x13y1", // class name
  bases_G18x13y1, 6,
  &(vtc_G18x13y1[0]), // expected_vtbl_contents
  &(vtt_G18x13y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G18x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x13y1),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x13y1),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names262,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x13y2  : E18x13 , virtual F1 {
  int ff;
  ~G18x13y2(); // tgen
  G18x13y2(); // tgen
};
//SIG(1 G18x13y2) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G18x13y2 ::~G18x13y2(){ note_dtor("G18x13y2", this);} // tgen
G18x13y2 ::G18x13y2(){ note_ctor("G18x13y2", this);} // tgen

static void Test_G18x13y2()
{
  extern Class_Descriptor cd_G18x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G18x13y2, buf);
    G18x13y2 *dp, &lv = *(dp=new (buf) G18x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G18x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x13y2)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(40,28), "G18x13y2");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(32,20), "G18x13y2");
    check_base_class_offset(lv, (C18*)(E18x13*), ABISELECT(24,16), "G18x13y2");
    check_base_class_offset(lv, (D0*)(E18x13*), ABISELECT(8,4), "G18x13y2");
    check_base_class_offset(lv, (E18x13*), 0, "G18x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G18x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G18x13y2.ff");
    test_class_info(&lv, &cd_G18x13y2);
    dp->~G18x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x13y2(Test_G18x13y2, "G18x13y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G18x13y2C1Ev();
extern void _ZN8G18x13y2D1Ev();
Name_Map name_map_G18x13y2[] = {
  NSPAIR(_ZN8G18x13y2C1Ev),
  NSPAIR(_ZN8G18x13y2D1Ev),
  {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_E18x13;
extern VTBL_ENTRY _ZTI6E18x13[];
extern  VTBL_ENTRY _ZTV6E18x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x13y2[] = {
  // 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
    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_E18x13,    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
    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 _ZTI8G18x13y2[];
extern void _ZN6E18x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv)();
extern void ABISELECT(_ZThn24_N6E18x133fooEv,_ZThn16_N6E18x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x13y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x13y2[0]),
  (VTBL_ENTRY)&_ZN6E18x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G18x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G18x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G18x13y2[];
extern void _ZN6E18x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x13__8G18x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x13[0]),
  (VTBL_ENTRY)&_ZN6E18x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv)();
extern void ABISELECT(_ZThn24_N6E18x133fooEv,_ZThn16_N6E18x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C18__6E18x13__8G18x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E18x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__8G18x13y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x13y2[] = {
  {&(_ZTV8G18x13y2[5]),  5,15},
  {&(_tg__ZTV6E18x13__8G18x13y2[4]),  4,5},
  {&(_tg__ZTV3C18__6E18x13__8G18x13y2[4]),  4,5},
  {&(_ZTV8G18x13y2[10]),  10,15},
  {&(_ZTV8G18x13y2[14]),  14,15},
  {&(_tg__ZTV3C18__8G18x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x13y2[];
extern  VTBL_ENTRY _ZTV8G18x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x13y2[];
static VTBL_ENTRY alt_thunk_names263[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E18x133fooEv,_ZThn16_N6E18x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E18x133fooEv,_ZThn16_N6E18x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G18x13y2 = {  "G18x13y2", // class name
  bases_G18x13y2, 6,
  &(vtc_G18x13y2[0]), // expected_vtbl_contents
  &(vtt_G18x13y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G18x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x13y2),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x13y2),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names263,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x13y3  : virtual E18x13 , virtual F1 {
  int ff;
  ~G18x13y3(); // tgen
  G18x13y3(); // tgen
};
//SIG(1 G18x13y3) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G18x13y3 ::~G18x13y3(){ note_dtor("G18x13y3", this);} // tgen
G18x13y3 ::G18x13y3(){ note_ctor("G18x13y3", this);} // tgen

static void Test_G18x13y3()
{
  extern Class_Descriptor cd_G18x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G18x13y3, buf);
    G18x13y3 *dp, &lv = *(dp=new (buf) G18x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G18x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x13y3)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,32), "G18x13y3");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,24), "G18x13y3");
    check_base_class_offset(lv, (C18*)(E18x13*), ABISELECT(32,20), "G18x13y3");
    check_base_class_offset(lv, (D0*)(E18x13*), ABISELECT(24,12), "G18x13y3");
    check_base_class_offset(lv, (E18x13*), ABISELECT(16,8), "G18x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G18x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G18x13y3.ff");
    test_class_info(&lv, &cd_G18x13y3);
    dp->~G18x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x13y3(Test_G18x13y3, "G18x13y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G18x13y3C1Ev();
extern void _ZN8G18x13y3D1Ev();
Name_Map name_map_G18x13y3[] = {
  NSPAIR(_ZN8G18x13y3C1Ev),
  NSPAIR(_ZN8G18x13y3D1Ev),
  {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_E18x13;
extern VTBL_ENTRY _ZTI6E18x13[];
extern  VTBL_ENTRY _ZTV6E18x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x13y3[] = {
  // 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
    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_E18x13,    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
    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 _ZTI8G18x13y3[];
extern void _ZN6E18x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv)();
extern void ABISELECT(_ZThn16_N6E18x133fooEv,_ZThn12_N6E18x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x13y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G18x13y3[0]),
  (VTBL_ENTRY)&_ZN6E18x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G18x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G18x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G18x13y3[];
extern void _ZN6E18x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x13__8G18x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x13[0]),
  (VTBL_ENTRY)&_ZN6E18x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv)();
extern void ABISELECT(_ZThn16_N6E18x133fooEv,_ZThn12_N6E18x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C18__6E18x13__8G18x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E18x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__8G18x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x13y3[] = {
  {&(_ZTV8G18x13y3[6]),  6,21},
  {&(_ZTV8G18x13y3[11]),  11,21},
  {&(_ZTV8G18x13y3[16]),  16,21},
  {&(_ZTV8G18x13y3[20]),  20,21},
  {&(_tg__ZTV6E18x13__8G18x13y3[4]),  4,5},
  {&(_tg__ZTV3C18__6E18x13__8G18x13y3[4]),  4,5},
  {&(_tg__ZTV3C18__8G18x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x13y3[];
extern  VTBL_ENTRY _ZTV8G18x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x13y3[];
static VTBL_ENTRY alt_thunk_names264[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x133fooEv,_ZThn12_N6E18x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x133fooEv,_ZThn12_N6E18x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G18x13y3 = {  "G18x13y3", // class name
  bases_G18x13y3, 6,
  &(vtc_G18x13y3[0]), // expected_vtbl_contents
  &(vtt_G18x13y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G18x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x13y3),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x13y3),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names264,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x13y4  : E18x13 , F0 {
  int ff;
  ~G18x13y4(); // tgen
  G18x13y4(); // tgen
};
//SIG(1 G18x13y4) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G18x13y4 ::~G18x13y4(){ note_dtor("G18x13y4", this);} // tgen
G18x13y4 ::G18x13y4(){ note_ctor("G18x13y4", this);} // tgen

static void Test_G18x13y4()
{
  extern Class_Descriptor cd_G18x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x13y4, buf);
    G18x13y4 *dp, &lv = *(dp=new (buf) G18x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x13y4)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(40,32), "G18x13y4");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(32,24), "G18x13y4");
    check_base_class_offset(lv, (C18*)(E18x13*), ABISELECT(24,20), "G18x13y4");
    check_base_class_offset(lv, (D0*)(E18x13*), ABISELECT(8,4), "G18x13y4");
    check_base_class_offset(lv, (E18x13*), 0, "G18x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G18x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G18x13y4.ff");
    test_class_info(&lv, &cd_G18x13y4);
    dp->~G18x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x13y4(Test_G18x13y4, "G18x13y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G18x13y4C1Ev();
extern void _ZN8G18x13y4D1Ev();
Name_Map name_map_G18x13y4[] = {
  NSPAIR(_ZN8G18x13y4C1Ev),
  NSPAIR(_ZN8G18x13y4D1Ev),
  {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_E18x13;
extern VTBL_ENTRY _ZTI6E18x13[];
extern  VTBL_ENTRY _ZTV6E18x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x13y4[] = {
  // 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
    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_E18x13,    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 _ZTI8G18x13y4[];
extern void _ZN6E18x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv)();
extern void ABISELECT(_ZThn24_N6E18x133fooEv,_ZThn20_N6E18x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G18x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x13y4[0]),
  (VTBL_ENTRY)&_ZN6E18x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G18x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv),
};
extern VTBL_ENTRY _ZTV8G18x13y4[];
extern void _ZN6E18x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x13__8G18x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x13[0]),
  (VTBL_ENTRY)&_ZN6E18x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv)();
extern void ABISELECT(_ZThn24_N6E18x133fooEv,_ZThn20_N6E18x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C18__6E18x13__8G18x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E18x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__8G18x13y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x13y4[] = {
  {&(_ZTV8G18x13y4[4]),  4,10},
  {&(_tg__ZTV6E18x13__8G18x13y4[4]),  4,5},
  {&(_tg__ZTV3C18__6E18x13__8G18x13y4[4]),  4,5},
  {&(_ZTV8G18x13y4[9]),  9,10},
  {&(_tg__ZTV3C18__8G18x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x13y4[];
extern  VTBL_ENTRY _ZTV8G18x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x13y4[];
static VTBL_ENTRY alt_thunk_names265[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E18x133fooEv,_ZThn20_N6E18x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E18x133fooEv,_ZThn20_N6E18x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G18x13y4 = {  "G18x13y4", // class name
  bases_G18x13y4, 6,
  &(vtc_G18x13y4[0]), // expected_vtbl_contents
  &(vtt_G18x13y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G18x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x13y4),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x13y4),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names265,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x13y5  : virtual E18x13 , F0 {
  int ff;
  ~G18x13y5(); // tgen
  G18x13y5(); // tgen
};
//SIG(1 G18x13y5) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G18x13y5 ::~G18x13y5(){ note_dtor("G18x13y5", this);} // tgen
G18x13y5 ::G18x13y5(){ note_ctor("G18x13y5", this);} // tgen

static void Test_G18x13y5()
{
  extern Class_Descriptor cd_G18x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G18x13y5, buf);
    G18x13y5 *dp, &lv = *(dp=new (buf) G18x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G18x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x13y5)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,36), "G18x13y5");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,28), "G18x13y5");
    check_base_class_offset(lv, (C18*)(E18x13*), ABISELECT(32,24), "G18x13y5");
    check_base_class_offset(lv, (D0*)(E18x13*), ABISELECT(24,16), "G18x13y5");
    check_base_class_offset(lv, (E18x13*), ABISELECT(16,12), "G18x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G18x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x13y5.ff");
    test_class_info(&lv, &cd_G18x13y5);
    dp->~G18x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x13y5(Test_G18x13y5, "G18x13y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G18x13y5C1Ev();
extern void _ZN8G18x13y5D1Ev();
Name_Map name_map_G18x13y5[] = {
  NSPAIR(_ZN8G18x13y5C1Ev),
  NSPAIR(_ZN8G18x13y5D1Ev),
  {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_E18x13;
extern VTBL_ENTRY _ZTI6E18x13[];
extern  VTBL_ENTRY _ZTV6E18x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x13y5[] = {
  // 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
    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_E18x13,    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_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 _ZTI8G18x13y5[];
extern void _ZN6E18x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv)();
extern void ABISELECT(_ZThn16_N6E18x133fooEv,_ZThn12_N6E18x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G18x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G18x13y5[0]),
  (VTBL_ENTRY)&_ZN6E18x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G18x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv),
};
extern VTBL_ENTRY _ZTV8G18x13y5[];
extern void _ZN6E18x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x13__8G18x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x13[0]),
  (VTBL_ENTRY)&_ZN6E18x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv)();
extern void ABISELECT(_ZThn16_N6E18x133fooEv,_ZThn12_N6E18x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C18__6E18x13__8G18x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E18x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__8G18x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x13y5[] = {
  {&(_ZTV8G18x13y5[5]),  5,16},
  {&(_ZTV8G18x13y5[10]),  10,16},
  {&(_ZTV8G18x13y5[15]),  15,16},
  {&(_tg__ZTV6E18x13__8G18x13y5[4]),  4,5},
  {&(_tg__ZTV3C18__6E18x13__8G18x13y5[4]),  4,5},
  {&(_tg__ZTV3C18__8G18x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x13y5[];
extern  VTBL_ENTRY _ZTV8G18x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x13y5[];
static VTBL_ENTRY alt_thunk_names266[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x133fooEv,_ZThn12_N6E18x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x133fooEv,_ZThn12_N6E18x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G18x13y5 = {  "G18x13y5", // class name
  bases_G18x13y5, 6,
  &(vtc_G18x13y5[0]), // expected_vtbl_contents
  &(vtt_G18x13y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G18x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x13y5),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x13y5),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names266,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x13y6  : E18x13 , virtual F0 {
  int ff;
  ~G18x13y6(); // tgen
  G18x13y6(); // tgen
};
//SIG(1 G18x13y6) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G18x13y6 ::~G18x13y6(){ note_dtor("G18x13y6", this);} // tgen
G18x13y6 ::G18x13y6(){ note_ctor("G18x13y6", this);} // tgen

static void Test_G18x13y6()
{
  extern Class_Descriptor cd_G18x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x13y6, buf);
    G18x13y6 *dp, &lv = *(dp=new (buf) G18x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x13y6)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(40,28), "G18x13y6");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(32,20), "G18x13y6");
    check_base_class_offset(lv, (C18*)(E18x13*), ABISELECT(24,16), "G18x13y6");
    check_base_class_offset(lv, (D0*)(E18x13*), ABISELECT(8,4), "G18x13y6");
    check_base_class_offset(lv, (E18x13*), 0, "G18x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G18x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G18x13y6.ff");
    test_class_info(&lv, &cd_G18x13y6);
    dp->~G18x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x13y6(Test_G18x13y6, "G18x13y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G18x13y6C1Ev();
extern void _ZN8G18x13y6D1Ev();
Name_Map name_map_G18x13y6[] = {
  NSPAIR(_ZN8G18x13y6C1Ev),
  NSPAIR(_ZN8G18x13y6D1Ev),
  {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_E18x13;
extern VTBL_ENTRY _ZTI6E18x13[];
extern  VTBL_ENTRY _ZTV6E18x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x13y6[] = {
  // 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
    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_E18x13,    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 _ZTI8G18x13y6[];
extern void _ZN6E18x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv)();
extern void ABISELECT(_ZThn24_N6E18x133fooEv,_ZThn16_N6E18x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G18x13y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x13y6[0]),
  (VTBL_ENTRY)&_ZN6E18x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G18x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv),
};
extern VTBL_ENTRY _ZTV8G18x13y6[];
extern void _ZN6E18x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x13__8G18x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x13[0]),
  (VTBL_ENTRY)&_ZN6E18x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv)();
extern void ABISELECT(_ZThn24_N6E18x133fooEv,_ZThn16_N6E18x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C18__6E18x13__8G18x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E18x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__8G18x13y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x13y6[] = {
  {&(_ZTV8G18x13y6[5]),  5,11},
  {&(_tg__ZTV6E18x13__8G18x13y6[4]),  4,5},
  {&(_tg__ZTV3C18__6E18x13__8G18x13y6[4]),  4,5},
  {&(_ZTV8G18x13y6[10]),  10,11},
  {&(_tg__ZTV3C18__8G18x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x13y6[];
extern  VTBL_ENTRY _ZTV8G18x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x13y6[];
static VTBL_ENTRY alt_thunk_names267[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E18x133fooEv,_ZThn16_N6E18x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E18x133fooEv,_ZThn16_N6E18x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G18x13y6 = {  "G18x13y6", // class name
  bases_G18x13y6, 6,
  &(vtc_G18x13y6[0]), // expected_vtbl_contents
  &(vtt_G18x13y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G18x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x13y6),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x13y6),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names267,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x13y7  : virtual E18x13 , virtual F0 {
  int ff;
  ~G18x13y7(); // tgen
  G18x13y7(); // tgen
};
//SIG(1 G18x13y7) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G18x13y7 ::~G18x13y7(){ note_dtor("G18x13y7", this);} // tgen
G18x13y7 ::G18x13y7(){ note_ctor("G18x13y7", this);} // tgen

static void Test_G18x13y7()
{
  extern Class_Descriptor cd_G18x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G18x13y7, buf);
    G18x13y7 *dp, &lv = *(dp=new (buf) G18x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G18x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x13y7)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,32), "G18x13y7");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,24), "G18x13y7");
    check_base_class_offset(lv, (C18*)(E18x13*), ABISELECT(32,20), "G18x13y7");
    check_base_class_offset(lv, (D0*)(E18x13*), ABISELECT(24,12), "G18x13y7");
    check_base_class_offset(lv, (E18x13*), ABISELECT(16,8), "G18x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G18x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G18x13y7.ff");
    test_class_info(&lv, &cd_G18x13y7);
    dp->~G18x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x13y7(Test_G18x13y7, "G18x13y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G18x13y7C1Ev();
extern void _ZN8G18x13y7D1Ev();
Name_Map name_map_G18x13y7[] = {
  NSPAIR(_ZN8G18x13y7C1Ev),
  NSPAIR(_ZN8G18x13y7D1Ev),
  {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_E18x13;
extern VTBL_ENTRY _ZTI6E18x13[];
extern  VTBL_ENTRY _ZTV6E18x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x13y7[] = {
  // 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(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_E18x13,    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_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 _ZTI8G18x13y7[];
extern void _ZN6E18x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv)();
extern void ABISELECT(_ZThn16_N6E18x133fooEv,_ZThn12_N6E18x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G18x13y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G18x13y7[0]),
  (VTBL_ENTRY)&_ZN6E18x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G18x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv),
};
extern VTBL_ENTRY _ZTV8G18x13y7[];
extern void _ZN6E18x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x13__8G18x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x13[0]),
  (VTBL_ENTRY)&_ZN6E18x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv)();
extern void ABISELECT(_ZThn16_N6E18x133fooEv,_ZThn12_N6E18x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C18__6E18x13__8G18x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E18x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__8G18x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x13y7[] = {
  {&(_ZTV8G18x13y7[6]),  6,17},
  {&(_ZTV8G18x13y7[11]),  11,17},
  {&(_ZTV8G18x13y7[16]),  16,17},
  {&(_tg__ZTV6E18x13__8G18x13y7[4]),  4,5},
  {&(_tg__ZTV3C18__6E18x13__8G18x13y7[4]),  4,5},
  {&(_tg__ZTV3C18__8G18x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x13y7[];
extern  VTBL_ENTRY _ZTV8G18x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x13y7[];
static VTBL_ENTRY alt_thunk_names268[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E18x133fooEv,_ZTv0_n16_N6E18x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x133fooEv,_ZThn12_N6E18x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x133fooEv,_ZThn12_N6E18x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G18x13y7 = {  "G18x13y7", // class name
  bases_G18x13y7, 6,
  &(vtc_G18x13y7[0]), // expected_vtbl_contents
  &(vtt_G18x13y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G18x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x13y7),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x13y7),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names268,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E19x13  : virtual C19 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E19x133fooEv
  ~E19x13(); // tgen
  E19x13(); // tgen
};
//SIG(-1 E19x13) C1{ VBC2{ VBC3{ v1 Fi} BC4{ Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E19x13 ::foo(){vfunc_called(this, "_ZN6E19x133fooEv");}
E19x13 ::~E19x13(){ note_dtor("E19x13", this);} // tgen
E19x13 ::E19x13(){ note_ctor("E19x13", this);} // tgen

static void Test_E19x13()
{
  extern Class_Descriptor cd_E19x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E19x13, buf);
    E19x13 *dp, &lv = *(dp=new (buf) E19x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E19x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E19x13)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(32,24), "E19x13");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(24,16), "E19x13");
    check_base_class_offset(lv, (C19*), ABISELECT(16,12), "E19x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E19x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E19x13.fd");
    test_class_info(&lv, &cd_E19x13);
    dp->~E19x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE19x13(Test_E19x13, "E19x13", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E19x13C1Ev();
extern void _ZN6E19x13D1Ev();
Name_Map name_map_E19x13[] = {
  NSPAIR(_ZN6E19x13C1Ev),
  NSPAIR(_ZN6E19x13D1Ev),
  {0,0}
};
extern Class_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_E19x13[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    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
    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
    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 _ZTI6E19x13[];
extern void _ZN6E19x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv)();
extern void ABISELECT(_ZThn16_N6E19x133fooEv,_ZThn12_N6E19x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv)();
extern void ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E19x13[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&_ZN6E19x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv),
};
extern VTBL_ENTRY _ZTV6E19x13[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__6E19x13[] = {
  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__6E19x13[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_E19x13[] = {
  {&(_ZTV6E19x13[4]),  4,14},
  {&(_ZTV6E19x13[9]),  9,14},
  {&(_ZTV6E19x13[13]),  13,14},
  {&(_tg__ZTV3C19__6E19x13[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__6E19x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E19x13[];
extern  VTBL_ENTRY _ZTV6E19x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x13[];
static VTBL_ENTRY alt_thunk_names269[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x133fooEv,_ZThn12_N6E19x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E19x13 = {  "E19x13", // class name
  bases_E19x13, 4,
  &(vtc_E19x13[0]), // expected_vtbl_contents
  &(vtt_E19x13[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E19x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E19x13),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E19x13),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names269,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x13y0  : E19x13 , F1 {
  int ff;
  ~G19x13y0(); // tgen
  G19x13y0(); // tgen
};
//SIG(1 G19x13y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G19x13y0 ::~G19x13y0(){ note_dtor("G19x13y0", this);} // tgen
G19x13y0 ::G19x13y0(){ note_ctor("G19x13y0", this);} // tgen

static void Test_G19x13y0()
{
  extern Class_Descriptor cd_G19x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G19x13y0, buf);
    G19x13y0 *dp, &lv = *(dp=new (buf) G19x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G19x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x13y0)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,36), "G19x13y0");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,28), "G19x13y0");
    check_base_class_offset(lv, (C19*)(E19x13*), ABISELECT(32,24), "G19x13y0");
    check_base_class_offset(lv, (D0*)(E19x13*), ABISELECT(8,4), "G19x13y0");
    check_base_class_offset(lv, (E19x13*), 0, "G19x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G19x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G19x13y0.ff");
    test_class_info(&lv, &cd_G19x13y0);
    dp->~G19x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x13y0(Test_G19x13y0, "G19x13y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G19x13y0C1Ev();
extern void _ZN8G19x13y0D1Ev();
Name_Map name_map_G19x13y0[] = {
  NSPAIR(_ZN8G19x13y0C1Ev),
  NSPAIR(_ZN8G19x13y0D1Ev),
  {0,0}
};
extern Class_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_E19x13;
extern VTBL_ENTRY _ZTI6E19x13[];
extern  VTBL_ENTRY _ZTV6E19x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x13y0[] = {
  // 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)
    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
    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_E19x13,    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
    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 _ZTI8G19x13y0[];
extern void _ZN6E19x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv)();
extern void ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv)();
extern void ABISELECT(_ZThn48_N6E19x133fooEv,_ZThn36_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x13y0[0]),
  (VTBL_ENTRY)&_ZN6E19x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G19x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G19x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv),
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G19x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv),
};
extern VTBL_ENTRY _ZTV8G19x13y0[];
extern void _ZN6E19x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x13__8G19x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&_ZN6E19x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv)();
extern void ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C19__6E19x13__8G19x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv)();
extern void ABISELECT(_ZThn48_N6E19x133fooEv,_ZThn36_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x13__8G19x13y0[] = {
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__8G19x13y0[] = {
  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__8G19x13y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x13y0[] = {
  {&(_ZTV8G19x13y0[4]),  4,17},
  {&(_tg__ZTV6E19x13__8G19x13y0[4]),  4,5},
  {&(_tg__ZTV3C19__6E19x13__8G19x13y0[4]),  4,5},
  {&(_tg__ZTV2A1__6E19x13__8G19x13y0[3]),  3,4},
  {&(_ZTV8G19x13y0[12]),  12,17},
  {&(_ZTV8G19x13y0[16]),  16,17},
  {&(_tg__ZTV3C19__8G19x13y0[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__8G19x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x13y0[];
extern  VTBL_ENTRY _ZTV8G19x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x13y0[];
static VTBL_ENTRY alt_thunk_names270[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E19x133fooEv,_ZThn36_N6E19x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E19x133fooEv,_ZThn36_N6E19x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x13y0 = {  "G19x13y0", // class name
  bases_G19x13y0, 6,
  &(vtc_G19x13y0[0]), // expected_vtbl_contents
  &(vtt_G19x13y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G19x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x13y0),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x13y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names270,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x13y1  : virtual E19x13 , F1 {
  int ff;
  ~G19x13y1(); // tgen
  G19x13y1(); // tgen
};
//SIG(1 G19x13y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G19x13y1 ::~G19x13y1(){ note_dtor("G19x13y1", this);} // tgen
G19x13y1 ::G19x13y1(){ note_ctor("G19x13y1", this);} // tgen

static void Test_G19x13y1()
{
  extern Class_Descriptor cd_G19x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G19x13y1, buf);
    G19x13y1 *dp, &lv = *(dp=new (buf) G19x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G19x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x13y1)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,36), "G19x13y1");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,28), "G19x13y1");
    check_base_class_offset(lv, (C19*)(E19x13*), ABISELECT(32,24), "G19x13y1");
    check_base_class_offset(lv, (D0*)(E19x13*), ABISELECT(24,16), "G19x13y1");
    check_base_class_offset(lv, (E19x13*), ABISELECT(16,12), "G19x13y1");
    check_base_class_offset(lv, (F1*), 0, "G19x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x13y1.ff");
    test_class_info(&lv, &cd_G19x13y1);
    dp->~G19x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x13y1(Test_G19x13y1, "G19x13y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G19x13y1C1Ev();
extern void _ZN8G19x13y1D1Ev();
Name_Map name_map_G19x13y1[] = {
  NSPAIR(_ZN8G19x13y1C1Ev),
  NSPAIR(_ZN8G19x13y1D1Ev),
  {0,0}
};
extern Class_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_E19x13;
extern VTBL_ENTRY _ZTI6E19x13[];
extern  VTBL_ENTRY _ZTV6E19x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x13y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    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_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
    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_E19x13,    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_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 _ZTI8G19x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E19x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv)();
extern void ABISELECT(_ZThn16_N6E19x133fooEv,_ZThn12_N6E19x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv)();
extern void ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G19x13y1[0]),
  (VTBL_ENTRY)&_ZN6E19x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G19x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G19x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv),
};
extern VTBL_ENTRY _ZTV8G19x13y1[];
extern void _ZN6E19x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x13__8G19x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&_ZN6E19x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv)();
extern void ABISELECT(_ZThn16_N6E19x133fooEv,_ZThn12_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C19__6E19x13__8G19x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv)();
extern void ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x13__8G19x13y1[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__8G19x13y1[] = {
  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__8G19x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x13y1[] = {
  {&(_ZTV8G19x13y1[5]),  5,21},
  {&(_ZTV8G19x13y1[11]),  11,21},
  {&(_ZTV8G19x13y1[16]),  16,21},
  {&(_ZTV8G19x13y1[20]),  20,21},
  {&(_tg__ZTV6E19x13__8G19x13y1[4]),  4,5},
  {&(_tg__ZTV3C19__6E19x13__8G19x13y1[4]),  4,5},
  {&(_tg__ZTV2A1__6E19x13__8G19x13y1[3]),  3,4},
  {&(_tg__ZTV3C19__8G19x13y1[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__8G19x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x13y1[];
extern  VTBL_ENTRY _ZTV8G19x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x13y1[];
static VTBL_ENTRY alt_thunk_names271[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x133fooEv,_ZThn12_N6E19x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x133fooEv,_ZThn12_N6E19x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x13y1 = {  "G19x13y1", // class name
  bases_G19x13y1, 6,
  &(vtc_G19x13y1[0]), // expected_vtbl_contents
  &(vtt_G19x13y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G19x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x13y1),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x13y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names271,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x13y2  : E19x13 , virtual F1 {
  int ff;
  ~G19x13y2(); // tgen
  G19x13y2(); // tgen
};
//SIG(1 G19x13y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G19x13y2 ::~G19x13y2(){ note_dtor("G19x13y2", this);} // tgen
G19x13y2 ::G19x13y2(){ note_ctor("G19x13y2", this);} // tgen

static void Test_G19x13y2()
{
  extern Class_Descriptor cd_G19x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G19x13y2, buf);
    G19x13y2 *dp, &lv = *(dp=new (buf) G19x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G19x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x13y2)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(40,28), "G19x13y2");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(32,20), "G19x13y2");
    check_base_class_offset(lv, (C19*)(E19x13*), ABISELECT(24,16), "G19x13y2");
    check_base_class_offset(lv, (D0*)(E19x13*), ABISELECT(8,4), "G19x13y2");
    check_base_class_offset(lv, (E19x13*), 0, "G19x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G19x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G19x13y2.ff");
    test_class_info(&lv, &cd_G19x13y2);
    dp->~G19x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x13y2(Test_G19x13y2, "G19x13y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G19x13y2C1Ev();
extern void _ZN8G19x13y2D1Ev();
Name_Map name_map_G19x13y2[] = {
  NSPAIR(_ZN8G19x13y2C1Ev),
  NSPAIR(_ZN8G19x13y2D1Ev),
  {0,0}
};
extern Class_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_E19x13;
extern VTBL_ENTRY _ZTI6E19x13[];
extern  VTBL_ENTRY _ZTV6E19x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x13y2[] = {
  // 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(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
    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_E19x13,    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
    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 _ZTI8G19x13y2[];
extern void _ZN6E19x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv)();
extern void ABISELECT(_ZThn24_N6E19x133fooEv,_ZThn16_N6E19x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv)();
extern void ABISELECT(_ZThn40_N6E19x133fooEv,_ZThn28_N6E19x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G19x13y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x13y2[0]),
  (VTBL_ENTRY)&_ZN6E19x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G19x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G19x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G19x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G19x13y2[];
extern void _ZN6E19x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x13__8G19x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&_ZN6E19x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv)();
extern void ABISELECT(_ZThn24_N6E19x133fooEv,_ZThn16_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C19__6E19x13__8G19x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv)();
extern void ABISELECT(_ZThn40_N6E19x133fooEv,_ZThn28_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x13__8G19x13y2[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__8G19x13y2[] = {
  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__8G19x13y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x13y2[] = {
  {&(_ZTV8G19x13y2[5]),  5,19},
  {&(_tg__ZTV6E19x13__8G19x13y2[4]),  4,5},
  {&(_tg__ZTV3C19__6E19x13__8G19x13y2[4]),  4,5},
  {&(_tg__ZTV2A1__6E19x13__8G19x13y2[3]),  3,4},
  {&(_ZTV8G19x13y2[10]),  10,19},
  {&(_ZTV8G19x13y2[14]),  14,19},
  {&(_ZTV8G19x13y2[18]),  18,19},
  {&(_tg__ZTV3C19__8G19x13y2[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__8G19x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x13y2[];
extern  VTBL_ENTRY _ZTV8G19x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x13y2[];
static VTBL_ENTRY alt_thunk_names272[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E19x133fooEv,_ZThn28_N6E19x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E19x133fooEv,_ZThn28_N6E19x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x133fooEv,_ZThn16_N6E19x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x133fooEv,_ZThn16_N6E19x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x13y2 = {  "G19x13y2", // class name
  bases_G19x13y2, 6,
  &(vtc_G19x13y2[0]), // expected_vtbl_contents
  &(vtt_G19x13y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G19x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x13y2),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x13y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names272,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x13y3  : virtual E19x13 , virtual F1 {
  int ff;
  ~G19x13y3(); // tgen
  G19x13y3(); // tgen
};
//SIG(1 G19x13y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G19x13y3 ::~G19x13y3(){ note_dtor("G19x13y3", this);} // tgen
G19x13y3 ::G19x13y3(){ note_ctor("G19x13y3", this);} // tgen

static void Test_G19x13y3()
{
  extern Class_Descriptor cd_G19x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G19x13y3, buf);
    G19x13y3 *dp, &lv = *(dp=new (buf) G19x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G19x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x13y3)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,32), "G19x13y3");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,24), "G19x13y3");
    check_base_class_offset(lv, (C19*)(E19x13*), ABISELECT(32,20), "G19x13y3");
    check_base_class_offset(lv, (D0*)(E19x13*), ABISELECT(24,12), "G19x13y3");
    check_base_class_offset(lv, (E19x13*), ABISELECT(16,8), "G19x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G19x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G19x13y3.ff");
    test_class_info(&lv, &cd_G19x13y3);
    dp->~G19x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x13y3(Test_G19x13y3, "G19x13y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G19x13y3C1Ev();
extern void _ZN8G19x13y3D1Ev();
Name_Map name_map_G19x13y3[] = {
  NSPAIR(_ZN8G19x13y3C1Ev),
  NSPAIR(_ZN8G19x13y3D1Ev),
  {0,0}
};
extern Class_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_E19x13;
extern VTBL_ENTRY _ZTI6E19x13[];
extern  VTBL_ENTRY _ZTV6E19x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x13y3[] = {
  // 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
    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_E19x13,    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
    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 _ZTI8G19x13y3[];
extern void _ZN6E19x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv)();
extern void ABISELECT(_ZThn16_N6E19x133fooEv,_ZThn12_N6E19x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv)();
extern void ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G19x13y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G19x13y3[0]),
  (VTBL_ENTRY)&_ZN6E19x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G19x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G19x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G19x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G19x13y3[];
extern void _ZN6E19x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x13__8G19x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&_ZN6E19x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv)();
extern void ABISELECT(_ZThn16_N6E19x133fooEv,_ZThn12_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C19__6E19x13__8G19x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv)();
extern void ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x13__8G19x13y3[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__8G19x13y3[] = {
  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__8G19x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x13y3[] = {
  {&(_ZTV8G19x13y3[6]),  6,25},
  {&(_ZTV8G19x13y3[11]),  11,25},
  {&(_ZTV8G19x13y3[16]),  16,25},
  {&(_ZTV8G19x13y3[20]),  20,25},
  {&(_ZTV8G19x13y3[24]),  24,25},
  {&(_tg__ZTV6E19x13__8G19x13y3[4]),  4,5},
  {&(_tg__ZTV3C19__6E19x13__8G19x13y3[4]),  4,5},
  {&(_tg__ZTV2A1__6E19x13__8G19x13y3[3]),  3,4},
  {&(_tg__ZTV3C19__8G19x13y3[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__8G19x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x13y3[];
extern  VTBL_ENTRY _ZTV8G19x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x13y3[];
static VTBL_ENTRY alt_thunk_names273[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x133fooEv,_ZThn12_N6E19x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x133fooEv,_ZThn12_N6E19x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x13y3 = {  "G19x13y3", // class name
  bases_G19x13y3, 6,
  &(vtc_G19x13y3[0]), // expected_vtbl_contents
  &(vtt_G19x13y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G19x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x13y3),25, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x13y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names273,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x13y4  : E19x13 , F0 {
  int ff;
  ~G19x13y4(); // tgen
  G19x13y4(); // tgen
};
//SIG(1 G19x13y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G19x13y4 ::~G19x13y4(){ note_dtor("G19x13y4", this);} // tgen
G19x13y4 ::G19x13y4(){ note_ctor("G19x13y4", this);} // tgen

static void Test_G19x13y4()
{
  extern Class_Descriptor cd_G19x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x13y4, buf);
    G19x13y4 *dp, &lv = *(dp=new (buf) G19x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x13y4)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(40,32), "G19x13y4");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(32,24), "G19x13y4");
    check_base_class_offset(lv, (C19*)(E19x13*), ABISELECT(24,20), "G19x13y4");
    check_base_class_offset(lv, (D0*)(E19x13*), ABISELECT(8,4), "G19x13y4");
    check_base_class_offset(lv, (E19x13*), 0, "G19x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G19x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G19x13y4.ff");
    test_class_info(&lv, &cd_G19x13y4);
    dp->~G19x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x13y4(Test_G19x13y4, "G19x13y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G19x13y4C1Ev();
extern void _ZN8G19x13y4D1Ev();
Name_Map name_map_G19x13y4[] = {
  NSPAIR(_ZN8G19x13y4C1Ev),
  NSPAIR(_ZN8G19x13y4D1Ev),
  {0,0}
};
extern Class_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_E19x13;
extern VTBL_ENTRY _ZTI6E19x13[];
extern  VTBL_ENTRY _ZTV6E19x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x13y4[] = {
  // 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)
    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
    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_E19x13,    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 _ZTI8G19x13y4[];
extern void _ZN6E19x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv)();
extern void ABISELECT(_ZThn24_N6E19x133fooEv,_ZThn20_N6E19x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv)();
extern void ABISELECT(_ZThn40_N6E19x133fooEv,_ZThn32_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x13y4[0]),
  (VTBL_ENTRY)&_ZN6E19x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G19x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv),
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G19x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv),
};
extern VTBL_ENTRY _ZTV8G19x13y4[];
extern void _ZN6E19x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x13__8G19x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&_ZN6E19x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv)();
extern void ABISELECT(_ZThn24_N6E19x133fooEv,_ZThn20_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C19__6E19x13__8G19x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv)();
extern void ABISELECT(_ZThn40_N6E19x133fooEv,_ZThn32_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x13__8G19x13y4[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__8G19x13y4[] = {
  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__8G19x13y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x13y4[] = {
  {&(_ZTV8G19x13y4[4]),  4,14},
  {&(_tg__ZTV6E19x13__8G19x13y4[4]),  4,5},
  {&(_tg__ZTV3C19__6E19x13__8G19x13y4[4]),  4,5},
  {&(_tg__ZTV2A1__6E19x13__8G19x13y4[3]),  3,4},
  {&(_ZTV8G19x13y4[9]),  9,14},
  {&(_ZTV8G19x13y4[13]),  13,14},
  {&(_tg__ZTV3C19__8G19x13y4[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__8G19x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x13y4[];
extern  VTBL_ENTRY _ZTV8G19x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x13y4[];
static VTBL_ENTRY alt_thunk_names274[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E19x133fooEv,_ZThn32_N6E19x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E19x133fooEv,_ZThn32_N6E19x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x133fooEv,_ZThn20_N6E19x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x133fooEv,_ZThn20_N6E19x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x13y4 = {  "G19x13y4", // class name
  bases_G19x13y4, 6,
  &(vtc_G19x13y4[0]), // expected_vtbl_contents
  &(vtt_G19x13y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G19x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x13y4),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x13y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names274,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x13y5  : virtual E19x13 , F0 {
  int ff;
  ~G19x13y5(); // tgen
  G19x13y5(); // tgen
};
//SIG(1 G19x13y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G19x13y5 ::~G19x13y5(){ note_dtor("G19x13y5", this);} // tgen
G19x13y5 ::G19x13y5(){ note_ctor("G19x13y5", this);} // tgen

static void Test_G19x13y5()
{
  extern Class_Descriptor cd_G19x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G19x13y5, buf);
    G19x13y5 *dp, &lv = *(dp=new (buf) G19x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G19x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x13y5)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,36), "G19x13y5");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,28), "G19x13y5");
    check_base_class_offset(lv, (C19*)(E19x13*), ABISELECT(32,24), "G19x13y5");
    check_base_class_offset(lv, (D0*)(E19x13*), ABISELECT(24,16), "G19x13y5");
    check_base_class_offset(lv, (E19x13*), ABISELECT(16,12), "G19x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G19x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x13y5.ff");
    test_class_info(&lv, &cd_G19x13y5);
    dp->~G19x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x13y5(Test_G19x13y5, "G19x13y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G19x13y5C1Ev();
extern void _ZN8G19x13y5D1Ev();
Name_Map name_map_G19x13y5[] = {
  NSPAIR(_ZN8G19x13y5C1Ev),
  NSPAIR(_ZN8G19x13y5D1Ev),
  {0,0}
};
extern Class_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_E19x13;
extern VTBL_ENTRY _ZTI6E19x13[];
extern  VTBL_ENTRY _ZTV6E19x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x13y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    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_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
    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_E19x13,    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_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 _ZTI8G19x13y5[];
extern void _ZN6E19x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv)();
extern void ABISELECT(_ZThn16_N6E19x133fooEv,_ZThn12_N6E19x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv)();
extern void ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G19x13y5[0]),
  (VTBL_ENTRY)&_ZN6E19x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G19x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G19x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv),
};
extern VTBL_ENTRY _ZTV8G19x13y5[];
extern void _ZN6E19x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x13__8G19x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&_ZN6E19x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv)();
extern void ABISELECT(_ZThn16_N6E19x133fooEv,_ZThn12_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C19__6E19x13__8G19x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv)();
extern void ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x13__8G19x13y5[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__8G19x13y5[] = {
  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__8G19x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x13y5[] = {
  {&(_ZTV8G19x13y5[5]),  5,20},
  {&(_ZTV8G19x13y5[10]),  10,20},
  {&(_ZTV8G19x13y5[15]),  15,20},
  {&(_ZTV8G19x13y5[19]),  19,20},
  {&(_tg__ZTV6E19x13__8G19x13y5[4]),  4,5},
  {&(_tg__ZTV3C19__6E19x13__8G19x13y5[4]),  4,5},
  {&(_tg__ZTV2A1__6E19x13__8G19x13y5[3]),  3,4},
  {&(_tg__ZTV3C19__8G19x13y5[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__8G19x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x13y5[];
extern  VTBL_ENTRY _ZTV8G19x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x13y5[];
static VTBL_ENTRY alt_thunk_names275[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x133fooEv,_ZThn12_N6E19x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x133fooEv,_ZThn12_N6E19x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x13y5 = {  "G19x13y5", // class name
  bases_G19x13y5, 6,
  &(vtc_G19x13y5[0]), // expected_vtbl_contents
  &(vtt_G19x13y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G19x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x13y5),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x13y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names275,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x13y6  : E19x13 , virtual F0 {
  int ff;
  ~G19x13y6(); // tgen
  G19x13y6(); // tgen
};
//SIG(1 G19x13y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G19x13y6 ::~G19x13y6(){ note_dtor("G19x13y6", this);} // tgen
G19x13y6 ::G19x13y6(){ note_ctor("G19x13y6", this);} // tgen

static void Test_G19x13y6()
{
  extern Class_Descriptor cd_G19x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x13y6, buf);
    G19x13y6 *dp, &lv = *(dp=new (buf) G19x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x13y6)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(40,28), "G19x13y6");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(32,20), "G19x13y6");
    check_base_class_offset(lv, (C19*)(E19x13*), ABISELECT(24,16), "G19x13y6");
    check_base_class_offset(lv, (D0*)(E19x13*), ABISELECT(8,4), "G19x13y6");
    check_base_class_offset(lv, (E19x13*), 0, "G19x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G19x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G19x13y6.ff");
    test_class_info(&lv, &cd_G19x13y6);
    dp->~G19x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x13y6(Test_G19x13y6, "G19x13y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G19x13y6C1Ev();
extern void _ZN8G19x13y6D1Ev();
Name_Map name_map_G19x13y6[] = {
  NSPAIR(_ZN8G19x13y6C1Ev),
  NSPAIR(_ZN8G19x13y6D1Ev),
  {0,0}
};
extern Class_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_E19x13;
extern VTBL_ENTRY _ZTI6E19x13[];
extern  VTBL_ENTRY _ZTV6E19x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x13y6[] = {
  // 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(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
    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_E19x13,    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 _ZTI8G19x13y6[];
extern void _ZN6E19x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv)();
extern void ABISELECT(_ZThn24_N6E19x133fooEv,_ZThn16_N6E19x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv)();
extern void ABISELECT(_ZThn40_N6E19x133fooEv,_ZThn28_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x13y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x13y6[0]),
  (VTBL_ENTRY)&_ZN6E19x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G19x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G19x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv),
};
extern VTBL_ENTRY _ZTV8G19x13y6[];
extern void _ZN6E19x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x13__8G19x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&_ZN6E19x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv)();
extern void ABISELECT(_ZThn24_N6E19x133fooEv,_ZThn16_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C19__6E19x13__8G19x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv)();
extern void ABISELECT(_ZThn40_N6E19x133fooEv,_ZThn28_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x13__8G19x13y6[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__8G19x13y6[] = {
  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__8G19x13y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x13y6[] = {
  {&(_ZTV8G19x13y6[5]),  5,15},
  {&(_tg__ZTV6E19x13__8G19x13y6[4]),  4,5},
  {&(_tg__ZTV3C19__6E19x13__8G19x13y6[4]),  4,5},
  {&(_tg__ZTV2A1__6E19x13__8G19x13y6[3]),  3,4},
  {&(_ZTV8G19x13y6[10]),  10,15},
  {&(_ZTV8G19x13y6[14]),  14,15},
  {&(_tg__ZTV3C19__8G19x13y6[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__8G19x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x13y6[];
extern  VTBL_ENTRY _ZTV8G19x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x13y6[];
static VTBL_ENTRY alt_thunk_names276[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E19x133fooEv,_ZThn28_N6E19x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E19x133fooEv,_ZThn28_N6E19x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x133fooEv,_ZThn16_N6E19x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x133fooEv,_ZThn16_N6E19x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x13y6 = {  "G19x13y6", // class name
  bases_G19x13y6, 6,
  &(vtc_G19x13y6[0]), // expected_vtbl_contents
  &(vtt_G19x13y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G19x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x13y6),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x13y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names276,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x13y7  : virtual E19x13 , virtual F0 {
  int ff;
  ~G19x13y7(); // tgen
  G19x13y7(); // tgen
};
//SIG(1 G19x13y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G19x13y7 ::~G19x13y7(){ note_dtor("G19x13y7", this);} // tgen
G19x13y7 ::G19x13y7(){ note_ctor("G19x13y7", this);} // tgen

static void Test_G19x13y7()
{
  extern Class_Descriptor cd_G19x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G19x13y7, buf);
    G19x13y7 *dp, &lv = *(dp=new (buf) G19x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G19x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x13y7)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,32), "G19x13y7");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,24), "G19x13y7");
    check_base_class_offset(lv, (C19*)(E19x13*), ABISELECT(32,20), "G19x13y7");
    check_base_class_offset(lv, (D0*)(E19x13*), ABISELECT(24,12), "G19x13y7");
    check_base_class_offset(lv, (E19x13*), ABISELECT(16,8), "G19x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G19x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G19x13y7.ff");
    test_class_info(&lv, &cd_G19x13y7);
    dp->~G19x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x13y7(Test_G19x13y7, "G19x13y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G19x13y7C1Ev();
extern void _ZN8G19x13y7D1Ev();
Name_Map name_map_G19x13y7[] = {
  NSPAIR(_ZN8G19x13y7C1Ev),
  NSPAIR(_ZN8G19x13y7D1Ev),
  {0,0}
};
extern Class_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_E19x13;
extern VTBL_ENTRY _ZTI6E19x13[];
extern  VTBL_ENTRY _ZTV6E19x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x13y7[] = {
  // 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(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_E19x13,    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_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 _ZTI8G19x13y7[];
extern void _ZN6E19x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv)();
extern void ABISELECT(_ZThn16_N6E19x133fooEv,_ZThn12_N6E19x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv)();
extern void ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x13y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G19x13y7[0]),
  (VTBL_ENTRY)&_ZN6E19x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G19x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G19x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv),
};
extern VTBL_ENTRY _ZTV8G19x13y7[];
extern void _ZN6E19x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x13__8G19x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&_ZN6E19x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv)();
extern void ABISELECT(_ZThn16_N6E19x133fooEv,_ZThn12_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C19__6E19x13__8G19x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv)();
extern void ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x13__8G19x13y7[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E19x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__8G19x13y7[] = {
  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__8G19x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x13y7[] = {
  {&(_ZTV8G19x13y7[6]),  6,21},
  {&(_ZTV8G19x13y7[11]),  11,21},
  {&(_ZTV8G19x13y7[16]),  16,21},
  {&(_ZTV8G19x13y7[20]),  20,21},
  {&(_tg__ZTV6E19x13__8G19x13y7[4]),  4,5},
  {&(_tg__ZTV3C19__6E19x13__8G19x13y7[4]),  4,5},
  {&(_tg__ZTV2A1__6E19x13__8G19x13y7[3]),  3,4},
  {&(_tg__ZTV3C19__8G19x13y7[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__8G19x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x13y7[];
extern  VTBL_ENTRY _ZTV8G19x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x13y7[];
static VTBL_ENTRY alt_thunk_names277[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x133fooEv,_ZTv0_n12_N6E19x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x133fooEv,_ZThn24_N6E19x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E19x133fooEv,_ZTv0_n16_N6E19x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x133fooEv,_ZThn12_N6E19x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x133fooEv,_ZThn12_N6E19x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x13y7 = {  "G19x13y7", // class name
  bases_G19x13y7, 6,
  &(vtc_G19x13y7[0]), // expected_vtbl_contents
  &(vtt_G19x13y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G19x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x13y7),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x13y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names277,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E20x13  : virtual C20 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E20x133fooEv
  ~E20x13(); // tgen
  E20x13(); // tgen
};
//SIG(-1 E20x13) C1{ VBC2{ BC3{ Fi} BC4{ v1 Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E20x13 ::foo(){vfunc_called(this, "_ZN6E20x133fooEv");}
E20x13 ::~E20x13(){ note_dtor("E20x13", this);} // tgen
E20x13 ::E20x13(){ note_ctor("E20x13", this);} // tgen

static void Test_E20x13()
{
  extern Class_Descriptor cd_E20x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E20x13, buf);
    E20x13 *dp, &lv = *(dp=new (buf) E20x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E20x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E20x13)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(28,20), "E20x13");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(16,12), "E20x13");
    check_base_class_offset(lv, (C20*), ABISELECT(16,12), "E20x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E20x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E20x13.fd");
    test_class_info(&lv, &cd_E20x13);
    dp->~E20x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE20x13(Test_E20x13, "E20x13", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E20x13C1Ev();
extern void _ZN6E20x13D1Ev();
Name_Map name_map_E20x13[] = {
  NSPAIR(_ZN6E20x13C1Ev),
  NSPAIR(_ZN6E20x13D1Ev),
  {0,0}
};
extern Class_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_E20x13[] = {
  // 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)
    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 _ZTI6E20x13[];
extern void _ZN6E20x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv)();
extern void ABISELECT(_ZThn16_N6E20x133fooEv,_ZThn12_N6E20x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E20x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x13[0]),
  (VTBL_ENTRY)&_ZN6E20x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E20x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv),
};
extern VTBL_ENTRY _ZTV6E20x13[];
static  VTT_ENTRY vtt_E20x13[] = {
  {&(_ZTV6E20x13[3]),  3,8},
  {&(_ZTV6E20x13[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6E20x13[];
extern  VTBL_ENTRY _ZTV6E20x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x13[];
static VTBL_ENTRY alt_thunk_names278[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x133fooEv,_ZThn12_N6E20x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E20x13 = {  "E20x13", // class name
  bases_E20x13, 4,
  &(vtc_E20x13[0]), // expected_vtbl_contents
  &(vtt_E20x13[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E20x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E20x13),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E20x13),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names278,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x13y0  : E20x13 , F1 {
  int ff;
  ~G20x13y0(); // tgen
  G20x13y0(); // tgen
};
//SIG(1 G20x13y0) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G20x13y0 ::~G20x13y0(){ note_dtor("G20x13y0", this);} // tgen
G20x13y0 ::G20x13y0(){ note_ctor("G20x13y0", this);} // tgen

static void Test_G20x13y0()
{
  extern Class_Descriptor cd_G20x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G20x13y0, buf);
    G20x13y0 *dp, &lv = *(dp=new (buf) G20x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G20x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x13y0)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,32), "G20x13y0");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,24), "G20x13y0");
    check_base_class_offset(lv, (C20*)(E20x13*), ABISELECT(32,24), "G20x13y0");
    check_base_class_offset(lv, (D0*)(E20x13*), ABISELECT(8,4), "G20x13y0");
    check_base_class_offset(lv, (E20x13*), 0, "G20x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G20x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G20x13y0.ff");
    test_class_info(&lv, &cd_G20x13y0);
    dp->~G20x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x13y0(Test_G20x13y0, "G20x13y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G20x13y0C1Ev();
extern void _ZN8G20x13y0D1Ev();
Name_Map name_map_G20x13y0[] = {
  NSPAIR(_ZN8G20x13y0C1Ev),
  NSPAIR(_ZN8G20x13y0D1Ev),
  {0,0}
};
extern Class_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_E20x13;
extern VTBL_ENTRY _ZTI6E20x13[];
extern  VTBL_ENTRY _ZTV6E20x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x13y0[] = {
  // 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)
    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_E20x13,    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
    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 _ZTI8G20x13y0[];
extern void _ZN6E20x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv)();
extern void ABISELECT(_ZThn32_N6E20x133fooEv,_ZThn24_N6E20x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G20x13y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x13y0[0]),
  (VTBL_ENTRY)&_ZN6E20x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G20x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G20x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv),
};
extern VTBL_ENTRY _ZTV8G20x13y0[];
extern void _ZN6E20x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x13__8G20x13y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x13[0]),
  (VTBL_ENTRY)&_ZN6E20x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv)();
extern void ABISELECT(_ZThn32_N6E20x133fooEv,_ZThn24_N6E20x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C20__6E20x13__8G20x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E20x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv),
};
static  VTT_ENTRY vtt_G20x13y0[] = {
  {&(_ZTV8G20x13y0[3]),  3,11},
  {&(_tg__ZTV6E20x13__8G20x13y0[3]),  3,4},
  {&(_tg__ZTV3C20__6E20x13__8G20x13y0[3]),  3,4},
  {&(_ZTV8G20x13y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI8G20x13y0[];
extern  VTBL_ENTRY _ZTV8G20x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x13y0[];
static VTBL_ENTRY alt_thunk_names279[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E20x133fooEv,_ZThn24_N6E20x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E20x133fooEv,_ZThn24_N6E20x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G20x13y0 = {  "G20x13y0", // class name
  bases_G20x13y0, 6,
  &(vtc_G20x13y0[0]), // expected_vtbl_contents
  &(vtt_G20x13y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G20x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x13y0),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x13y0),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names279,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x13y1  : virtual E20x13 , F1 {
  int ff;
  ~G20x13y1(); // tgen
  G20x13y1(); // tgen
};
//SIG(1 G20x13y1) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G20x13y1 ::~G20x13y1(){ note_dtor("G20x13y1", this);} // tgen
G20x13y1 ::G20x13y1(){ note_ctor("G20x13y1", this);} // tgen

static void Test_G20x13y1()
{
  extern Class_Descriptor cd_G20x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G20x13y1, buf);
    G20x13y1 *dp, &lv = *(dp=new (buf) G20x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G20x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x13y1)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,32), "G20x13y1");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,24), "G20x13y1");
    check_base_class_offset(lv, (C20*)(E20x13*), ABISELECT(32,24), "G20x13y1");
    check_base_class_offset(lv, (D0*)(E20x13*), ABISELECT(24,16), "G20x13y1");
    check_base_class_offset(lv, (E20x13*), ABISELECT(16,12), "G20x13y1");
    check_base_class_offset(lv, (F1*), 0, "G20x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x13y1.ff");
    test_class_info(&lv, &cd_G20x13y1);
    dp->~G20x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x13y1(Test_G20x13y1, "G20x13y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G20x13y1C1Ev();
extern void _ZN8G20x13y1D1Ev();
Name_Map name_map_G20x13y1[] = {
  NSPAIR(_ZN8G20x13y1C1Ev),
  NSPAIR(_ZN8G20x13y1D1Ev),
  {0,0}
};
extern Class_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_E20x13;
extern VTBL_ENTRY _ZTI6E20x13[];
extern  VTBL_ENTRY _ZTV6E20x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x13y1[] = {
  // 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
    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(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_E20x13,    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 _ZTI8G20x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E20x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv)();
extern void ABISELECT(_ZThn16_N6E20x133fooEv,_ZThn12_N6E20x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G20x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G20x13y1[0]),
  (VTBL_ENTRY)&_ZN6E20x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G20x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv),
};
extern VTBL_ENTRY _ZTV8G20x13y1[];
extern void _ZN6E20x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x13__8G20x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x13[0]),
  (VTBL_ENTRY)&_ZN6E20x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv)();
extern void ABISELECT(_ZThn16_N6E20x133fooEv,_ZThn12_N6E20x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C20__6E20x13__8G20x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E20x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv),
};
static  VTT_ENTRY vtt_G20x13y1[] = {
  {&(_ZTV8G20x13y1[4]),  4,14},
  {&(_ZTV8G20x13y1[9]),  9,14},
  {&(_ZTV8G20x13y1[13]),  13,14},
  {&(_tg__ZTV6E20x13__8G20x13y1[3]),  3,4},
  {&(_tg__ZTV3C20__6E20x13__8G20x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G20x13y1[];
extern  VTBL_ENTRY _ZTV8G20x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x13y1[];
static VTBL_ENTRY alt_thunk_names280[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x133fooEv,_ZThn12_N6E20x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x133fooEv,_ZThn12_N6E20x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G20x13y1 = {  "G20x13y1", // class name
  bases_G20x13y1, 6,
  &(vtc_G20x13y1[0]), // expected_vtbl_contents
  &(vtt_G20x13y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G20x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x13y1),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x13y1),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names280,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x13y2  : E20x13 , virtual F1 {
  int ff;
  ~G20x13y2(); // tgen
  G20x13y2(); // tgen
};
//SIG(1 G20x13y2) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G20x13y2 ::~G20x13y2(){ note_dtor("G20x13y2", this);} // tgen
G20x13y2 ::G20x13y2(){ note_ctor("G20x13y2", this);} // tgen

static void Test_G20x13y2()
{
  extern Class_Descriptor cd_G20x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G20x13y2, buf);
    G20x13y2 *dp, &lv = *(dp=new (buf) G20x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G20x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x13y2)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(36,24), "G20x13y2");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(24,16), "G20x13y2");
    check_base_class_offset(lv, (C20*)(E20x13*), ABISELECT(24,16), "G20x13y2");
    check_base_class_offset(lv, (D0*)(E20x13*), ABISELECT(8,4), "G20x13y2");
    check_base_class_offset(lv, (E20x13*), 0, "G20x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G20x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G20x13y2.ff");
    test_class_info(&lv, &cd_G20x13y2);
    dp->~G20x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x13y2(Test_G20x13y2, "G20x13y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G20x13y2C1Ev();
extern void _ZN8G20x13y2D1Ev();
Name_Map name_map_G20x13y2[] = {
  NSPAIR(_ZN8G20x13y2C1Ev),
  NSPAIR(_ZN8G20x13y2D1Ev),
  {0,0}
};
extern Class_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_E20x13;
extern VTBL_ENTRY _ZTI6E20x13[];
extern  VTBL_ENTRY _ZTV6E20x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x13y2[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E20x13,    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)
    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 _ZTI8G20x13y2[];
extern void _ZN6E20x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv)();
extern void ABISELECT(_ZThn24_N6E20x133fooEv,_ZThn16_N6E20x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x13y2[] = {
  ABISELECT(48,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x13y2[0]),
  (VTBL_ENTRY)&_ZN6E20x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G20x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G20x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G20x13y2[];
extern void _ZN6E20x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x13__8G20x13y2[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x13[0]),
  (VTBL_ENTRY)&_ZN6E20x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv)();
extern void ABISELECT(_ZThn24_N6E20x133fooEv,_ZThn16_N6E20x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C20__6E20x13__8G20x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E20x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv),
};
static  VTT_ENTRY vtt_G20x13y2[] = {
  {&(_ZTV8G20x13y2[4]),  4,13},
  {&(_tg__ZTV6E20x13__8G20x13y2[3]),  3,4},
  {&(_tg__ZTV3C20__6E20x13__8G20x13y2[3]),  3,4},
  {&(_ZTV8G20x13y2[8]),  8,13},
  {&(_ZTV8G20x13y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI8G20x13y2[];
extern  VTBL_ENTRY _ZTV8G20x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x13y2[];
static VTBL_ENTRY alt_thunk_names281[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E20x133fooEv,_ZThn16_N6E20x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E20x133fooEv,_ZThn16_N6E20x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G20x13y2 = {  "G20x13y2", // class name
  bases_G20x13y2, 6,
  &(vtc_G20x13y2[0]), // expected_vtbl_contents
  &(vtt_G20x13y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G20x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x13y2),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x13y2),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names281,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x13y3  : virtual E20x13 , virtual F1 {
  int ff;
  ~G20x13y3(); // tgen
  G20x13y3(); // tgen
};
//SIG(1 G20x13y3) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G20x13y3 ::~G20x13y3(){ note_dtor("G20x13y3", this);} // tgen
G20x13y3 ::G20x13y3(){ note_ctor("G20x13y3", this);} // tgen

static void Test_G20x13y3()
{
  extern Class_Descriptor cd_G20x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G20x13y3, buf);
    G20x13y3 *dp, &lv = *(dp=new (buf) G20x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G20x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x13y3)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,28), "G20x13y3");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,20), "G20x13y3");
    check_base_class_offset(lv, (C20*)(E20x13*), ABISELECT(32,20), "G20x13y3");
    check_base_class_offset(lv, (D0*)(E20x13*), ABISELECT(24,12), "G20x13y3");
    check_base_class_offset(lv, (E20x13*), ABISELECT(16,8), "G20x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G20x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G20x13y3.ff");
    test_class_info(&lv, &cd_G20x13y3);
    dp->~G20x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x13y3(Test_G20x13y3, "G20x13y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G20x13y3C1Ev();
extern void _ZN8G20x13y3D1Ev();
Name_Map name_map_G20x13y3[] = {
  NSPAIR(_ZN8G20x13y3C1Ev),
  NSPAIR(_ZN8G20x13y3D1Ev),
  {0,0}
};
extern Class_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_E20x13;
extern VTBL_ENTRY _ZTI6E20x13[];
extern  VTBL_ENTRY _ZTV6E20x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x13y3[] = {
  // 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(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_E20x13,    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 _ZTI8G20x13y3[];
extern void _ZN6E20x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv)();
extern void ABISELECT(_ZThn16_N6E20x133fooEv,_ZThn12_N6E20x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x13y3[] = {
  ABISELECT(56,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x13y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G20x13y3[0]),
  (VTBL_ENTRY)&_ZN6E20x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G20x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G20x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G20x13y3[];
extern void _ZN6E20x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x13__8G20x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x13[0]),
  (VTBL_ENTRY)&_ZN6E20x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv)();
extern void ABISELECT(_ZThn16_N6E20x133fooEv,_ZThn12_N6E20x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C20__6E20x13__8G20x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E20x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv),
};
static  VTT_ENTRY vtt_G20x13y3[] = {
  {&(_ZTV8G20x13y3[5]),  5,18},
  {&(_ZTV8G20x13y3[9]),  9,18},
  {&(_ZTV8G20x13y3[13]),  13,18},
  {&(_ZTV8G20x13y3[17]),  17,18},
  {&(_tg__ZTV6E20x13__8G20x13y3[3]),  3,4},
  {&(_tg__ZTV3C20__6E20x13__8G20x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G20x13y3[];
extern  VTBL_ENTRY _ZTV8G20x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x13y3[];
static VTBL_ENTRY alt_thunk_names282[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x133fooEv,_ZThn12_N6E20x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x133fooEv,_ZThn12_N6E20x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G20x13y3 = {  "G20x13y3", // class name
  bases_G20x13y3, 6,
  &(vtc_G20x13y3[0]), // expected_vtbl_contents
  &(vtt_G20x13y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G20x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x13y3),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x13y3),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names282,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x13y4  : E20x13 , F0 {
  int ff;
  ~G20x13y4(); // tgen
  G20x13y4(); // tgen
};
//SIG(1 G20x13y4) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G20x13y4 ::~G20x13y4(){ note_dtor("G20x13y4", this);} // tgen
G20x13y4 ::G20x13y4(){ note_ctor("G20x13y4", this);} // tgen

static void Test_G20x13y4()
{
  extern Class_Descriptor cd_G20x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x13y4, buf);
    G20x13y4 *dp, &lv = *(dp=new (buf) G20x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x13y4)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(36,28), "G20x13y4");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(24,20), "G20x13y4");
    check_base_class_offset(lv, (C20*)(E20x13*), ABISELECT(24,20), "G20x13y4");
    check_base_class_offset(lv, (D0*)(E20x13*), ABISELECT(8,4), "G20x13y4");
    check_base_class_offset(lv, (E20x13*), 0, "G20x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G20x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G20x13y4.ff");
    test_class_info(&lv, &cd_G20x13y4);
    dp->~G20x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x13y4(Test_G20x13y4, "G20x13y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G20x13y4C1Ev();
extern void _ZN8G20x13y4D1Ev();
Name_Map name_map_G20x13y4[] = {
  NSPAIR(_ZN8G20x13y4C1Ev),
  NSPAIR(_ZN8G20x13y4D1Ev),
  {0,0}
};
extern Class_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_E20x13;
extern VTBL_ENTRY _ZTI6E20x13[];
extern  VTBL_ENTRY _ZTV6E20x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x13y4[] = {
  // 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
    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_E20x13,    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 _ZTI8G20x13y4[];
extern void _ZN6E20x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv)();
extern void ABISELECT(_ZThn24_N6E20x133fooEv,_ZThn20_N6E20x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G20x13y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x13y4[0]),
  (VTBL_ENTRY)&_ZN6E20x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G20x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv),
};
extern VTBL_ENTRY _ZTV8G20x13y4[];
extern void _ZN6E20x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x13__8G20x13y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x13[0]),
  (VTBL_ENTRY)&_ZN6E20x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv)();
extern void ABISELECT(_ZThn24_N6E20x133fooEv,_ZThn20_N6E20x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C20__6E20x13__8G20x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E20x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv),
};
static  VTT_ENTRY vtt_G20x13y4[] = {
  {&(_ZTV8G20x13y4[3]),  3,8},
  {&(_tg__ZTV6E20x13__8G20x13y4[3]),  3,4},
  {&(_tg__ZTV3C20__6E20x13__8G20x13y4[3]),  3,4},
  {&(_ZTV8G20x13y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI8G20x13y4[];
extern  VTBL_ENTRY _ZTV8G20x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x13y4[];
static VTBL_ENTRY alt_thunk_names283[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E20x133fooEv,_ZThn20_N6E20x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E20x133fooEv,_ZThn20_N6E20x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G20x13y4 = {  "G20x13y4", // class name
  bases_G20x13y4, 6,
  &(vtc_G20x13y4[0]), // expected_vtbl_contents
  &(vtt_G20x13y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G20x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x13y4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x13y4),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names283,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x13y5  : virtual E20x13 , F0 {
  int ff;
  ~G20x13y5(); // tgen
  G20x13y5(); // tgen
};
//SIG(1 G20x13y5) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G20x13y5 ::~G20x13y5(){ note_dtor("G20x13y5", this);} // tgen
G20x13y5 ::G20x13y5(){ note_ctor("G20x13y5", this);} // tgen

static void Test_G20x13y5()
{
  extern Class_Descriptor cd_G20x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G20x13y5, buf);
    G20x13y5 *dp, &lv = *(dp=new (buf) G20x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G20x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x13y5)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,32), "G20x13y5");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,24), "G20x13y5");
    check_base_class_offset(lv, (C20*)(E20x13*), ABISELECT(32,24), "G20x13y5");
    check_base_class_offset(lv, (D0*)(E20x13*), ABISELECT(24,16), "G20x13y5");
    check_base_class_offset(lv, (E20x13*), ABISELECT(16,12), "G20x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G20x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x13y5.ff");
    test_class_info(&lv, &cd_G20x13y5);
    dp->~G20x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x13y5(Test_G20x13y5, "G20x13y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G20x13y5C1Ev();
extern void _ZN8G20x13y5D1Ev();
Name_Map name_map_G20x13y5[] = {
  NSPAIR(_ZN8G20x13y5C1Ev),
  NSPAIR(_ZN8G20x13y5D1Ev),
  {0,0}
};
extern Class_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_E20x13;
extern VTBL_ENTRY _ZTI6E20x13[];
extern  VTBL_ENTRY _ZTV6E20x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x13y5[] = {
  // 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
    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(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_E20x13,    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 _ZTI8G20x13y5[];
extern void _ZN6E20x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv)();
extern void ABISELECT(_ZThn16_N6E20x133fooEv,_ZThn12_N6E20x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G20x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x13y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G20x13y5[0]),
  (VTBL_ENTRY)&_ZN6E20x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G20x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv),
};
extern VTBL_ENTRY _ZTV8G20x13y5[];
extern void _ZN6E20x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x13__8G20x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x13[0]),
  (VTBL_ENTRY)&_ZN6E20x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv)();
extern void ABISELECT(_ZThn16_N6E20x133fooEv,_ZThn12_N6E20x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C20__6E20x13__8G20x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E20x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv),
};
static  VTT_ENTRY vtt_G20x13y5[] = {
  {&(_ZTV8G20x13y5[4]),  4,13},
  {&(_ZTV8G20x13y5[8]),  8,13},
  {&(_ZTV8G20x13y5[12]),  12,13},
  {&(_tg__ZTV6E20x13__8G20x13y5[3]),  3,4},
  {&(_tg__ZTV3C20__6E20x13__8G20x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G20x13y5[];
extern  VTBL_ENTRY _ZTV8G20x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x13y5[];
static VTBL_ENTRY alt_thunk_names284[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x133fooEv,_ZThn12_N6E20x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x133fooEv,_ZThn12_N6E20x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G20x13y5 = {  "G20x13y5", // class name
  bases_G20x13y5, 6,
  &(vtc_G20x13y5[0]), // expected_vtbl_contents
  &(vtt_G20x13y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G20x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x13y5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x13y5),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names284,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x13y6  : E20x13 , virtual F0 {
  int ff;
  ~G20x13y6(); // tgen
  G20x13y6(); // tgen
};
//SIG(1 G20x13y6) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G20x13y6 ::~G20x13y6(){ note_dtor("G20x13y6", this);} // tgen
G20x13y6 ::G20x13y6(){ note_ctor("G20x13y6", this);} // tgen

static void Test_G20x13y6()
{
  extern Class_Descriptor cd_G20x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x13y6, buf);
    G20x13y6 *dp, &lv = *(dp=new (buf) G20x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x13y6)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(36,24), "G20x13y6");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(24,16), "G20x13y6");
    check_base_class_offset(lv, (C20*)(E20x13*), ABISELECT(24,16), "G20x13y6");
    check_base_class_offset(lv, (D0*)(E20x13*), ABISELECT(8,4), "G20x13y6");
    check_base_class_offset(lv, (E20x13*), 0, "G20x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G20x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G20x13y6.ff");
    test_class_info(&lv, &cd_G20x13y6);
    dp->~G20x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x13y6(Test_G20x13y6, "G20x13y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G20x13y6C1Ev();
extern void _ZN8G20x13y6D1Ev();
Name_Map name_map_G20x13y6[] = {
  NSPAIR(_ZN8G20x13y6C1Ev),
  NSPAIR(_ZN8G20x13y6D1Ev),
  {0,0}
};
extern Class_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_E20x13;
extern VTBL_ENTRY _ZTI6E20x13[];
extern  VTBL_ENTRY _ZTV6E20x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x13y6[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E20x13,    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 _ZTI8G20x13y6[];
extern void _ZN6E20x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv)();
extern void ABISELECT(_ZThn24_N6E20x133fooEv,_ZThn16_N6E20x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G20x13y6[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x13y6[0]),
  (VTBL_ENTRY)&_ZN6E20x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G20x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv),
};
extern VTBL_ENTRY _ZTV8G20x13y6[];
extern void _ZN6E20x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x13__8G20x13y6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x13[0]),
  (VTBL_ENTRY)&_ZN6E20x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv)();
extern void ABISELECT(_ZThn24_N6E20x133fooEv,_ZThn16_N6E20x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C20__6E20x13__8G20x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E20x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv),
};
static  VTT_ENTRY vtt_G20x13y6[] = {
  {&(_ZTV8G20x13y6[4]),  4,9},
  {&(_tg__ZTV6E20x13__8G20x13y6[3]),  3,4},
  {&(_tg__ZTV3C20__6E20x13__8G20x13y6[3]),  3,4},
  {&(_ZTV8G20x13y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G20x13y6[];
extern  VTBL_ENTRY _ZTV8G20x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x13y6[];
static VTBL_ENTRY alt_thunk_names285[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E20x133fooEv,_ZThn16_N6E20x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E20x133fooEv,_ZThn16_N6E20x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G20x13y6 = {  "G20x13y6", // class name
  bases_G20x13y6, 6,
  &(vtc_G20x13y6[0]), // expected_vtbl_contents
  &(vtt_G20x13y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G20x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x13y6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x13y6),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names285,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x13y7  : virtual E20x13 , virtual F0 {
  int ff;
  ~G20x13y7(); // tgen
  G20x13y7(); // tgen
};
//SIG(1 G20x13y7) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G20x13y7 ::~G20x13y7(){ note_dtor("G20x13y7", this);} // tgen
G20x13y7 ::G20x13y7(){ note_ctor("G20x13y7", this);} // tgen

static void Test_G20x13y7()
{
  extern Class_Descriptor cd_G20x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G20x13y7, buf);
    G20x13y7 *dp, &lv = *(dp=new (buf) G20x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G20x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x13y7)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,28), "G20x13y7");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,20), "G20x13y7");
    check_base_class_offset(lv, (C20*)(E20x13*), ABISELECT(32,20), "G20x13y7");
    check_base_class_offset(lv, (D0*)(E20x13*), ABISELECT(24,12), "G20x13y7");
    check_base_class_offset(lv, (E20x13*), ABISELECT(16,8), "G20x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G20x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G20x13y7.ff");
    test_class_info(&lv, &cd_G20x13y7);
    dp->~G20x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x13y7(Test_G20x13y7, "G20x13y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G20x13y7C1Ev();
extern void _ZN8G20x13y7D1Ev();
Name_Map name_map_G20x13y7[] = {
  NSPAIR(_ZN8G20x13y7C1Ev),
  NSPAIR(_ZN8G20x13y7D1Ev),
  {0,0}
};
extern Class_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_E20x13;
extern VTBL_ENTRY _ZTI6E20x13[];
extern  VTBL_ENTRY _ZTV6E20x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x13y7[] = {
  // 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(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_E20x13,    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 _ZTI8G20x13y7[];
extern void _ZN6E20x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv)();
extern void ABISELECT(_ZThn16_N6E20x133fooEv,_ZThn12_N6E20x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G20x13y7[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x13y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G20x13y7[0]),
  (VTBL_ENTRY)&_ZN6E20x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G20x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv),
};
extern VTBL_ENTRY _ZTV8G20x13y7[];
extern void _ZN6E20x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x13__8G20x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x13[0]),
  (VTBL_ENTRY)&_ZN6E20x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv)();
extern void ABISELECT(_ZThn16_N6E20x133fooEv,_ZThn12_N6E20x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C20__6E20x13__8G20x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E20x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv),
};
static  VTT_ENTRY vtt_G20x13y7[] = {
  {&(_ZTV8G20x13y7[5]),  5,14},
  {&(_ZTV8G20x13y7[9]),  9,14},
  {&(_ZTV8G20x13y7[13]),  13,14},
  {&(_tg__ZTV6E20x13__8G20x13y7[3]),  3,4},
  {&(_tg__ZTV3C20__6E20x13__8G20x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G20x13y7[];
extern  VTBL_ENTRY _ZTV8G20x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x13y7[];
static VTBL_ENTRY alt_thunk_names286[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E20x133fooEv,_ZTv0_n12_N6E20x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x133fooEv,_ZThn12_N6E20x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x133fooEv,_ZThn12_N6E20x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G20x13y7 = {  "G20x13y7", // class name
  bases_G20x13y7, 6,
  &(vtc_G20x13y7[0]), // expected_vtbl_contents
  &(vtt_G20x13y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G20x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x13y7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x13y7),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names286,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E21x13  : virtual C21 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E21x133fooEv
  ~E21x13(); // tgen
  E21x13(); // tgen
};
//SIG(-1 E21x13) C1{ VBC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E21x13 ::foo(){vfunc_called(this, "_ZN6E21x133fooEv");}
E21x13 ::~E21x13(){ note_dtor("E21x13", this);} // tgen
E21x13 ::E21x13(){ note_ctor("E21x13", this);} // tgen

static void Test_E21x13()
{
  extern Class_Descriptor cd_E21x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E21x13, buf);
    E21x13 *dp, &lv = *(dp=new (buf) E21x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E21x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E21x13)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(16,12), "E21x13");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(32,20), "E21x13");
    check_base_class_offset(lv, (C21*), ABISELECT(16,12), "E21x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E21x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E21x13.fd");
    test_class_info(&lv, &cd_E21x13);
    dp->~E21x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE21x13(Test_E21x13, "E21x13", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E21x13C1Ev();
extern void _ZN6E21x13D1Ev();
Name_Map name_map_E21x13[] = {
  NSPAIR(_ZN6E21x13C1Ev),
  NSPAIR(_ZN6E21x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x13[] = {
  // 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)
    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 _ZTI6E21x13[];
extern void _ZN6E21x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv)();
extern void ABISELECT(_ZThn16_N6E21x133fooEv,_ZThn12_N6E21x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv)();
static  VTBL_ENTRY vtc_E21x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&_ZN6E21x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv),
};
extern VTBL_ENTRY _ZTV6E21x13[];
static  VTT_ENTRY vtt_E21x13[] = {
  {&(_ZTV6E21x13[3]),  3,11},
  {&(_ZTV6E21x13[7]),  7,11},
  {&(_ZTV6E21x13[10]),  10,11},
};
extern VTBL_ENTRY _ZTI6E21x13[];
extern  VTBL_ENTRY _ZTV6E21x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x13[];
static VTBL_ENTRY alt_thunk_names287[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x133fooEv,_ZThn12_N6E21x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E21x13 = {  "E21x13", // class name
  bases_E21x13, 4,
  &(vtc_E21x13[0]), // expected_vtbl_contents
  &(vtt_E21x13[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E21x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E21x13),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E21x13),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names287,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x13y0  : E21x13 , F1 {
  int ff;
  ~G21x13y0(); // tgen
  G21x13y0(); // tgen
};
//SIG(1 G21x13y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G21x13y0 ::~G21x13y0(){ note_dtor("G21x13y0", this);} // tgen
G21x13y0 ::G21x13y0(){ note_ctor("G21x13y0", this);} // tgen

static void Test_G21x13y0()
{
  extern Class_Descriptor cd_G21x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G21x13y0, buf);
    G21x13y0 *dp, &lv = *(dp=new (buf) G21x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G21x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x13y0)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,24), "G21x13y0");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,32), "G21x13y0");
    check_base_class_offset(lv, (C21*)(E21x13*), ABISELECT(32,24), "G21x13y0");
    check_base_class_offset(lv, (D0*)(E21x13*), ABISELECT(8,4), "G21x13y0");
    check_base_class_offset(lv, (E21x13*), 0, "G21x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G21x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G21x13y0.ff");
    test_class_info(&lv, &cd_G21x13y0);
    dp->~G21x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x13y0(Test_G21x13y0, "G21x13y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G21x13y0C1Ev();
extern void _ZN8G21x13y0D1Ev();
Name_Map name_map_G21x13y0[] = {
  NSPAIR(_ZN8G21x13y0C1Ev),
  NSPAIR(_ZN8G21x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x13;
extern VTBL_ENTRY _ZTI6E21x13[];
extern  VTBL_ENTRY _ZTV6E21x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x13y0[] = {
  // 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)
    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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E21x13,    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
    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 _ZTI8G21x13y0[];
extern void _ZN6E21x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv)();
extern void ABISELECT(_ZThn32_N6E21x133fooEv,_ZThn24_N6E21x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv)();
static  VTBL_ENTRY vtc_G21x13y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x13y0[0]),
  (VTBL_ENTRY)&_ZN6E21x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G21x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G21x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G21x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv),
};
extern VTBL_ENTRY _ZTV8G21x13y0[];
extern void _ZN6E21x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x13__8G21x13y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&_ZN6E21x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv)();
extern void ABISELECT(_ZThn32_N6E21x133fooEv,_ZThn24_N6E21x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C21__6E21x13__8G21x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__6E21x13__8G21x13y0[] = {
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv),
};
static  VTT_ENTRY vtt_G21x13y0[] = {
  {&(_ZTV8G21x13y0[3]),  3,14},
  {&(_tg__ZTV6E21x13__8G21x13y0[3]),  3,4},
  {&(_tg__ZTV3C21__6E21x13__8G21x13y0[3]),  3,4},
  {&(_tg__ZTV2B13C21__6E21x13__8G21x13y0[2]),  2,3},
  {&(_ZTV8G21x13y0[10]),  10,14},
  {&(_ZTV8G21x13y0[13]),  13,14},
};
extern VTBL_ENTRY _ZTI8G21x13y0[];
extern  VTBL_ENTRY _ZTV8G21x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x13y0[];
static VTBL_ENTRY alt_thunk_names288[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E21x133fooEv,_ZThn24_N6E21x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E21x133fooEv,_ZThn24_N6E21x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G21x13y0 = {  "G21x13y0", // class name
  bases_G21x13y0, 6,
  &(vtc_G21x13y0[0]), // expected_vtbl_contents
  &(vtt_G21x13y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G21x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x13y0),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x13y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names288,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x13y1  : virtual E21x13 , F1 {
  int ff;
  ~G21x13y1(); // tgen
  G21x13y1(); // tgen
};
//SIG(1 G21x13y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G21x13y1 ::~G21x13y1(){ note_dtor("G21x13y1", this);} // tgen
G21x13y1 ::G21x13y1(){ note_ctor("G21x13y1", this);} // tgen

static void Test_G21x13y1()
{
  extern Class_Descriptor cd_G21x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G21x13y1, buf);
    G21x13y1 *dp, &lv = *(dp=new (buf) G21x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G21x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x13y1)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,24), "G21x13y1");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,32), "G21x13y1");
    check_base_class_offset(lv, (C21*)(E21x13*), ABISELECT(32,24), "G21x13y1");
    check_base_class_offset(lv, (D0*)(E21x13*), ABISELECT(24,16), "G21x13y1");
    check_base_class_offset(lv, (E21x13*), ABISELECT(16,12), "G21x13y1");
    check_base_class_offset(lv, (F1*), 0, "G21x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x13y1.ff");
    test_class_info(&lv, &cd_G21x13y1);
    dp->~G21x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x13y1(Test_G21x13y1, "G21x13y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G21x13y1C1Ev();
extern void _ZN8G21x13y1D1Ev();
Name_Map name_map_G21x13y1[] = {
  NSPAIR(_ZN8G21x13y1C1Ev),
  NSPAIR(_ZN8G21x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x13;
extern VTBL_ENTRY _ZTI6E21x13[];
extern  VTBL_ENTRY _ZTV6E21x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x13y1[] = {
  // 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
    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,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
    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_E21x13,    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_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 _ZTI8G21x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E21x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv)();
extern void ABISELECT(_ZThn16_N6E21x133fooEv,_ZThn12_N6E21x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv)();
static  VTBL_ENTRY vtc_G21x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G21x13y1[0]),
  (VTBL_ENTRY)&_ZN6E21x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G21x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G21x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv),
};
extern VTBL_ENTRY _ZTV8G21x13y1[];
extern void _ZN6E21x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x13__8G21x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&_ZN6E21x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv)();
extern void ABISELECT(_ZThn16_N6E21x133fooEv,_ZThn12_N6E21x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C21__6E21x13__8G21x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__6E21x13__8G21x13y1[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv),
};
static  VTT_ENTRY vtt_G21x13y1[] = {
  {&(_ZTV8G21x13y1[4]),  4,17},
  {&(_ZTV8G21x13y1[9]),  9,17},
  {&(_ZTV8G21x13y1[13]),  13,17},
  {&(_ZTV8G21x13y1[16]),  16,17},
  {&(_tg__ZTV6E21x13__8G21x13y1[3]),  3,4},
  {&(_tg__ZTV3C21__6E21x13__8G21x13y1[3]),  3,4},
  {&(_tg__ZTV2B13C21__6E21x13__8G21x13y1[2]),  2,3},
};
extern VTBL_ENTRY _ZTI8G21x13y1[];
extern  VTBL_ENTRY _ZTV8G21x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x13y1[];
static VTBL_ENTRY alt_thunk_names289[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x133fooEv,_ZThn12_N6E21x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x133fooEv,_ZThn12_N6E21x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G21x13y1 = {  "G21x13y1", // class name
  bases_G21x13y1, 6,
  &(vtc_G21x13y1[0]), // expected_vtbl_contents
  &(vtt_G21x13y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G21x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x13y1),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x13y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names289,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x13y2  : E21x13 , virtual F1 {
  int ff;
  ~G21x13y2(); // tgen
  G21x13y2(); // tgen
};
//SIG(1 G21x13y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G21x13y2 ::~G21x13y2(){ note_dtor("G21x13y2", this);} // tgen
G21x13y2 ::G21x13y2(){ note_ctor("G21x13y2", this);} // tgen

static void Test_G21x13y2()
{
  extern Class_Descriptor cd_G21x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G21x13y2, buf);
    G21x13y2 *dp, &lv = *(dp=new (buf) G21x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G21x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x13y2)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(24,16), "G21x13y2");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(40,24), "G21x13y2");
    check_base_class_offset(lv, (C21*)(E21x13*), ABISELECT(24,16), "G21x13y2");
    check_base_class_offset(lv, (D0*)(E21x13*), ABISELECT(8,4), "G21x13y2");
    check_base_class_offset(lv, (E21x13*), 0, "G21x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G21x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G21x13y2.ff");
    test_class_info(&lv, &cd_G21x13y2);
    dp->~G21x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x13y2(Test_G21x13y2, "G21x13y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G21x13y2C1Ev();
extern void _ZN8G21x13y2D1Ev();
Name_Map name_map_G21x13y2[] = {
  NSPAIR(_ZN8G21x13y2C1Ev),
  NSPAIR(_ZN8G21x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x13;
extern VTBL_ENTRY _ZTI6E21x13[];
extern  VTBL_ENTRY _ZTV6E21x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x13y2[] = {
  // 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
    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(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
    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_E21x13,    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
    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 _ZTI8G21x13y2[];
extern void _ZN6E21x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv)();
extern void ABISELECT(_ZThn24_N6E21x133fooEv,_ZThn16_N6E21x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x13y2[] = {
  ABISELECT(56,36),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x13y2[0]),
  (VTBL_ENTRY)&_ZN6E21x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G21x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G21x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G21x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G21x13y2[];
extern void _ZN6E21x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x13__8G21x13y2[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&_ZN6E21x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv)();
extern void ABISELECT(_ZThn24_N6E21x133fooEv,_ZThn16_N6E21x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C21__6E21x13__8G21x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__6E21x13__8G21x13y2[] = {
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv),
};
static  VTT_ENTRY vtt_G21x13y2[] = {
  {&(_ZTV8G21x13y2[4]),  4,16},
  {&(_tg__ZTV6E21x13__8G21x13y2[3]),  3,4},
  {&(_tg__ZTV3C21__6E21x13__8G21x13y2[3]),  3,4},
  {&(_tg__ZTV2B13C21__6E21x13__8G21x13y2[2]),  2,3},
  {&(_ZTV8G21x13y2[8]),  8,16},
  {&(_ZTV8G21x13y2[11]),  11,16},
  {&(_ZTV8G21x13y2[15]),  15,16},
};
extern VTBL_ENTRY _ZTI8G21x13y2[];
extern  VTBL_ENTRY _ZTV8G21x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x13y2[];
static VTBL_ENTRY alt_thunk_names290[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E21x133fooEv,_ZThn16_N6E21x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E21x133fooEv,_ZThn16_N6E21x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G21x13y2 = {  "G21x13y2", // class name
  bases_G21x13y2, 6,
  &(vtc_G21x13y2[0]), // expected_vtbl_contents
  &(vtt_G21x13y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G21x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x13y2),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x13y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names290,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x13y3  : virtual E21x13 , virtual F1 {
  int ff;
  ~G21x13y3(); // tgen
  G21x13y3(); // tgen
};
//SIG(1 G21x13y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G21x13y3 ::~G21x13y3(){ note_dtor("G21x13y3", this);} // tgen
G21x13y3 ::G21x13y3(){ note_ctor("G21x13y3", this);} // tgen

static void Test_G21x13y3()
{
  extern Class_Descriptor cd_G21x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G21x13y3, buf);
    G21x13y3 *dp, &lv = *(dp=new (buf) G21x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G21x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x13y3)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,20), "G21x13y3");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,28), "G21x13y3");
    check_base_class_offset(lv, (C21*)(E21x13*), ABISELECT(32,20), "G21x13y3");
    check_base_class_offset(lv, (D0*)(E21x13*), ABISELECT(24,12), "G21x13y3");
    check_base_class_offset(lv, (E21x13*), ABISELECT(16,8), "G21x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G21x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G21x13y3.ff");
    test_class_info(&lv, &cd_G21x13y3);
    dp->~G21x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x13y3(Test_G21x13y3, "G21x13y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G21x13y3C1Ev();
extern void _ZN8G21x13y3D1Ev();
Name_Map name_map_G21x13y3[] = {
  NSPAIR(_ZN8G21x13y3C1Ev),
  NSPAIR(_ZN8G21x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x13;
extern VTBL_ENTRY _ZTI6E21x13[];
extern  VTBL_ENTRY _ZTV6E21x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x13y3[] = {
  // 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(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_E21x13,    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
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //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
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI8G21x13y3[];
extern void _ZN6E21x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv)();
extern void ABISELECT(_ZThn16_N6E21x133fooEv,_ZThn12_N6E21x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x13y3[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x13y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G21x13y3[0]),
  (VTBL_ENTRY)&_ZN6E21x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G21x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G21x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G21x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G21x13y3[];
extern void _ZN6E21x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x13__8G21x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&_ZN6E21x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv)();
extern void ABISELECT(_ZThn16_N6E21x133fooEv,_ZThn12_N6E21x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C21__6E21x13__8G21x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__6E21x13__8G21x13y3[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv),
};
static  VTT_ENTRY vtt_G21x13y3[] = {
  {&(_ZTV8G21x13y3[5]),  5,21},
  {&(_ZTV8G21x13y3[9]),  9,21},
  {&(_ZTV8G21x13y3[13]),  13,21},
  {&(_ZTV8G21x13y3[16]),  16,21},
  {&(_ZTV8G21x13y3[20]),  20,21},
  {&(_tg__ZTV6E21x13__8G21x13y3[3]),  3,4},
  {&(_tg__ZTV3C21__6E21x13__8G21x13y3[3]),  3,4},
  {&(_tg__ZTV2B13C21__6E21x13__8G21x13y3[2]),  2,3},
};
extern VTBL_ENTRY _ZTI8G21x13y3[];
extern  VTBL_ENTRY _ZTV8G21x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x13y3[];
static VTBL_ENTRY alt_thunk_names291[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x133fooEv,_ZThn12_N6E21x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x133fooEv,_ZThn12_N6E21x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G21x13y3 = {  "G21x13y3", // class name
  bases_G21x13y3, 6,
  &(vtc_G21x13y3[0]), // expected_vtbl_contents
  &(vtt_G21x13y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G21x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x13y3),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x13y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names291,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x13y4  : E21x13 , F0 {
  int ff;
  ~G21x13y4(); // tgen
  G21x13y4(); // tgen
};
//SIG(1 G21x13y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G21x13y4 ::~G21x13y4(){ note_dtor("G21x13y4", this);} // tgen
G21x13y4 ::G21x13y4(){ note_ctor("G21x13y4", this);} // tgen

static void Test_G21x13y4()
{
  extern Class_Descriptor cd_G21x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G21x13y4, buf);
    G21x13y4 *dp, &lv = *(dp=new (buf) G21x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G21x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x13y4)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(24,20), "G21x13y4");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(40,28), "G21x13y4");
    check_base_class_offset(lv, (C21*)(E21x13*), ABISELECT(24,20), "G21x13y4");
    check_base_class_offset(lv, (D0*)(E21x13*), ABISELECT(8,4), "G21x13y4");
    check_base_class_offset(lv, (E21x13*), 0, "G21x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G21x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G21x13y4.ff");
    test_class_info(&lv, &cd_G21x13y4);
    dp->~G21x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x13y4(Test_G21x13y4, "G21x13y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G21x13y4C1Ev();
extern void _ZN8G21x13y4D1Ev();
Name_Map name_map_G21x13y4[] = {
  NSPAIR(_ZN8G21x13y4C1Ev),
  NSPAIR(_ZN8G21x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x13;
extern VTBL_ENTRY _ZTI6E21x13[];
extern  VTBL_ENTRY _ZTV6E21x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x13y4[] = {
  // 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
    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,20), //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_E21x13,    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 _ZTI8G21x13y4[];
extern void _ZN6E21x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv)();
extern void ABISELECT(_ZThn24_N6E21x133fooEv,_ZThn20_N6E21x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv)();
static  VTBL_ENTRY vtc_G21x13y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x13y4[0]),
  (VTBL_ENTRY)&_ZN6E21x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G21x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G21x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv),
};
extern VTBL_ENTRY _ZTV8G21x13y4[];
extern void _ZN6E21x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x13__8G21x13y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&_ZN6E21x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv)();
extern void ABISELECT(_ZThn24_N6E21x133fooEv,_ZThn20_N6E21x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C21__6E21x13__8G21x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__6E21x13__8G21x13y4[] = {
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv),
};
static  VTT_ENTRY vtt_G21x13y4[] = {
  {&(_ZTV8G21x13y4[3]),  3,11},
  {&(_tg__ZTV6E21x13__8G21x13y4[3]),  3,4},
  {&(_tg__ZTV3C21__6E21x13__8G21x13y4[3]),  3,4},
  {&(_tg__ZTV2B13C21__6E21x13__8G21x13y4[2]),  2,3},
  {&(_ZTV8G21x13y4[7]),  7,11},
  {&(_ZTV8G21x13y4[10]),  10,11},
};
extern VTBL_ENTRY _ZTI8G21x13y4[];
extern  VTBL_ENTRY _ZTV8G21x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x13y4[];
static VTBL_ENTRY alt_thunk_names292[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E21x133fooEv,_ZThn20_N6E21x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E21x133fooEv,_ZThn20_N6E21x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G21x13y4 = {  "G21x13y4", // class name
  bases_G21x13y4, 6,
  &(vtc_G21x13y4[0]), // expected_vtbl_contents
  &(vtt_G21x13y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G21x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x13y4),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x13y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names292,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x13y5  : virtual E21x13 , F0 {
  int ff;
  ~G21x13y5(); // tgen
  G21x13y5(); // tgen
};
//SIG(1 G21x13y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G21x13y5 ::~G21x13y5(){ note_dtor("G21x13y5", this);} // tgen
G21x13y5 ::G21x13y5(){ note_ctor("G21x13y5", this);} // tgen

static void Test_G21x13y5()
{
  extern Class_Descriptor cd_G21x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G21x13y5, buf);
    G21x13y5 *dp, &lv = *(dp=new (buf) G21x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G21x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x13y5)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,24), "G21x13y5");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,32), "G21x13y5");
    check_base_class_offset(lv, (C21*)(E21x13*), ABISELECT(32,24), "G21x13y5");
    check_base_class_offset(lv, (D0*)(E21x13*), ABISELECT(24,16), "G21x13y5");
    check_base_class_offset(lv, (E21x13*), ABISELECT(16,12), "G21x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G21x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x13y5.ff");
    test_class_info(&lv, &cd_G21x13y5);
    dp->~G21x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x13y5(Test_G21x13y5, "G21x13y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G21x13y5C1Ev();
extern void _ZN8G21x13y5D1Ev();
Name_Map name_map_G21x13y5[] = {
  NSPAIR(_ZN8G21x13y5C1Ev),
  NSPAIR(_ZN8G21x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x13;
extern VTBL_ENTRY _ZTI6E21x13[];
extern  VTBL_ENTRY _ZTV6E21x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x13y5[] = {
  // 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
    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,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
    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_E21x13,    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
    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 _ZTI8G21x13y5[];
extern void _ZN6E21x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv)();
extern void ABISELECT(_ZThn16_N6E21x133fooEv,_ZThn12_N6E21x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv)();
static  VTBL_ENTRY vtc_G21x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x13y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G21x13y5[0]),
  (VTBL_ENTRY)&_ZN6E21x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G21x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G21x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv),
};
extern VTBL_ENTRY _ZTV8G21x13y5[];
extern void _ZN6E21x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x13__8G21x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&_ZN6E21x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv)();
extern void ABISELECT(_ZThn16_N6E21x133fooEv,_ZThn12_N6E21x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C21__6E21x13__8G21x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__6E21x13__8G21x13y5[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv),
};
static  VTT_ENTRY vtt_G21x13y5[] = {
  {&(_ZTV8G21x13y5[4]),  4,16},
  {&(_ZTV8G21x13y5[8]),  8,16},
  {&(_ZTV8G21x13y5[12]),  12,16},
  {&(_ZTV8G21x13y5[15]),  15,16},
  {&(_tg__ZTV6E21x13__8G21x13y5[3]),  3,4},
  {&(_tg__ZTV3C21__6E21x13__8G21x13y5[3]),  3,4},
  {&(_tg__ZTV2B13C21__6E21x13__8G21x13y5[2]),  2,3},
};
extern VTBL_ENTRY _ZTI8G21x13y5[];
extern  VTBL_ENTRY _ZTV8G21x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x13y5[];
static VTBL_ENTRY alt_thunk_names293[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x133fooEv,_ZThn12_N6E21x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x133fooEv,_ZThn12_N6E21x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G21x13y5 = {  "G21x13y5", // class name
  bases_G21x13y5, 6,
  &(vtc_G21x13y5[0]), // expected_vtbl_contents
  &(vtt_G21x13y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G21x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x13y5),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x13y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names293,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x13y6  : E21x13 , virtual F0 {
  int ff;
  ~G21x13y6(); // tgen
  G21x13y6(); // tgen
};
//SIG(1 G21x13y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G21x13y6 ::~G21x13y6(){ note_dtor("G21x13y6", this);} // tgen
G21x13y6 ::G21x13y6(){ note_ctor("G21x13y6", this);} // tgen

static void Test_G21x13y6()
{
  extern Class_Descriptor cd_G21x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G21x13y6, buf);
    G21x13y6 *dp, &lv = *(dp=new (buf) G21x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G21x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x13y6)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(24,16), "G21x13y6");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(40,24), "G21x13y6");
    check_base_class_offset(lv, (C21*)(E21x13*), ABISELECT(24,16), "G21x13y6");
    check_base_class_offset(lv, (D0*)(E21x13*), ABISELECT(8,4), "G21x13y6");
    check_base_class_offset(lv, (E21x13*), 0, "G21x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G21x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G21x13y6.ff");
    test_class_info(&lv, &cd_G21x13y6);
    dp->~G21x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x13y6(Test_G21x13y6, "G21x13y6", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G21x13y6C1Ev();
extern void _ZN8G21x13y6D1Ev();
Name_Map name_map_G21x13y6[] = {
  NSPAIR(_ZN8G21x13y6C1Ev),
  NSPAIR(_ZN8G21x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x13;
extern VTBL_ENTRY _ZTI6E21x13[];
extern  VTBL_ENTRY _ZTV6E21x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x13y6[] = {
  // 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
    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(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
    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_E21x13,    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 _ZTI8G21x13y6[];
extern void _ZN6E21x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv)();
extern void ABISELECT(_ZThn24_N6E21x133fooEv,_ZThn16_N6E21x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv)();
static  VTBL_ENTRY vtc_G21x13y6[] = {
  ABISELECT(56,36),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x13y6[0]),
  (VTBL_ENTRY)&_ZN6E21x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G21x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G21x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv),
};
extern VTBL_ENTRY _ZTV8G21x13y6[];
extern void _ZN6E21x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x13__8G21x13y6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&_ZN6E21x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv)();
extern void ABISELECT(_ZThn24_N6E21x133fooEv,_ZThn16_N6E21x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C21__6E21x13__8G21x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__6E21x13__8G21x13y6[] = {
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv),
};
static  VTT_ENTRY vtt_G21x13y6[] = {
  {&(_ZTV8G21x13y6[4]),  4,12},
  {&(_tg__ZTV6E21x13__8G21x13y6[3]),  3,4},
  {&(_tg__ZTV3C21__6E21x13__8G21x13y6[3]),  3,4},
  {&(_tg__ZTV2B13C21__6E21x13__8G21x13y6[2]),  2,3},
  {&(_ZTV8G21x13y6[8]),  8,12},
  {&(_ZTV8G21x13y6[11]),  11,12},
};
extern VTBL_ENTRY _ZTI8G21x13y6[];
extern  VTBL_ENTRY _ZTV8G21x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x13y6[];
static VTBL_ENTRY alt_thunk_names294[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E21x133fooEv,_ZThn16_N6E21x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E21x133fooEv,_ZThn16_N6E21x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G21x13y6 = {  "G21x13y6", // class name
  bases_G21x13y6, 6,
  &(vtc_G21x13y6[0]), // expected_vtbl_contents
  &(vtt_G21x13y6[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G21x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x13y6),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x13y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names294,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x13y7  : virtual E21x13 , virtual F0 {
  int ff;
  ~G21x13y7(); // tgen
  G21x13y7(); // tgen
};
//SIG(1 G21x13y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G21x13y7 ::~G21x13y7(){ note_dtor("G21x13y7", this);} // tgen
G21x13y7 ::G21x13y7(){ note_ctor("G21x13y7", this);} // tgen

static void Test_G21x13y7()
{
  extern Class_Descriptor cd_G21x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G21x13y7, buf);
    G21x13y7 *dp, &lv = *(dp=new (buf) G21x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G21x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x13y7)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,20), "G21x13y7");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,28), "G21x13y7");
    check_base_class_offset(lv, (C21*)(E21x13*), ABISELECT(32,20), "G21x13y7");
    check_base_class_offset(lv, (D0*)(E21x13*), ABISELECT(24,12), "G21x13y7");
    check_base_class_offset(lv, (E21x13*), ABISELECT(16,8), "G21x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G21x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G21x13y7.ff");
    test_class_info(&lv, &cd_G21x13y7);
    dp->~G21x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x13y7(Test_G21x13y7, "G21x13y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G21x13y7C1Ev();
extern void _ZN8G21x13y7D1Ev();
Name_Map name_map_G21x13y7[] = {
  NSPAIR(_ZN8G21x13y7C1Ev),
  NSPAIR(_ZN8G21x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x13;
extern VTBL_ENTRY _ZTI6E21x13[];
extern  VTBL_ENTRY _ZTV6E21x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x13y7[] = {
  // 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(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_E21x13,    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_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 _ZTI8G21x13y7[];
extern void _ZN6E21x133fooEv();
extern void ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv)();
extern void ABISELECT(_ZThn16_N6E21x133fooEv,_ZThn12_N6E21x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv)();
static  VTBL_ENTRY vtc_G21x13y7[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x13y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G21x13y7[0]),
  (VTBL_ENTRY)&_ZN6E21x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G21x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G21x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv),
};
extern VTBL_ENTRY _ZTV8G21x13y7[];
extern void _ZN6E21x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x13__8G21x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&_ZN6E21x133fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv)();
extern void ABISELECT(_ZThn16_N6E21x133fooEv,_ZThn12_N6E21x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C21__6E21x13__8G21x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__6E21x13__8G21x13y7[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E21x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x133fooEv,_ZTvn8_n12_N6E21x133fooEv),
};
static  VTT_ENTRY vtt_G21x13y7[] = {
  {&(_ZTV8G21x13y7[5]),  5,17},
  {&(_ZTV8G21x13y7[9]),  9,17},
  {&(_ZTV8G21x13y7[13]),  13,17},
  {&(_ZTV8G21x13y7[16]),  16,17},
  {&(_tg__ZTV6E21x13__8G21x13y7[3]),  3,4},
  {&(_tg__ZTV3C21__6E21x13__8G21x13y7[3]),  3,4},
  {&(_tg__ZTV2B13C21__6E21x13__8G21x13y7[2]),  2,3},
};
extern VTBL_ENTRY _ZTI8G21x13y7[];
extern  VTBL_ENTRY _ZTV8G21x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x13y7[];
static VTBL_ENTRY alt_thunk_names295[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E21x133fooEv,_ZTv0_n12_N6E21x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x133fooEv,_ZThn12_N6E21x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x133fooEv,_ZThn12_N6E21x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G21x13y7 = {  "G21x13y7", // class name
  bases_G21x13y7, 6,
  &(vtc_G21x13y7[0]), // expected_vtbl_contents
  &(vtt_G21x13y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G21x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x13y7),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x13y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names295,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E22x13  : virtual C22 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E22x133fooEv
  ~E22x13(); // tgen
  E22x13(); // tgen
};
//SIG(-1 E22x13) C1{ VBC2{ VBC3{ Fi} BC4{ v1 Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E22x13 ::foo(){vfunc_called(this, "_ZN6E22x133fooEv");}
E22x13 ::~E22x13(){ note_dtor("E22x13", this);} // tgen
E22x13 ::E22x13(){ note_ctor("E22x13", this);} // tgen

static void Test_E22x13()
{
  extern Class_Descriptor cd_E22x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E22x13, buf);
    E22x13 *dp, &lv = *(dp=new (buf) E22x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E22x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E22x13)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(32,24), "E22x13");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(16,12), "E22x13");
    check_base_class_offset(lv, (C22*), ABISELECT(16,12), "E22x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E22x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E22x13.fd");
    test_class_info(&lv, &cd_E22x13);
    dp->~E22x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE22x13(Test_E22x13, "E22x13", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E22x13C1Ev();
extern void _ZN6E22x13D1Ev();
Name_Map name_map_E22x13[] = {
  NSPAIR(_ZN6E22x13C1Ev),
  NSPAIR(_ZN6E22x13D1Ev),
  {0,0}
};
extern Class_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_E22x13[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6E22x13[];
extern void _ZN6E22x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv)();
extern void ABISELECT(_ZThn16_N6E22x133fooEv,_ZThn12_N6E22x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E22x13[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x13[0]),
  (VTBL_ENTRY)&_ZN6E22x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E22x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv),
};
extern VTBL_ENTRY _ZTV6E22x13[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__6E22x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_E22x13[] = {
  {&(_ZTV6E22x13[4]),  4,10},
  {&(_ZTV6E22x13[9]),  9,10},
  {&(_tg__ZTV3C22__6E22x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E22x13[];
extern  VTBL_ENTRY _ZTV6E22x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x13[];
static VTBL_ENTRY alt_thunk_names296[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x133fooEv,_ZThn12_N6E22x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E22x13 = {  "E22x13", // class name
  bases_E22x13, 4,
  &(vtc_E22x13[0]), // expected_vtbl_contents
  &(vtt_E22x13[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E22x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E22x13),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E22x13),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names296,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x13y0  : E22x13 , F1 {
  int ff;
  ~G22x13y0(); // tgen
  G22x13y0(); // tgen
};
//SIG(1 G22x13y0) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G22x13y0 ::~G22x13y0(){ note_dtor("G22x13y0", this);} // tgen
G22x13y0 ::G22x13y0(){ note_ctor("G22x13y0", this);} // tgen

static void Test_G22x13y0()
{
  extern Class_Descriptor cd_G22x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G22x13y0, buf);
    G22x13y0 *dp, &lv = *(dp=new (buf) G22x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G22x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x13y0)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,36), "G22x13y0");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,24), "G22x13y0");
    check_base_class_offset(lv, (C22*)(E22x13*), ABISELECT(32,24), "G22x13y0");
    check_base_class_offset(lv, (D0*)(E22x13*), ABISELECT(8,4), "G22x13y0");
    check_base_class_offset(lv, (E22x13*), 0, "G22x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G22x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G22x13y0.ff");
    test_class_info(&lv, &cd_G22x13y0);
    dp->~G22x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x13y0(Test_G22x13y0, "G22x13y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G22x13y0C1Ev();
extern void _ZN8G22x13y0D1Ev();
Name_Map name_map_G22x13y0[] = {
  NSPAIR(_ZN8G22x13y0C1Ev),
  NSPAIR(_ZN8G22x13y0D1Ev),
  {0,0}
};
extern Class_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_E22x13;
extern VTBL_ENTRY _ZTI6E22x13[];
extern  VTBL_ENTRY _ZTV6E22x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x13y0[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E22x13,    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
    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 _ZTI8G22x13y0[];
extern void _ZN6E22x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv)();
extern void ABISELECT(_ZThn32_N6E22x133fooEv,_ZThn24_N6E22x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G22x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x13y0[0]),
  (VTBL_ENTRY)&_ZN6E22x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G22x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G22x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv),
};
extern VTBL_ENTRY _ZTV8G22x13y0[];
extern void _ZN6E22x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x13__8G22x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x13[0]),
  (VTBL_ENTRY)&_ZN6E22x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv)();
extern void ABISELECT(_ZThn32_N6E22x133fooEv,_ZThn24_N6E22x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C22__6E22x13__8G22x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E22x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__8G22x13y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x13y0[] = {
  {&(_ZTV8G22x13y0[4]),  4,13},
  {&(_tg__ZTV6E22x13__8G22x13y0[4]),  4,5},
  {&(_tg__ZTV3C22__6E22x13__8G22x13y0[4]),  4,5},
  {&(_ZTV8G22x13y0[12]),  12,13},
  {&(_tg__ZTV3C22__8G22x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x13y0[];
extern  VTBL_ENTRY _ZTV8G22x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x13y0[];
static VTBL_ENTRY alt_thunk_names297[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E22x133fooEv,_ZThn24_N6E22x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E22x133fooEv,_ZThn24_N6E22x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G22x13y0 = {  "G22x13y0", // class name
  bases_G22x13y0, 6,
  &(vtc_G22x13y0[0]), // expected_vtbl_contents
  &(vtt_G22x13y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G22x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x13y0),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x13y0),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names297,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x13y1  : virtual E22x13 , F1 {
  int ff;
  ~G22x13y1(); // tgen
  G22x13y1(); // tgen
};
//SIG(1 G22x13y1) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G22x13y1 ::~G22x13y1(){ note_dtor("G22x13y1", this);} // tgen
G22x13y1 ::G22x13y1(){ note_ctor("G22x13y1", this);} // tgen

static void Test_G22x13y1()
{
  extern Class_Descriptor cd_G22x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G22x13y1, buf);
    G22x13y1 *dp, &lv = *(dp=new (buf) G22x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G22x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x13y1)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,36), "G22x13y1");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,24), "G22x13y1");
    check_base_class_offset(lv, (C22*)(E22x13*), ABISELECT(32,24), "G22x13y1");
    check_base_class_offset(lv, (D0*)(E22x13*), ABISELECT(24,16), "G22x13y1");
    check_base_class_offset(lv, (E22x13*), ABISELECT(16,12), "G22x13y1");
    check_base_class_offset(lv, (F1*), 0, "G22x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x13y1.ff");
    test_class_info(&lv, &cd_G22x13y1);
    dp->~G22x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x13y1(Test_G22x13y1, "G22x13y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G22x13y1C1Ev();
extern void _ZN8G22x13y1D1Ev();
Name_Map name_map_G22x13y1[] = {
  NSPAIR(_ZN8G22x13y1C1Ev),
  NSPAIR(_ZN8G22x13y1D1Ev),
  {0,0}
};
extern Class_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_E22x13;
extern VTBL_ENTRY _ZTI6E22x13[];
extern  VTBL_ENTRY _ZTV6E22x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x13y1[] = {
  // 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
    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(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_E22x13,    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 _ZTI8G22x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E22x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv)();
extern void ABISELECT(_ZThn16_N6E22x133fooEv,_ZThn12_N6E22x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G22x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G22x13y1[0]),
  (VTBL_ENTRY)&_ZN6E22x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G22x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv),
};
extern VTBL_ENTRY _ZTV8G22x13y1[];
extern void _ZN6E22x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x13__8G22x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x13[0]),
  (VTBL_ENTRY)&_ZN6E22x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv)();
extern void ABISELECT(_ZThn16_N6E22x133fooEv,_ZThn12_N6E22x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C22__6E22x13__8G22x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E22x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__8G22x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x13y1[] = {
  {&(_ZTV8G22x13y1[5]),  5,17},
  {&(_ZTV8G22x13y1[11]),  11,17},
  {&(_ZTV8G22x13y1[16]),  16,17},
  {&(_tg__ZTV6E22x13__8G22x13y1[4]),  4,5},
  {&(_tg__ZTV3C22__6E22x13__8G22x13y1[4]),  4,5},
  {&(_tg__ZTV3C22__8G22x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x13y1[];
extern  VTBL_ENTRY _ZTV8G22x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x13y1[];
static VTBL_ENTRY alt_thunk_names298[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x133fooEv,_ZThn12_N6E22x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x133fooEv,_ZThn12_N6E22x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G22x13y1 = {  "G22x13y1", // class name
  bases_G22x13y1, 6,
  &(vtc_G22x13y1[0]), // expected_vtbl_contents
  &(vtt_G22x13y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G22x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x13y1),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x13y1),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names298,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x13y2  : E22x13 , virtual F1 {
  int ff;
  ~G22x13y2(); // tgen
  G22x13y2(); // tgen
};
//SIG(1 G22x13y2) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G22x13y2 ::~G22x13y2(){ note_dtor("G22x13y2", this);} // tgen
G22x13y2 ::G22x13y2(){ note_ctor("G22x13y2", this);} // tgen

static void Test_G22x13y2()
{
  extern Class_Descriptor cd_G22x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G22x13y2, buf);
    G22x13y2 *dp, &lv = *(dp=new (buf) G22x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G22x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x13y2)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(40,28), "G22x13y2");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(24,16), "G22x13y2");
    check_base_class_offset(lv, (C22*)(E22x13*), ABISELECT(24,16), "G22x13y2");
    check_base_class_offset(lv, (D0*)(E22x13*), ABISELECT(8,4), "G22x13y2");
    check_base_class_offset(lv, (E22x13*), 0, "G22x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G22x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G22x13y2.ff");
    test_class_info(&lv, &cd_G22x13y2);
    dp->~G22x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x13y2(Test_G22x13y2, "G22x13y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G22x13y2C1Ev();
extern void _ZN8G22x13y2D1Ev();
Name_Map name_map_G22x13y2[] = {
  NSPAIR(_ZN8G22x13y2C1Ev),
  NSPAIR(_ZN8G22x13y2D1Ev),
  {0,0}
};
extern Class_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_E22x13;
extern VTBL_ENTRY _ZTI6E22x13[];
extern  VTBL_ENTRY _ZTV6E22x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x13y2[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E22x13,    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
    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 _ZTI8G22x13y2[];
extern void _ZN6E22x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv)();
extern void ABISELECT(_ZThn24_N6E22x133fooEv,_ZThn16_N6E22x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x13y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x13y2[0]),
  (VTBL_ENTRY)&_ZN6E22x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G22x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G22x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G22x13y2[];
extern void _ZN6E22x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x13__8G22x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x13[0]),
  (VTBL_ENTRY)&_ZN6E22x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv)();
extern void ABISELECT(_ZThn24_N6E22x133fooEv,_ZThn16_N6E22x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C22__6E22x13__8G22x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E22x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__8G22x13y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x13y2[] = {
  {&(_ZTV8G22x13y2[5]),  5,15},
  {&(_tg__ZTV6E22x13__8G22x13y2[4]),  4,5},
  {&(_tg__ZTV3C22__6E22x13__8G22x13y2[4]),  4,5},
  {&(_ZTV8G22x13y2[10]),  10,15},
  {&(_ZTV8G22x13y2[14]),  14,15},
  {&(_tg__ZTV3C22__8G22x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x13y2[];
extern  VTBL_ENTRY _ZTV8G22x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x13y2[];
static VTBL_ENTRY alt_thunk_names299[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E22x133fooEv,_ZThn16_N6E22x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E22x133fooEv,_ZThn16_N6E22x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G22x13y2 = {  "G22x13y2", // class name
  bases_G22x13y2, 6,
  &(vtc_G22x13y2[0]), // expected_vtbl_contents
  &(vtt_G22x13y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G22x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x13y2),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x13y2),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names299,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x13y3  : virtual E22x13 , virtual F1 {
  int ff;
  ~G22x13y3(); // tgen
  G22x13y3(); // tgen
};
//SIG(1 G22x13y3) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G22x13y3 ::~G22x13y3(){ note_dtor("G22x13y3", this);} // tgen
G22x13y3 ::G22x13y3(){ note_ctor("G22x13y3", this);} // tgen

static void Test_G22x13y3()
{
  extern Class_Descriptor cd_G22x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G22x13y3, buf);
    G22x13y3 *dp, &lv = *(dp=new (buf) G22x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G22x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x13y3)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,32), "G22x13y3");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,20), "G22x13y3");
    check_base_class_offset(lv, (C22*)(E22x13*), ABISELECT(32,20), "G22x13y3");
    check_base_class_offset(lv, (D0*)(E22x13*), ABISELECT(24,12), "G22x13y3");
    check_base_class_offset(lv, (E22x13*), ABISELECT(16,8), "G22x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G22x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G22x13y3.ff");
    test_class_info(&lv, &cd_G22x13y3);
    dp->~G22x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x13y3(Test_G22x13y3, "G22x13y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G22x13y3C1Ev();
extern void _ZN8G22x13y3D1Ev();
Name_Map name_map_G22x13y3[] = {
  NSPAIR(_ZN8G22x13y3C1Ev),
  NSPAIR(_ZN8G22x13y3D1Ev),
  {0,0}
};
extern Class_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_E22x13;
extern VTBL_ENTRY _ZTI6E22x13[];
extern  VTBL_ENTRY _ZTV6E22x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x13y3[] = {
  // 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
    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_E22x13,    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
    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 _ZTI8G22x13y3[];
extern void _ZN6E22x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv)();
extern void ABISELECT(_ZThn16_N6E22x133fooEv,_ZThn12_N6E22x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x13y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G22x13y3[0]),
  (VTBL_ENTRY)&_ZN6E22x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G22x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G22x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G22x13y3[];
extern void _ZN6E22x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x13__8G22x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x13[0]),
  (VTBL_ENTRY)&_ZN6E22x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv)();
extern void ABISELECT(_ZThn16_N6E22x133fooEv,_ZThn12_N6E22x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C22__6E22x13__8G22x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E22x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__8G22x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x13y3[] = {
  {&(_ZTV8G22x13y3[6]),  6,21},
  {&(_ZTV8G22x13y3[11]),  11,21},
  {&(_ZTV8G22x13y3[16]),  16,21},
  {&(_ZTV8G22x13y3[20]),  20,21},
  {&(_tg__ZTV6E22x13__8G22x13y3[4]),  4,5},
  {&(_tg__ZTV3C22__6E22x13__8G22x13y3[4]),  4,5},
  {&(_tg__ZTV3C22__8G22x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x13y3[];
extern  VTBL_ENTRY _ZTV8G22x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x13y3[];
static VTBL_ENTRY alt_thunk_names300[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x133fooEv,_ZThn12_N6E22x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x133fooEv,_ZThn12_N6E22x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G22x13y3 = {  "G22x13y3", // class name
  bases_G22x13y3, 6,
  &(vtc_G22x13y3[0]), // expected_vtbl_contents
  &(vtt_G22x13y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G22x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x13y3),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x13y3),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names300,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x13y4  : E22x13 , F0 {
  int ff;
  ~G22x13y4(); // tgen
  G22x13y4(); // tgen
};
//SIG(1 G22x13y4) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G22x13y4 ::~G22x13y4(){ note_dtor("G22x13y4", this);} // tgen
G22x13y4 ::G22x13y4(){ note_ctor("G22x13y4", this);} // tgen

static void Test_G22x13y4()
{
  extern Class_Descriptor cd_G22x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x13y4, buf);
    G22x13y4 *dp, &lv = *(dp=new (buf) G22x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x13y4)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(40,32), "G22x13y4");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(24,20), "G22x13y4");
    check_base_class_offset(lv, (C22*)(E22x13*), ABISELECT(24,20), "G22x13y4");
    check_base_class_offset(lv, (D0*)(E22x13*), ABISELECT(8,4), "G22x13y4");
    check_base_class_offset(lv, (E22x13*), 0, "G22x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G22x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G22x13y4.ff");
    test_class_info(&lv, &cd_G22x13y4);
    dp->~G22x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x13y4(Test_G22x13y4, "G22x13y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G22x13y4C1Ev();
extern void _ZN8G22x13y4D1Ev();
Name_Map name_map_G22x13y4[] = {
  NSPAIR(_ZN8G22x13y4C1Ev),
  NSPAIR(_ZN8G22x13y4D1Ev),
  {0,0}
};
extern Class_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_E22x13;
extern VTBL_ENTRY _ZTI6E22x13[];
extern  VTBL_ENTRY _ZTV6E22x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x13y4[] = {
  // 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
    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_E22x13,    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 _ZTI8G22x13y4[];
extern void _ZN6E22x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv)();
extern void ABISELECT(_ZThn24_N6E22x133fooEv,_ZThn20_N6E22x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G22x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x13y4[0]),
  (VTBL_ENTRY)&_ZN6E22x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G22x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv),
};
extern VTBL_ENTRY _ZTV8G22x13y4[];
extern void _ZN6E22x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x13__8G22x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x13[0]),
  (VTBL_ENTRY)&_ZN6E22x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv)();
extern void ABISELECT(_ZThn24_N6E22x133fooEv,_ZThn20_N6E22x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C22__6E22x13__8G22x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E22x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__8G22x13y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x13y4[] = {
  {&(_ZTV8G22x13y4[4]),  4,10},
  {&(_tg__ZTV6E22x13__8G22x13y4[4]),  4,5},
  {&(_tg__ZTV3C22__6E22x13__8G22x13y4[4]),  4,5},
  {&(_ZTV8G22x13y4[9]),  9,10},
  {&(_tg__ZTV3C22__8G22x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x13y4[];
extern  VTBL_ENTRY _ZTV8G22x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x13y4[];
static VTBL_ENTRY alt_thunk_names301[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E22x133fooEv,_ZThn20_N6E22x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E22x133fooEv,_ZThn20_N6E22x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G22x13y4 = {  "G22x13y4", // class name
  bases_G22x13y4, 6,
  &(vtc_G22x13y4[0]), // expected_vtbl_contents
  &(vtt_G22x13y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G22x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x13y4),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x13y4),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names301,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x13y5  : virtual E22x13 , F0 {
  int ff;
  ~G22x13y5(); // tgen
  G22x13y5(); // tgen
};
//SIG(1 G22x13y5) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G22x13y5 ::~G22x13y5(){ note_dtor("G22x13y5", this);} // tgen
G22x13y5 ::G22x13y5(){ note_ctor("G22x13y5", this);} // tgen

static void Test_G22x13y5()
{
  extern Class_Descriptor cd_G22x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G22x13y5, buf);
    G22x13y5 *dp, &lv = *(dp=new (buf) G22x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G22x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x13y5)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,36), "G22x13y5");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,24), "G22x13y5");
    check_base_class_offset(lv, (C22*)(E22x13*), ABISELECT(32,24), "G22x13y5");
    check_base_class_offset(lv, (D0*)(E22x13*), ABISELECT(24,16), "G22x13y5");
    check_base_class_offset(lv, (E22x13*), ABISELECT(16,12), "G22x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G22x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x13y5.ff");
    test_class_info(&lv, &cd_G22x13y5);
    dp->~G22x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x13y5(Test_G22x13y5, "G22x13y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G22x13y5C1Ev();
extern void _ZN8G22x13y5D1Ev();
Name_Map name_map_G22x13y5[] = {
  NSPAIR(_ZN8G22x13y5C1Ev),
  NSPAIR(_ZN8G22x13y5D1Ev),
  {0,0}
};
extern Class_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_E22x13;
extern VTBL_ENTRY _ZTI6E22x13[];
extern  VTBL_ENTRY _ZTV6E22x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x13y5[] = {
  // 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
    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(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_E22x13,    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 _ZTI8G22x13y5[];
extern void _ZN6E22x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv)();
extern void ABISELECT(_ZThn16_N6E22x133fooEv,_ZThn12_N6E22x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G22x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G22x13y5[0]),
  (VTBL_ENTRY)&_ZN6E22x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G22x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv),
};
extern VTBL_ENTRY _ZTV8G22x13y5[];
extern void _ZN6E22x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x13__8G22x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x13[0]),
  (VTBL_ENTRY)&_ZN6E22x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv)();
extern void ABISELECT(_ZThn16_N6E22x133fooEv,_ZThn12_N6E22x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C22__6E22x13__8G22x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E22x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__8G22x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x13y5[] = {
  {&(_ZTV8G22x13y5[5]),  5,16},
  {&(_ZTV8G22x13y5[10]),  10,16},
  {&(_ZTV8G22x13y5[15]),  15,16},
  {&(_tg__ZTV6E22x13__8G22x13y5[4]),  4,5},
  {&(_tg__ZTV3C22__6E22x13__8G22x13y5[4]),  4,5},
  {&(_tg__ZTV3C22__8G22x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x13y5[];
extern  VTBL_ENTRY _ZTV8G22x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x13y5[];
static VTBL_ENTRY alt_thunk_names302[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x133fooEv,_ZThn12_N6E22x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x133fooEv,_ZThn12_N6E22x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G22x13y5 = {  "G22x13y5", // class name
  bases_G22x13y5, 6,
  &(vtc_G22x13y5[0]), // expected_vtbl_contents
  &(vtt_G22x13y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G22x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x13y5),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x13y5),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names302,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x13y6  : E22x13 , virtual F0 {
  int ff;
  ~G22x13y6(); // tgen
  G22x13y6(); // tgen
};
//SIG(1 G22x13y6) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G22x13y6 ::~G22x13y6(){ note_dtor("G22x13y6", this);} // tgen
G22x13y6 ::G22x13y6(){ note_ctor("G22x13y6", this);} // tgen

static void Test_G22x13y6()
{
  extern Class_Descriptor cd_G22x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x13y6, buf);
    G22x13y6 *dp, &lv = *(dp=new (buf) G22x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x13y6)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(40,28), "G22x13y6");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(24,16), "G22x13y6");
    check_base_class_offset(lv, (C22*)(E22x13*), ABISELECT(24,16), "G22x13y6");
    check_base_class_offset(lv, (D0*)(E22x13*), ABISELECT(8,4), "G22x13y6");
    check_base_class_offset(lv, (E22x13*), 0, "G22x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G22x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G22x13y6.ff");
    test_class_info(&lv, &cd_G22x13y6);
    dp->~G22x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x13y6(Test_G22x13y6, "G22x13y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G22x13y6C1Ev();
extern void _ZN8G22x13y6D1Ev();
Name_Map name_map_G22x13y6[] = {
  NSPAIR(_ZN8G22x13y6C1Ev),
  NSPAIR(_ZN8G22x13y6D1Ev),
  {0,0}
};
extern Class_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_E22x13;
extern VTBL_ENTRY _ZTI6E22x13[];
extern  VTBL_ENTRY _ZTV6E22x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x13y6[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E22x13,    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 _ZTI8G22x13y6[];
extern void _ZN6E22x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv)();
extern void ABISELECT(_ZThn24_N6E22x133fooEv,_ZThn16_N6E22x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G22x13y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x13y6[0]),
  (VTBL_ENTRY)&_ZN6E22x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G22x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv),
};
extern VTBL_ENTRY _ZTV8G22x13y6[];
extern void _ZN6E22x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x13__8G22x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x13[0]),
  (VTBL_ENTRY)&_ZN6E22x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv)();
extern void ABISELECT(_ZThn24_N6E22x133fooEv,_ZThn16_N6E22x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C22__6E22x13__8G22x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E22x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__8G22x13y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x13y6[] = {
  {&(_ZTV8G22x13y6[5]),  5,11},
  {&(_tg__ZTV6E22x13__8G22x13y6[4]),  4,5},
  {&(_tg__ZTV3C22__6E22x13__8G22x13y6[4]),  4,5},
  {&(_ZTV8G22x13y6[10]),  10,11},
  {&(_tg__ZTV3C22__8G22x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x13y6[];
extern  VTBL_ENTRY _ZTV8G22x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x13y6[];
static VTBL_ENTRY alt_thunk_names303[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E22x133fooEv,_ZThn16_N6E22x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E22x133fooEv,_ZThn16_N6E22x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G22x13y6 = {  "G22x13y6", // class name
  bases_G22x13y6, 6,
  &(vtc_G22x13y6[0]), // expected_vtbl_contents
  &(vtt_G22x13y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G22x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x13y6),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x13y6),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names303,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x13y7  : virtual E22x13 , virtual F0 {
  int ff;
  ~G22x13y7(); // tgen
  G22x13y7(); // tgen
};
//SIG(1 G22x13y7) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G22x13y7 ::~G22x13y7(){ note_dtor("G22x13y7", this);} // tgen
G22x13y7 ::G22x13y7(){ note_ctor("G22x13y7", this);} // tgen

static void Test_G22x13y7()
{
  extern Class_Descriptor cd_G22x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G22x13y7, buf);
    G22x13y7 *dp, &lv = *(dp=new (buf) G22x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G22x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x13y7)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,32), "G22x13y7");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,20), "G22x13y7");
    check_base_class_offset(lv, (C22*)(E22x13*), ABISELECT(32,20), "G22x13y7");
    check_base_class_offset(lv, (D0*)(E22x13*), ABISELECT(24,12), "G22x13y7");
    check_base_class_offset(lv, (E22x13*), ABISELECT(16,8), "G22x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G22x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G22x13y7.ff");
    test_class_info(&lv, &cd_G22x13y7);
    dp->~G22x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x13y7(Test_G22x13y7, "G22x13y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G22x13y7C1Ev();
extern void _ZN8G22x13y7D1Ev();
Name_Map name_map_G22x13y7[] = {
  NSPAIR(_ZN8G22x13y7C1Ev),
  NSPAIR(_ZN8G22x13y7D1Ev),
  {0,0}
};
extern Class_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_E22x13;
extern VTBL_ENTRY _ZTI6E22x13[];
extern  VTBL_ENTRY _ZTV6E22x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x13y7[] = {
  // 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(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_E22x13,    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 _ZTI8G22x13y7[];
extern void _ZN6E22x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv)();
extern void ABISELECT(_ZThn16_N6E22x133fooEv,_ZThn12_N6E22x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G22x13y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G22x13y7[0]),
  (VTBL_ENTRY)&_ZN6E22x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G22x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv),
};
extern VTBL_ENTRY _ZTV8G22x13y7[];
extern void _ZN6E22x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x13__8G22x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x13[0]),
  (VTBL_ENTRY)&_ZN6E22x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv)();
extern void ABISELECT(_ZThn16_N6E22x133fooEv,_ZThn12_N6E22x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C22__6E22x13__8G22x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E22x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__8G22x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x13y7[] = {
  {&(_ZTV8G22x13y7[6]),  6,17},
  {&(_ZTV8G22x13y7[11]),  11,17},
  {&(_ZTV8G22x13y7[16]),  16,17},
  {&(_tg__ZTV6E22x13__8G22x13y7[4]),  4,5},
  {&(_tg__ZTV3C22__6E22x13__8G22x13y7[4]),  4,5},
  {&(_tg__ZTV3C22__8G22x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x13y7[];
extern  VTBL_ENTRY _ZTV8G22x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x13y7[];
static VTBL_ENTRY alt_thunk_names304[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E22x133fooEv,_ZTv0_n16_N6E22x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x133fooEv,_ZThn12_N6E22x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x133fooEv,_ZThn12_N6E22x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G22x13y7 = {  "G22x13y7", // class name
  bases_G22x13y7, 6,
  &(vtc_G22x13y7[0]), // expected_vtbl_contents
  &(vtt_G22x13y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G22x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x13y7),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x13y7),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names304,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E23x13  : virtual C23 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E23x133fooEv
  ~E23x13(); // tgen
  E23x13(); // tgen
};
//SIG(-1 E23x13) C1{ VBC2{ VBC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E23x13 ::foo(){vfunc_called(this, "_ZN6E23x133fooEv");}
E23x13 ::~E23x13(){ note_dtor("E23x13", this);} // tgen
E23x13 ::E23x13(){ note_ctor("E23x13", this);} // tgen

static void Test_E23x13()
{
  extern Class_Descriptor cd_E23x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E23x13, buf);
    E23x13 *dp, &lv = *(dp=new (buf) E23x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E23x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E23x13)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(32,24), "E23x13");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(16,12), "E23x13");
    check_base_class_offset(lv, (C23*), ABISELECT(16,12), "E23x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E23x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E23x13.fd");
    test_class_info(&lv, &cd_E23x13);
    dp->~E23x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE23x13(Test_E23x13, "E23x13", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E23x13C1Ev();
extern void _ZN6E23x13D1Ev();
Name_Map name_map_E23x13[] = {
  NSPAIR(_ZN6E23x13C1Ev),
  NSPAIR(_ZN6E23x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x13[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    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
    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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6E23x13[];
extern void _ZN6E23x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv)();
extern void ABISELECT(_ZThn16_N6E23x133fooEv,_ZThn12_N6E23x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv)();
extern void ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E23x13[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&_ZN6E23x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv),
};
extern VTBL_ENTRY _ZTV6E23x13[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__6E23x13[] = {
  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__6E23x13[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_E23x13[] = {
  {&(_ZTV6E23x13[4]),  4,14},
  {&(_ZTV6E23x13[9]),  9,14},
  {&(_ZTV6E23x13[13]),  13,14},
  {&(_tg__ZTV3C23__6E23x13[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__6E23x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E23x13[];
extern  VTBL_ENTRY _ZTV6E23x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x13[];
static VTBL_ENTRY alt_thunk_names305[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x133fooEv,_ZThn12_N6E23x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E23x13 = {  "E23x13", // class name
  bases_E23x13, 4,
  &(vtc_E23x13[0]), // expected_vtbl_contents
  &(vtt_E23x13[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E23x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E23x13),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E23x13),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names305,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x13y0  : E23x13 , F1 {
  int ff;
  ~G23x13y0(); // tgen
  G23x13y0(); // tgen
};
//SIG(1 G23x13y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G23x13y0 ::~G23x13y0(){ note_dtor("G23x13y0", this);} // tgen
G23x13y0 ::G23x13y0(){ note_ctor("G23x13y0", this);} // tgen

static void Test_G23x13y0()
{
  extern Class_Descriptor cd_G23x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G23x13y0, buf);
    G23x13y0 *dp, &lv = *(dp=new (buf) G23x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G23x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x13y0)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,36), "G23x13y0");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,24), "G23x13y0");
    check_base_class_offset(lv, (C23*)(E23x13*), ABISELECT(32,24), "G23x13y0");
    check_base_class_offset(lv, (D0*)(E23x13*), ABISELECT(8,4), "G23x13y0");
    check_base_class_offset(lv, (E23x13*), 0, "G23x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G23x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G23x13y0.ff");
    test_class_info(&lv, &cd_G23x13y0);
    dp->~G23x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x13y0(Test_G23x13y0, "G23x13y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G23x13y0C1Ev();
extern void _ZN8G23x13y0D1Ev();
Name_Map name_map_G23x13y0[] = {
  NSPAIR(_ZN8G23x13y0C1Ev),
  NSPAIR(_ZN8G23x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x13;
extern VTBL_ENTRY _ZTI6E23x13[];
extern  VTBL_ENTRY _ZTV6E23x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x13y0[] = {
  // 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)
    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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E23x13,    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
    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 _ZTI8G23x13y0[];
extern void _ZN6E23x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv)();
extern void ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv)();
extern void ABISELECT(_ZThn48_N6E23x133fooEv,_ZThn36_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x13y0[0]),
  (VTBL_ENTRY)&_ZN6E23x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G23x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G23x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv),
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G23x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv),
};
extern VTBL_ENTRY _ZTV8G23x13y0[];
extern void _ZN6E23x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x13__8G23x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&_ZN6E23x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv)();
extern void ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C23__6E23x13__8G23x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv)();
extern void ABISELECT(_ZThn48_N6E23x133fooEv,_ZThn36_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x13__8G23x13y0[] = {
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__8G23x13y0[] = {
  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__8G23x13y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x13y0[] = {
  {&(_ZTV8G23x13y0[4]),  4,17},
  {&(_tg__ZTV6E23x13__8G23x13y0[4]),  4,5},
  {&(_tg__ZTV3C23__6E23x13__8G23x13y0[4]),  4,5},
  {&(_tg__ZTV2A1__6E23x13__8G23x13y0[3]),  3,4},
  {&(_ZTV8G23x13y0[12]),  12,17},
  {&(_ZTV8G23x13y0[16]),  16,17},
  {&(_tg__ZTV3C23__8G23x13y0[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__8G23x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x13y0[];
extern  VTBL_ENTRY _ZTV8G23x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x13y0[];
static VTBL_ENTRY alt_thunk_names306[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E23x133fooEv,_ZThn36_N6E23x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E23x133fooEv,_ZThn36_N6E23x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x13y0 = {  "G23x13y0", // class name
  bases_G23x13y0, 6,
  &(vtc_G23x13y0[0]), // expected_vtbl_contents
  &(vtt_G23x13y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G23x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x13y0),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x13y0),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names306,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x13y1  : virtual E23x13 , F1 {
  int ff;
  ~G23x13y1(); // tgen
  G23x13y1(); // tgen
};
//SIG(1 G23x13y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G23x13y1 ::~G23x13y1(){ note_dtor("G23x13y1", this);} // tgen
G23x13y1 ::G23x13y1(){ note_ctor("G23x13y1", this);} // tgen

static void Test_G23x13y1()
{
  extern Class_Descriptor cd_G23x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G23x13y1, buf);
    G23x13y1 *dp, &lv = *(dp=new (buf) G23x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G23x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x13y1)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,36), "G23x13y1");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,24), "G23x13y1");
    check_base_class_offset(lv, (C23*)(E23x13*), ABISELECT(32,24), "G23x13y1");
    check_base_class_offset(lv, (D0*)(E23x13*), ABISELECT(24,16), "G23x13y1");
    check_base_class_offset(lv, (E23x13*), ABISELECT(16,12), "G23x13y1");
    check_base_class_offset(lv, (F1*), 0, "G23x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x13y1.ff");
    test_class_info(&lv, &cd_G23x13y1);
    dp->~G23x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x13y1(Test_G23x13y1, "G23x13y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G23x13y1C1Ev();
extern void _ZN8G23x13y1D1Ev();
Name_Map name_map_G23x13y1[] = {
  NSPAIR(_ZN8G23x13y1C1Ev),
  NSPAIR(_ZN8G23x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x13;
extern VTBL_ENTRY _ZTI6E23x13[];
extern  VTBL_ENTRY _ZTV6E23x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x13y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    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_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
    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(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_E23x13,    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 _ZTI8G23x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E23x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv)();
extern void ABISELECT(_ZThn16_N6E23x133fooEv,_ZThn12_N6E23x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv)();
extern void ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G23x13y1[0]),
  (VTBL_ENTRY)&_ZN6E23x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G23x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G23x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv),
};
extern VTBL_ENTRY _ZTV8G23x13y1[];
extern void _ZN6E23x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x13__8G23x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&_ZN6E23x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv)();
extern void ABISELECT(_ZThn16_N6E23x133fooEv,_ZThn12_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C23__6E23x13__8G23x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv)();
extern void ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x13__8G23x13y1[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__8G23x13y1[] = {
  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__8G23x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x13y1[] = {
  {&(_ZTV8G23x13y1[5]),  5,21},
  {&(_ZTV8G23x13y1[11]),  11,21},
  {&(_ZTV8G23x13y1[16]),  16,21},
  {&(_ZTV8G23x13y1[20]),  20,21},
  {&(_tg__ZTV6E23x13__8G23x13y1[4]),  4,5},
  {&(_tg__ZTV3C23__6E23x13__8G23x13y1[4]),  4,5},
  {&(_tg__ZTV2A1__6E23x13__8G23x13y1[3]),  3,4},
  {&(_tg__ZTV3C23__8G23x13y1[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__8G23x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x13y1[];
extern  VTBL_ENTRY _ZTV8G23x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x13y1[];
static VTBL_ENTRY alt_thunk_names307[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x133fooEv,_ZThn12_N6E23x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x133fooEv,_ZThn12_N6E23x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x13y1 = {  "G23x13y1", // class name
  bases_G23x13y1, 6,
  &(vtc_G23x13y1[0]), // expected_vtbl_contents
  &(vtt_G23x13y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G23x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x13y1),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x13y1),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names307,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x13y2  : E23x13 , virtual F1 {
  int ff;
  ~G23x13y2(); // tgen
  G23x13y2(); // tgen
};
//SIG(1 G23x13y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G23x13y2 ::~G23x13y2(){ note_dtor("G23x13y2", this);} // tgen
G23x13y2 ::G23x13y2(){ note_ctor("G23x13y2", this);} // tgen

static void Test_G23x13y2()
{
  extern Class_Descriptor cd_G23x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G23x13y2, buf);
    G23x13y2 *dp, &lv = *(dp=new (buf) G23x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G23x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x13y2)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(40,28), "G23x13y2");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(24,16), "G23x13y2");
    check_base_class_offset(lv, (C23*)(E23x13*), ABISELECT(24,16), "G23x13y2");
    check_base_class_offset(lv, (D0*)(E23x13*), ABISELECT(8,4), "G23x13y2");
    check_base_class_offset(lv, (E23x13*), 0, "G23x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G23x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G23x13y2.ff");
    test_class_info(&lv, &cd_G23x13y2);
    dp->~G23x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x13y2(Test_G23x13y2, "G23x13y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G23x13y2C1Ev();
extern void _ZN8G23x13y2D1Ev();
Name_Map name_map_G23x13y2[] = {
  NSPAIR(_ZN8G23x13y2C1Ev),
  NSPAIR(_ZN8G23x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x13;
extern VTBL_ENTRY _ZTI6E23x13[];
extern  VTBL_ENTRY _ZTV6E23x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x13y2[] = {
  // 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_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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E23x13,    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
    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 _ZTI8G23x13y2[];
extern void _ZN6E23x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv)();
extern void ABISELECT(_ZThn24_N6E23x133fooEv,_ZThn16_N6E23x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv)();
extern void ABISELECT(_ZThn40_N6E23x133fooEv,_ZThn28_N6E23x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G23x13y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x13y2[0]),
  (VTBL_ENTRY)&_ZN6E23x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G23x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G23x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G23x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G23x13y2[];
extern void _ZN6E23x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x13__8G23x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&_ZN6E23x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv)();
extern void ABISELECT(_ZThn24_N6E23x133fooEv,_ZThn16_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C23__6E23x13__8G23x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv)();
extern void ABISELECT(_ZThn40_N6E23x133fooEv,_ZThn28_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x13__8G23x13y2[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__8G23x13y2[] = {
  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__8G23x13y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x13y2[] = {
  {&(_ZTV8G23x13y2[5]),  5,19},
  {&(_tg__ZTV6E23x13__8G23x13y2[4]),  4,5},
  {&(_tg__ZTV3C23__6E23x13__8G23x13y2[4]),  4,5},
  {&(_tg__ZTV2A1__6E23x13__8G23x13y2[3]),  3,4},
  {&(_ZTV8G23x13y2[10]),  10,19},
  {&(_ZTV8G23x13y2[14]),  14,19},
  {&(_ZTV8G23x13y2[18]),  18,19},
  {&(_tg__ZTV3C23__8G23x13y2[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__8G23x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x13y2[];
extern  VTBL_ENTRY _ZTV8G23x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x13y2[];
static VTBL_ENTRY alt_thunk_names308[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E23x133fooEv,_ZThn28_N6E23x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E23x133fooEv,_ZThn28_N6E23x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x133fooEv,_ZThn16_N6E23x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x133fooEv,_ZThn16_N6E23x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x13y2 = {  "G23x13y2", // class name
  bases_G23x13y2, 6,
  &(vtc_G23x13y2[0]), // expected_vtbl_contents
  &(vtt_G23x13y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G23x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x13y2),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x13y2),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names308,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x13y3  : virtual E23x13 , virtual F1 {
  int ff;
  ~G23x13y3(); // tgen
  G23x13y3(); // tgen
};
//SIG(1 G23x13y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G23x13y3 ::~G23x13y3(){ note_dtor("G23x13y3", this);} // tgen
G23x13y3 ::G23x13y3(){ note_ctor("G23x13y3", this);} // tgen

static void Test_G23x13y3()
{
  extern Class_Descriptor cd_G23x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G23x13y3, buf);
    G23x13y3 *dp, &lv = *(dp=new (buf) G23x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G23x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x13y3)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,32), "G23x13y3");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,20), "G23x13y3");
    check_base_class_offset(lv, (C23*)(E23x13*), ABISELECT(32,20), "G23x13y3");
    check_base_class_offset(lv, (D0*)(E23x13*), ABISELECT(24,12), "G23x13y3");
    check_base_class_offset(lv, (E23x13*), ABISELECT(16,8), "G23x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G23x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G23x13y3.ff");
    test_class_info(&lv, &cd_G23x13y3);
    dp->~G23x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x13y3(Test_G23x13y3, "G23x13y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G23x13y3C1Ev();
extern void _ZN8G23x13y3D1Ev();
Name_Map name_map_G23x13y3[] = {
  NSPAIR(_ZN8G23x13y3C1Ev),
  NSPAIR(_ZN8G23x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x13;
extern VTBL_ENTRY _ZTI6E23x13[];
extern  VTBL_ENTRY _ZTV6E23x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x13y3[] = {
  // 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
    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_E23x13,    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(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 _ZTI8G23x13y3[];
extern void _ZN6E23x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv)();
extern void ABISELECT(_ZThn16_N6E23x133fooEv,_ZThn12_N6E23x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv)();
extern void ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G23x13y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G23x13y3[0]),
  (VTBL_ENTRY)&_ZN6E23x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G23x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G23x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G23x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G23x13y3[];
extern void _ZN6E23x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x13__8G23x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&_ZN6E23x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv)();
extern void ABISELECT(_ZThn16_N6E23x133fooEv,_ZThn12_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C23__6E23x13__8G23x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv)();
extern void ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x13__8G23x13y3[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__8G23x13y3[] = {
  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__8G23x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x13y3[] = {
  {&(_ZTV8G23x13y3[6]),  6,25},
  {&(_ZTV8G23x13y3[11]),  11,25},
  {&(_ZTV8G23x13y3[16]),  16,25},
  {&(_ZTV8G23x13y3[20]),  20,25},
  {&(_ZTV8G23x13y3[24]),  24,25},
  {&(_tg__ZTV6E23x13__8G23x13y3[4]),  4,5},
  {&(_tg__ZTV3C23__6E23x13__8G23x13y3[4]),  4,5},
  {&(_tg__ZTV2A1__6E23x13__8G23x13y3[3]),  3,4},
  {&(_tg__ZTV3C23__8G23x13y3[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__8G23x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x13y3[];
extern  VTBL_ENTRY _ZTV8G23x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x13y3[];
static VTBL_ENTRY alt_thunk_names309[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x133fooEv,_ZThn12_N6E23x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x133fooEv,_ZThn12_N6E23x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x13y3 = {  "G23x13y3", // class name
  bases_G23x13y3, 6,
  &(vtc_G23x13y3[0]), // expected_vtbl_contents
  &(vtt_G23x13y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G23x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x13y3),25, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x13y3),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names309,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x13y4  : E23x13 , F0 {
  int ff;
  ~G23x13y4(); // tgen
  G23x13y4(); // tgen
};
//SIG(1 G23x13y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G23x13y4 ::~G23x13y4(){ note_dtor("G23x13y4", this);} // tgen
G23x13y4 ::G23x13y4(){ note_ctor("G23x13y4", this);} // tgen

static void Test_G23x13y4()
{
  extern Class_Descriptor cd_G23x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x13y4, buf);
    G23x13y4 *dp, &lv = *(dp=new (buf) G23x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x13y4)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(40,32), "G23x13y4");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(24,20), "G23x13y4");
    check_base_class_offset(lv, (C23*)(E23x13*), ABISELECT(24,20), "G23x13y4");
    check_base_class_offset(lv, (D0*)(E23x13*), ABISELECT(8,4), "G23x13y4");
    check_base_class_offset(lv, (E23x13*), 0, "G23x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G23x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G23x13y4.ff");
    test_class_info(&lv, &cd_G23x13y4);
    dp->~G23x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x13y4(Test_G23x13y4, "G23x13y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G23x13y4C1Ev();
extern void _ZN8G23x13y4D1Ev();
Name_Map name_map_G23x13y4[] = {
  NSPAIR(_ZN8G23x13y4C1Ev),
  NSPAIR(_ZN8G23x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x13;
extern VTBL_ENTRY _ZTI6E23x13[];
extern  VTBL_ENTRY _ZTV6E23x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x13y4[] = {
  // 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)
    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
    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_E23x13,    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 _ZTI8G23x13y4[];
extern void _ZN6E23x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv)();
extern void ABISELECT(_ZThn24_N6E23x133fooEv,_ZThn20_N6E23x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv)();
extern void ABISELECT(_ZThn40_N6E23x133fooEv,_ZThn32_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x13y4[0]),
  (VTBL_ENTRY)&_ZN6E23x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G23x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv),
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G23x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv),
};
extern VTBL_ENTRY _ZTV8G23x13y4[];
extern void _ZN6E23x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x13__8G23x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&_ZN6E23x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv)();
extern void ABISELECT(_ZThn24_N6E23x133fooEv,_ZThn20_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C23__6E23x13__8G23x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv)();
extern void ABISELECT(_ZThn40_N6E23x133fooEv,_ZThn32_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x13__8G23x13y4[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__8G23x13y4[] = {
  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__8G23x13y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x13y4[] = {
  {&(_ZTV8G23x13y4[4]),  4,14},
  {&(_tg__ZTV6E23x13__8G23x13y4[4]),  4,5},
  {&(_tg__ZTV3C23__6E23x13__8G23x13y4[4]),  4,5},
  {&(_tg__ZTV2A1__6E23x13__8G23x13y4[3]),  3,4},
  {&(_ZTV8G23x13y4[9]),  9,14},
  {&(_ZTV8G23x13y4[13]),  13,14},
  {&(_tg__ZTV3C23__8G23x13y4[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__8G23x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x13y4[];
extern  VTBL_ENTRY _ZTV8G23x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x13y4[];
static VTBL_ENTRY alt_thunk_names310[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E23x133fooEv,_ZThn32_N6E23x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E23x133fooEv,_ZThn32_N6E23x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x133fooEv,_ZThn20_N6E23x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x133fooEv,_ZThn20_N6E23x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x13y4 = {  "G23x13y4", // class name
  bases_G23x13y4, 6,
  &(vtc_G23x13y4[0]), // expected_vtbl_contents
  &(vtt_G23x13y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G23x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x13y4),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x13y4),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names310,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x13y5  : virtual E23x13 , F0 {
  int ff;
  ~G23x13y5(); // tgen
  G23x13y5(); // tgen
};
//SIG(1 G23x13y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G23x13y5 ::~G23x13y5(){ note_dtor("G23x13y5", this);} // tgen
G23x13y5 ::G23x13y5(){ note_ctor("G23x13y5", this);} // tgen

static void Test_G23x13y5()
{
  extern Class_Descriptor cd_G23x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G23x13y5, buf);
    G23x13y5 *dp, &lv = *(dp=new (buf) G23x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G23x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x13y5)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,36), "G23x13y5");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,24), "G23x13y5");
    check_base_class_offset(lv, (C23*)(E23x13*), ABISELECT(32,24), "G23x13y5");
    check_base_class_offset(lv, (D0*)(E23x13*), ABISELECT(24,16), "G23x13y5");
    check_base_class_offset(lv, (E23x13*), ABISELECT(16,12), "G23x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G23x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x13y5.ff");
    test_class_info(&lv, &cd_G23x13y5);
    dp->~G23x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x13y5(Test_G23x13y5, "G23x13y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G23x13y5C1Ev();
extern void _ZN8G23x13y5D1Ev();
Name_Map name_map_G23x13y5[] = {
  NSPAIR(_ZN8G23x13y5C1Ev),
  NSPAIR(_ZN8G23x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x13;
extern VTBL_ENTRY _ZTI6E23x13[];
extern  VTBL_ENTRY _ZTV6E23x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x13y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    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_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
    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(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_E23x13,    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 _ZTI8G23x13y5[];
extern void _ZN6E23x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv)();
extern void ABISELECT(_ZThn16_N6E23x133fooEv,_ZThn12_N6E23x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv)();
extern void ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G23x13y5[0]),
  (VTBL_ENTRY)&_ZN6E23x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G23x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G23x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv),
};
extern VTBL_ENTRY _ZTV8G23x13y5[];
extern void _ZN6E23x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x13__8G23x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&_ZN6E23x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv)();
extern void ABISELECT(_ZThn16_N6E23x133fooEv,_ZThn12_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C23__6E23x13__8G23x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv)();
extern void ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x13__8G23x13y5[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__8G23x13y5[] = {
  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__8G23x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x13y5[] = {
  {&(_ZTV8G23x13y5[5]),  5,20},
  {&(_ZTV8G23x13y5[10]),  10,20},
  {&(_ZTV8G23x13y5[15]),  15,20},
  {&(_ZTV8G23x13y5[19]),  19,20},
  {&(_tg__ZTV6E23x13__8G23x13y5[4]),  4,5},
  {&(_tg__ZTV3C23__6E23x13__8G23x13y5[4]),  4,5},
  {&(_tg__ZTV2A1__6E23x13__8G23x13y5[3]),  3,4},
  {&(_tg__ZTV3C23__8G23x13y5[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__8G23x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x13y5[];
extern  VTBL_ENTRY _ZTV8G23x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x13y5[];
static VTBL_ENTRY alt_thunk_names311[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x133fooEv,_ZThn12_N6E23x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x133fooEv,_ZThn12_N6E23x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x13y5 = {  "G23x13y5", // class name
  bases_G23x13y5, 6,
  &(vtc_G23x13y5[0]), // expected_vtbl_contents
  &(vtt_G23x13y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G23x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x13y5),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x13y5),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names311,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x13y6  : E23x13 , virtual F0 {
  int ff;
  ~G23x13y6(); // tgen
  G23x13y6(); // tgen
};
//SIG(1 G23x13y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G23x13y6 ::~G23x13y6(){ note_dtor("G23x13y6", this);} // tgen
G23x13y6 ::G23x13y6(){ note_ctor("G23x13y6", this);} // tgen

static void Test_G23x13y6()
{
  extern Class_Descriptor cd_G23x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x13y6, buf);
    G23x13y6 *dp, &lv = *(dp=new (buf) G23x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x13y6)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(40,28), "G23x13y6");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(24,16), "G23x13y6");
    check_base_class_offset(lv, (C23*)(E23x13*), ABISELECT(24,16), "G23x13y6");
    check_base_class_offset(lv, (D0*)(E23x13*), ABISELECT(8,4), "G23x13y6");
    check_base_class_offset(lv, (E23x13*), 0, "G23x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G23x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G23x13y6.ff");
    test_class_info(&lv, &cd_G23x13y6);
    dp->~G23x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x13y6(Test_G23x13y6, "G23x13y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G23x13y6C1Ev();
extern void _ZN8G23x13y6D1Ev();
Name_Map name_map_G23x13y6[] = {
  NSPAIR(_ZN8G23x13y6C1Ev),
  NSPAIR(_ZN8G23x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x13;
extern VTBL_ENTRY _ZTI6E23x13[];
extern  VTBL_ENTRY _ZTV6E23x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x13y6[] = {
  // 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_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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E23x13,    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 _ZTI8G23x13y6[];
extern void _ZN6E23x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv)();
extern void ABISELECT(_ZThn24_N6E23x133fooEv,_ZThn16_N6E23x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv)();
extern void ABISELECT(_ZThn40_N6E23x133fooEv,_ZThn28_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x13y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x13y6[0]),
  (VTBL_ENTRY)&_ZN6E23x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G23x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G23x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv),
};
extern VTBL_ENTRY _ZTV8G23x13y6[];
extern void _ZN6E23x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x13__8G23x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&_ZN6E23x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv)();
extern void ABISELECT(_ZThn24_N6E23x133fooEv,_ZThn16_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C23__6E23x13__8G23x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv)();
extern void ABISELECT(_ZThn40_N6E23x133fooEv,_ZThn28_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x13__8G23x13y6[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__8G23x13y6[] = {
  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__8G23x13y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x13y6[] = {
  {&(_ZTV8G23x13y6[5]),  5,15},
  {&(_tg__ZTV6E23x13__8G23x13y6[4]),  4,5},
  {&(_tg__ZTV3C23__6E23x13__8G23x13y6[4]),  4,5},
  {&(_tg__ZTV2A1__6E23x13__8G23x13y6[3]),  3,4},
  {&(_ZTV8G23x13y6[10]),  10,15},
  {&(_ZTV8G23x13y6[14]),  14,15},
  {&(_tg__ZTV3C23__8G23x13y6[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__8G23x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x13y6[];
extern  VTBL_ENTRY _ZTV8G23x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x13y6[];
static VTBL_ENTRY alt_thunk_names312[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E23x133fooEv,_ZThn28_N6E23x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E23x133fooEv,_ZThn28_N6E23x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x133fooEv,_ZThn16_N6E23x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x133fooEv,_ZThn16_N6E23x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x13y6 = {  "G23x13y6", // class name
  bases_G23x13y6, 6,
  &(vtc_G23x13y6[0]), // expected_vtbl_contents
  &(vtt_G23x13y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G23x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x13y6),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x13y6),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names312,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x13y7  : virtual E23x13 , virtual F0 {
  int ff;
  ~G23x13y7(); // tgen
  G23x13y7(); // tgen
};
//SIG(1 G23x13y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G23x13y7 ::~G23x13y7(){ note_dtor("G23x13y7", this);} // tgen
G23x13y7 ::G23x13y7(){ note_ctor("G23x13y7", this);} // tgen

static void Test_G23x13y7()
{
  extern Class_Descriptor cd_G23x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G23x13y7, buf);
    G23x13y7 *dp, &lv = *(dp=new (buf) G23x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G23x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x13y7)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,32), "G23x13y7");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,20), "G23x13y7");
    check_base_class_offset(lv, (C23*)(E23x13*), ABISELECT(32,20), "G23x13y7");
    check_base_class_offset(lv, (D0*)(E23x13*), ABISELECT(24,12), "G23x13y7");
    check_base_class_offset(lv, (E23x13*), ABISELECT(16,8), "G23x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G23x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G23x13y7.ff");
    test_class_info(&lv, &cd_G23x13y7);
    dp->~G23x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x13y7(Test_G23x13y7, "G23x13y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G23x13y7C1Ev();
extern void _ZN8G23x13y7D1Ev();
Name_Map name_map_G23x13y7[] = {
  NSPAIR(_ZN8G23x13y7C1Ev),
  NSPAIR(_ZN8G23x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x13;
extern VTBL_ENTRY _ZTI6E23x13[];
extern  VTBL_ENTRY _ZTV6E23x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x13y7[] = {
  // 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(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_E23x13,    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(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 _ZTI8G23x13y7[];
extern void _ZN6E23x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv)();
extern void ABISELECT(_ZThn16_N6E23x133fooEv,_ZThn12_N6E23x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv)();
extern void ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x13y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G23x13y7[0]),
  (VTBL_ENTRY)&_ZN6E23x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G23x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G23x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv),
};
extern VTBL_ENTRY _ZTV8G23x13y7[];
extern void _ZN6E23x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x13__8G23x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&_ZN6E23x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv)();
extern void ABISELECT(_ZThn16_N6E23x133fooEv,_ZThn12_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C23__6E23x13__8G23x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv)();
extern void ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x13__8G23x13y7[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E23x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__8G23x13y7[] = {
  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__8G23x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x13y7[] = {
  {&(_ZTV8G23x13y7[6]),  6,21},
  {&(_ZTV8G23x13y7[11]),  11,21},
  {&(_ZTV8G23x13y7[16]),  16,21},
  {&(_ZTV8G23x13y7[20]),  20,21},
  {&(_tg__ZTV6E23x13__8G23x13y7[4]),  4,5},
  {&(_tg__ZTV3C23__6E23x13__8G23x13y7[4]),  4,5},
  {&(_tg__ZTV2A1__6E23x13__8G23x13y7[3]),  3,4},
  {&(_tg__ZTV3C23__8G23x13y7[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__8G23x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x13y7[];
extern  VTBL_ENTRY _ZTV8G23x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x13y7[];
static VTBL_ENTRY alt_thunk_names313[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x133fooEv,_ZTv0_n12_N6E23x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x133fooEv,_ZThn24_N6E23x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E23x133fooEv,_ZTv0_n16_N6E23x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x133fooEv,_ZThn12_N6E23x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x133fooEv,_ZThn12_N6E23x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x13y7 = {  "G23x13y7", // class name
  bases_G23x13y7, 6,
  &(vtc_G23x13y7[0]), // expected_vtbl_contents
  &(vtt_G23x13y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G23x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x13y7),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x13y7),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names313,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E24x13  : virtual C24 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E24x133fooEv
  ~E24x13(); // tgen
  E24x13(); // tgen
};
//SIG(-1 E24x13) C1{ VBC2{ BC3{ Fi} VBC4{ Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E24x13 ::foo(){vfunc_called(this, "_ZN6E24x133fooEv");}
E24x13 ::~E24x13(){ note_dtor("E24x13", this);} // tgen
E24x13 ::E24x13(){ note_ctor("E24x13", this);} // tgen

static void Test_E24x13()
{
  extern Class_Descriptor cd_E24x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E24x13, buf);
    E24x13 *dp, &lv = *(dp=new (buf) E24x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E24x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E24x13)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(24,16), "E24x13");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(32,24), "E24x13");
    check_base_class_offset(lv, (C24*), ABISELECT(16,12), "E24x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E24x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E24x13.fd");
    test_class_info(&lv, &cd_E24x13);
    dp->~E24x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE24x13(Test_E24x13, "E24x13", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E24x13C1Ev();
extern void _ZN6E24x13D1Ev();
Name_Map name_map_E24x13[] = {
  NSPAIR(_ZN6E24x13C1Ev),
  NSPAIR(_ZN6E24x13D1Ev),
  {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_E24x13[] = {
  // 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
    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 _ZTI6E24x13[];
extern void _ZN6E24x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv)();
extern void ABISELECT(_ZThn16_N6E24x133fooEv,_ZThn12_N6E24x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E24x13[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x13[0]),
  (VTBL_ENTRY)&_ZN6E24x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E24x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv),
};
extern VTBL_ENTRY _ZTV6E24x13[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__6E24x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_E24x13[] = {
  {&(_ZTV6E24x13[4]),  4,10},
  {&(_ZTV6E24x13[9]),  9,10},
  {&(_tg__ZTV3C24__6E24x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E24x13[];
extern  VTBL_ENTRY _ZTV6E24x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x13[];
static VTBL_ENTRY alt_thunk_names314[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x133fooEv,_ZThn12_N6E24x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E24x13 = {  "E24x13", // class name
  bases_E24x13, 4,
  &(vtc_E24x13[0]), // expected_vtbl_contents
  &(vtt_E24x13[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E24x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E24x13),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E24x13),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names314,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x13y0  : E24x13 , F1 {
  int ff;
  ~G24x13y0(); // tgen
  G24x13y0(); // tgen
};
//SIG(1 G24x13y0) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G24x13y0 ::~G24x13y0(){ note_dtor("G24x13y0", this);} // tgen
G24x13y0 ::G24x13y0(){ note_ctor("G24x13y0", this);} // tgen

static void Test_G24x13y0()
{
  extern Class_Descriptor cd_G24x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G24x13y0, buf);
    G24x13y0 *dp, &lv = *(dp=new (buf) G24x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G24x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x13y0)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,28), "G24x13y0");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,36), "G24x13y0");
    check_base_class_offset(lv, (C24*)(E24x13*), ABISELECT(32,24), "G24x13y0");
    check_base_class_offset(lv, (D0*)(E24x13*), ABISELECT(8,4), "G24x13y0");
    check_base_class_offset(lv, (E24x13*), 0, "G24x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G24x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G24x13y0.ff");
    test_class_info(&lv, &cd_G24x13y0);
    dp->~G24x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x13y0(Test_G24x13y0, "G24x13y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G24x13y0C1Ev();
extern void _ZN8G24x13y0D1Ev();
Name_Map name_map_G24x13y0[] = {
  NSPAIR(_ZN8G24x13y0C1Ev),
  NSPAIR(_ZN8G24x13y0D1Ev),
  {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_E24x13;
extern VTBL_ENTRY _ZTI6E24x13[];
extern  VTBL_ENTRY _ZTV6E24x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x13y0[] = {
  // 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
    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_E24x13,    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
    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 _ZTI8G24x13y0[];
extern void _ZN6E24x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv)();
extern void ABISELECT(_ZThn32_N6E24x133fooEv,_ZThn24_N6E24x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G24x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x13y0[0]),
  (VTBL_ENTRY)&_ZN6E24x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G24x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G24x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv),
};
extern VTBL_ENTRY _ZTV8G24x13y0[];
extern void _ZN6E24x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x13__8G24x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x13[0]),
  (VTBL_ENTRY)&_ZN6E24x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv)();
extern void ABISELECT(_ZThn32_N6E24x133fooEv,_ZThn24_N6E24x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C24__6E24x13__8G24x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E24x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__8G24x13y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x13y0[] = {
  {&(_ZTV8G24x13y0[4]),  4,13},
  {&(_tg__ZTV6E24x13__8G24x13y0[4]),  4,5},
  {&(_tg__ZTV3C24__6E24x13__8G24x13y0[4]),  4,5},
  {&(_ZTV8G24x13y0[12]),  12,13},
  {&(_tg__ZTV3C24__8G24x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x13y0[];
extern  VTBL_ENTRY _ZTV8G24x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x13y0[];
static VTBL_ENTRY alt_thunk_names315[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E24x133fooEv,_ZThn24_N6E24x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E24x133fooEv,_ZThn24_N6E24x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G24x13y0 = {  "G24x13y0", // class name
  bases_G24x13y0, 6,
  &(vtc_G24x13y0[0]), // expected_vtbl_contents
  &(vtt_G24x13y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G24x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x13y0),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x13y0),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names315,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x13y1  : virtual E24x13 , F1 {
  int ff;
  ~G24x13y1(); // tgen
  G24x13y1(); // tgen
};
//SIG(1 G24x13y1) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G24x13y1 ::~G24x13y1(){ note_dtor("G24x13y1", this);} // tgen
G24x13y1 ::G24x13y1(){ note_ctor("G24x13y1", this);} // tgen

static void Test_G24x13y1()
{
  extern Class_Descriptor cd_G24x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G24x13y1, buf);
    G24x13y1 *dp, &lv = *(dp=new (buf) G24x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G24x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x13y1)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,28), "G24x13y1");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,36), "G24x13y1");
    check_base_class_offset(lv, (C24*)(E24x13*), ABISELECT(32,24), "G24x13y1");
    check_base_class_offset(lv, (D0*)(E24x13*), ABISELECT(24,16), "G24x13y1");
    check_base_class_offset(lv, (E24x13*), ABISELECT(16,12), "G24x13y1");
    check_base_class_offset(lv, (F1*), 0, "G24x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x13y1.ff");
    test_class_info(&lv, &cd_G24x13y1);
    dp->~G24x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x13y1(Test_G24x13y1, "G24x13y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G24x13y1C1Ev();
extern void _ZN8G24x13y1D1Ev();
Name_Map name_map_G24x13y1[] = {
  NSPAIR(_ZN8G24x13y1C1Ev),
  NSPAIR(_ZN8G24x13y1D1Ev),
  {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_E24x13;
extern VTBL_ENTRY _ZTI6E24x13[];
extern  VTBL_ENTRY _ZTV6E24x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x13y1[] = {
  // 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
    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_E24x13,    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_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 _ZTI8G24x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E24x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv)();
extern void ABISELECT(_ZThn16_N6E24x133fooEv,_ZThn12_N6E24x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G24x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G24x13y1[0]),
  (VTBL_ENTRY)&_ZN6E24x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G24x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv),
};
extern VTBL_ENTRY _ZTV8G24x13y1[];
extern void _ZN6E24x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x13__8G24x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x13[0]),
  (VTBL_ENTRY)&_ZN6E24x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv)();
extern void ABISELECT(_ZThn16_N6E24x133fooEv,_ZThn12_N6E24x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C24__6E24x13__8G24x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E24x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__8G24x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x13y1[] = {
  {&(_ZTV8G24x13y1[5]),  5,17},
  {&(_ZTV8G24x13y1[11]),  11,17},
  {&(_ZTV8G24x13y1[16]),  16,17},
  {&(_tg__ZTV6E24x13__8G24x13y1[4]),  4,5},
  {&(_tg__ZTV3C24__6E24x13__8G24x13y1[4]),  4,5},
  {&(_tg__ZTV3C24__8G24x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x13y1[];
extern  VTBL_ENTRY _ZTV8G24x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x13y1[];
static VTBL_ENTRY alt_thunk_names316[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x133fooEv,_ZThn12_N6E24x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x133fooEv,_ZThn12_N6E24x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G24x13y1 = {  "G24x13y1", // class name
  bases_G24x13y1, 6,
  &(vtc_G24x13y1[0]), // expected_vtbl_contents
  &(vtt_G24x13y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G24x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x13y1),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x13y1),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names316,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x13y2  : E24x13 , virtual F1 {
  int ff;
  ~G24x13y2(); // tgen
  G24x13y2(); // tgen
};
//SIG(1 G24x13y2) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G24x13y2 ::~G24x13y2(){ note_dtor("G24x13y2", this);} // tgen
G24x13y2 ::G24x13y2(){ note_ctor("G24x13y2", this);} // tgen

static void Test_G24x13y2()
{
  extern Class_Descriptor cd_G24x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G24x13y2, buf);
    G24x13y2 *dp, &lv = *(dp=new (buf) G24x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G24x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x13y2)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(32,20), "G24x13y2");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(40,28), "G24x13y2");
    check_base_class_offset(lv, (C24*)(E24x13*), ABISELECT(24,16), "G24x13y2");
    check_base_class_offset(lv, (D0*)(E24x13*), ABISELECT(8,4), "G24x13y2");
    check_base_class_offset(lv, (E24x13*), 0, "G24x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G24x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G24x13y2.ff");
    test_class_info(&lv, &cd_G24x13y2);
    dp->~G24x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x13y2(Test_G24x13y2, "G24x13y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G24x13y2C1Ev();
extern void _ZN8G24x13y2D1Ev();
Name_Map name_map_G24x13y2[] = {
  NSPAIR(_ZN8G24x13y2C1Ev),
  NSPAIR(_ZN8G24x13y2D1Ev),
  {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_E24x13;
extern VTBL_ENTRY _ZTI6E24x13[];
extern  VTBL_ENTRY _ZTV6E24x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x13y2[] = {
  // 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
    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_E24x13,    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
    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 _ZTI8G24x13y2[];
extern void _ZN6E24x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv)();
extern void ABISELECT(_ZThn24_N6E24x133fooEv,_ZThn16_N6E24x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x13y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x13y2[0]),
  (VTBL_ENTRY)&_ZN6E24x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G24x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G24x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G24x13y2[];
extern void _ZN6E24x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x13__8G24x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x13[0]),
  (VTBL_ENTRY)&_ZN6E24x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv)();
extern void ABISELECT(_ZThn24_N6E24x133fooEv,_ZThn16_N6E24x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C24__6E24x13__8G24x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E24x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__8G24x13y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x13y2[] = {
  {&(_ZTV8G24x13y2[5]),  5,15},
  {&(_tg__ZTV6E24x13__8G24x13y2[4]),  4,5},
  {&(_tg__ZTV3C24__6E24x13__8G24x13y2[4]),  4,5},
  {&(_ZTV8G24x13y2[10]),  10,15},
  {&(_ZTV8G24x13y2[14]),  14,15},
  {&(_tg__ZTV3C24__8G24x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x13y2[];
extern  VTBL_ENTRY _ZTV8G24x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x13y2[];
static VTBL_ENTRY alt_thunk_names317[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E24x133fooEv,_ZThn16_N6E24x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E24x133fooEv,_ZThn16_N6E24x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G24x13y2 = {  "G24x13y2", // class name
  bases_G24x13y2, 6,
  &(vtc_G24x13y2[0]), // expected_vtbl_contents
  &(vtt_G24x13y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G24x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x13y2),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x13y2),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names317,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x13y3  : virtual E24x13 , virtual F1 {
  int ff;
  ~G24x13y3(); // tgen
  G24x13y3(); // tgen
};
//SIG(1 G24x13y3) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G24x13y3 ::~G24x13y3(){ note_dtor("G24x13y3", this);} // tgen
G24x13y3 ::G24x13y3(){ note_ctor("G24x13y3", this);} // tgen

static void Test_G24x13y3()
{
  extern Class_Descriptor cd_G24x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G24x13y3, buf);
    G24x13y3 *dp, &lv = *(dp=new (buf) G24x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G24x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x13y3)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,24), "G24x13y3");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,32), "G24x13y3");
    check_base_class_offset(lv, (C24*)(E24x13*), ABISELECT(32,20), "G24x13y3");
    check_base_class_offset(lv, (D0*)(E24x13*), ABISELECT(24,12), "G24x13y3");
    check_base_class_offset(lv, (E24x13*), ABISELECT(16,8), "G24x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G24x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G24x13y3.ff");
    test_class_info(&lv, &cd_G24x13y3);
    dp->~G24x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x13y3(Test_G24x13y3, "G24x13y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G24x13y3C1Ev();
extern void _ZN8G24x13y3D1Ev();
Name_Map name_map_G24x13y3[] = {
  NSPAIR(_ZN8G24x13y3C1Ev),
  NSPAIR(_ZN8G24x13y3D1Ev),
  {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_E24x13;
extern VTBL_ENTRY _ZTI6E24x13[];
extern  VTBL_ENTRY _ZTV6E24x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x13y3[] = {
  // 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
    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_E24x13,    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
    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 _ZTI8G24x13y3[];
extern void _ZN6E24x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv)();
extern void ABISELECT(_ZThn16_N6E24x133fooEv,_ZThn12_N6E24x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x13y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G24x13y3[0]),
  (VTBL_ENTRY)&_ZN6E24x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G24x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G24x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G24x13y3[];
extern void _ZN6E24x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x13__8G24x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x13[0]),
  (VTBL_ENTRY)&_ZN6E24x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv)();
extern void ABISELECT(_ZThn16_N6E24x133fooEv,_ZThn12_N6E24x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C24__6E24x13__8G24x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E24x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__8G24x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x13y3[] = {
  {&(_ZTV8G24x13y3[6]),  6,21},
  {&(_ZTV8G24x13y3[11]),  11,21},
  {&(_ZTV8G24x13y3[16]),  16,21},
  {&(_ZTV8G24x13y3[20]),  20,21},
  {&(_tg__ZTV6E24x13__8G24x13y3[4]),  4,5},
  {&(_tg__ZTV3C24__6E24x13__8G24x13y3[4]),  4,5},
  {&(_tg__ZTV3C24__8G24x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x13y3[];
extern  VTBL_ENTRY _ZTV8G24x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x13y3[];
static VTBL_ENTRY alt_thunk_names318[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x133fooEv,_ZThn12_N6E24x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x133fooEv,_ZThn12_N6E24x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G24x13y3 = {  "G24x13y3", // class name
  bases_G24x13y3, 6,
  &(vtc_G24x13y3[0]), // expected_vtbl_contents
  &(vtt_G24x13y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G24x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x13y3),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x13y3),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names318,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x13y4  : E24x13 , F0 {
  int ff;
  ~G24x13y4(); // tgen
  G24x13y4(); // tgen
};
//SIG(1 G24x13y4) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G24x13y4 ::~G24x13y4(){ note_dtor("G24x13y4", this);} // tgen
G24x13y4 ::G24x13y4(){ note_ctor("G24x13y4", this);} // tgen

static void Test_G24x13y4()
{
  extern Class_Descriptor cd_G24x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x13y4, buf);
    G24x13y4 *dp, &lv = *(dp=new (buf) G24x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x13y4)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(32,24), "G24x13y4");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(40,32), "G24x13y4");
    check_base_class_offset(lv, (C24*)(E24x13*), ABISELECT(24,20), "G24x13y4");
    check_base_class_offset(lv, (D0*)(E24x13*), ABISELECT(8,4), "G24x13y4");
    check_base_class_offset(lv, (E24x13*), 0, "G24x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G24x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G24x13y4.ff");
    test_class_info(&lv, &cd_G24x13y4);
    dp->~G24x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x13y4(Test_G24x13y4, "G24x13y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G24x13y4C1Ev();
extern void _ZN8G24x13y4D1Ev();
Name_Map name_map_G24x13y4[] = {
  NSPAIR(_ZN8G24x13y4C1Ev),
  NSPAIR(_ZN8G24x13y4D1Ev),
  {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_E24x13;
extern VTBL_ENTRY _ZTI6E24x13[];
extern  VTBL_ENTRY _ZTV6E24x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x13y4[] = {
  // 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
    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_E24x13,    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 _ZTI8G24x13y4[];
extern void _ZN6E24x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv)();
extern void ABISELECT(_ZThn24_N6E24x133fooEv,_ZThn20_N6E24x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G24x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x13y4[0]),
  (VTBL_ENTRY)&_ZN6E24x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G24x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv),
};
extern VTBL_ENTRY _ZTV8G24x13y4[];
extern void _ZN6E24x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x13__8G24x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x13[0]),
  (VTBL_ENTRY)&_ZN6E24x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv)();
extern void ABISELECT(_ZThn24_N6E24x133fooEv,_ZThn20_N6E24x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C24__6E24x13__8G24x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E24x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__8G24x13y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x13y4[] = {
  {&(_ZTV8G24x13y4[4]),  4,10},
  {&(_tg__ZTV6E24x13__8G24x13y4[4]),  4,5},
  {&(_tg__ZTV3C24__6E24x13__8G24x13y4[4]),  4,5},
  {&(_ZTV8G24x13y4[9]),  9,10},
  {&(_tg__ZTV3C24__8G24x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x13y4[];
extern  VTBL_ENTRY _ZTV8G24x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x13y4[];
static VTBL_ENTRY alt_thunk_names319[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E24x133fooEv,_ZThn20_N6E24x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E24x133fooEv,_ZThn20_N6E24x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G24x13y4 = {  "G24x13y4", // class name
  bases_G24x13y4, 6,
  &(vtc_G24x13y4[0]), // expected_vtbl_contents
  &(vtt_G24x13y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G24x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x13y4),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x13y4),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names319,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x13y5  : virtual E24x13 , F0 {
  int ff;
  ~G24x13y5(); // tgen
  G24x13y5(); // tgen
};
//SIG(1 G24x13y5) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G24x13y5 ::~G24x13y5(){ note_dtor("G24x13y5", this);} // tgen
G24x13y5 ::G24x13y5(){ note_ctor("G24x13y5", this);} // tgen

static void Test_G24x13y5()
{
  extern Class_Descriptor cd_G24x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G24x13y5, buf);
    G24x13y5 *dp, &lv = *(dp=new (buf) G24x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G24x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x13y5)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,28), "G24x13y5");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,36), "G24x13y5");
    check_base_class_offset(lv, (C24*)(E24x13*), ABISELECT(32,24), "G24x13y5");
    check_base_class_offset(lv, (D0*)(E24x13*), ABISELECT(24,16), "G24x13y5");
    check_base_class_offset(lv, (E24x13*), ABISELECT(16,12), "G24x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G24x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x13y5.ff");
    test_class_info(&lv, &cd_G24x13y5);
    dp->~G24x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x13y5(Test_G24x13y5, "G24x13y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G24x13y5C1Ev();
extern void _ZN8G24x13y5D1Ev();
Name_Map name_map_G24x13y5[] = {
  NSPAIR(_ZN8G24x13y5C1Ev),
  NSPAIR(_ZN8G24x13y5D1Ev),
  {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_E24x13;
extern VTBL_ENTRY _ZTI6E24x13[];
extern  VTBL_ENTRY _ZTV6E24x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x13y5[] = {
  // 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
    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_E24x13,    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_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 _ZTI8G24x13y5[];
extern void _ZN6E24x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv)();
extern void ABISELECT(_ZThn16_N6E24x133fooEv,_ZThn12_N6E24x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G24x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G24x13y5[0]),
  (VTBL_ENTRY)&_ZN6E24x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G24x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv),
};
extern VTBL_ENTRY _ZTV8G24x13y5[];
extern void _ZN6E24x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x13__8G24x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x13[0]),
  (VTBL_ENTRY)&_ZN6E24x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv)();
extern void ABISELECT(_ZThn16_N6E24x133fooEv,_ZThn12_N6E24x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C24__6E24x13__8G24x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E24x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__8G24x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x13y5[] = {
  {&(_ZTV8G24x13y5[5]),  5,16},
  {&(_ZTV8G24x13y5[10]),  10,16},
  {&(_ZTV8G24x13y5[15]),  15,16},
  {&(_tg__ZTV6E24x13__8G24x13y5[4]),  4,5},
  {&(_tg__ZTV3C24__6E24x13__8G24x13y5[4]),  4,5},
  {&(_tg__ZTV3C24__8G24x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x13y5[];
extern  VTBL_ENTRY _ZTV8G24x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x13y5[];
static VTBL_ENTRY alt_thunk_names320[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x133fooEv,_ZThn12_N6E24x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x133fooEv,_ZThn12_N6E24x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G24x13y5 = {  "G24x13y5", // class name
  bases_G24x13y5, 6,
  &(vtc_G24x13y5[0]), // expected_vtbl_contents
  &(vtt_G24x13y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G24x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x13y5),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x13y5),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names320,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x13y6  : E24x13 , virtual F0 {
  int ff;
  ~G24x13y6(); // tgen
  G24x13y6(); // tgen
};
//SIG(1 G24x13y6) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G24x13y6 ::~G24x13y6(){ note_dtor("G24x13y6", this);} // tgen
G24x13y6 ::G24x13y6(){ note_ctor("G24x13y6", this);} // tgen

static void Test_G24x13y6()
{
  extern Class_Descriptor cd_G24x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x13y6, buf);
    G24x13y6 *dp, &lv = *(dp=new (buf) G24x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x13y6)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(32,20), "G24x13y6");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(40,28), "G24x13y6");
    check_base_class_offset(lv, (C24*)(E24x13*), ABISELECT(24,16), "G24x13y6");
    check_base_class_offset(lv, (D0*)(E24x13*), ABISELECT(8,4), "G24x13y6");
    check_base_class_offset(lv, (E24x13*), 0, "G24x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G24x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G24x13y6.ff");
    test_class_info(&lv, &cd_G24x13y6);
    dp->~G24x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x13y6(Test_G24x13y6, "G24x13y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G24x13y6C1Ev();
extern void _ZN8G24x13y6D1Ev();
Name_Map name_map_G24x13y6[] = {
  NSPAIR(_ZN8G24x13y6C1Ev),
  NSPAIR(_ZN8G24x13y6D1Ev),
  {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_E24x13;
extern VTBL_ENTRY _ZTI6E24x13[];
extern  VTBL_ENTRY _ZTV6E24x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x13y6[] = {
  // 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
    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_E24x13,    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 _ZTI8G24x13y6[];
extern void _ZN6E24x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv)();
extern void ABISELECT(_ZThn24_N6E24x133fooEv,_ZThn16_N6E24x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G24x13y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x13y6[0]),
  (VTBL_ENTRY)&_ZN6E24x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G24x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv),
};
extern VTBL_ENTRY _ZTV8G24x13y6[];
extern void _ZN6E24x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x13__8G24x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x13[0]),
  (VTBL_ENTRY)&_ZN6E24x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv)();
extern void ABISELECT(_ZThn24_N6E24x133fooEv,_ZThn16_N6E24x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C24__6E24x13__8G24x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E24x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__8G24x13y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x13y6[] = {
  {&(_ZTV8G24x13y6[5]),  5,11},
  {&(_tg__ZTV6E24x13__8G24x13y6[4]),  4,5},
  {&(_tg__ZTV3C24__6E24x13__8G24x13y6[4]),  4,5},
  {&(_ZTV8G24x13y6[10]),  10,11},
  {&(_tg__ZTV3C24__8G24x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x13y6[];
extern  VTBL_ENTRY _ZTV8G24x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x13y6[];
static VTBL_ENTRY alt_thunk_names321[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E24x133fooEv,_ZThn16_N6E24x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E24x133fooEv,_ZThn16_N6E24x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G24x13y6 = {  "G24x13y6", // class name
  bases_G24x13y6, 6,
  &(vtc_G24x13y6[0]), // expected_vtbl_contents
  &(vtt_G24x13y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G24x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x13y6),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x13y6),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names321,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x13y7  : virtual E24x13 , virtual F0 {
  int ff;
  ~G24x13y7(); // tgen
  G24x13y7(); // tgen
};
//SIG(1 G24x13y7) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G24x13y7 ::~G24x13y7(){ note_dtor("G24x13y7", this);} // tgen
G24x13y7 ::G24x13y7(){ note_ctor("G24x13y7", this);} // tgen

static void Test_G24x13y7()
{
  extern Class_Descriptor cd_G24x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G24x13y7, buf);
    G24x13y7 *dp, &lv = *(dp=new (buf) G24x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G24x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x13y7)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,24), "G24x13y7");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,32), "G24x13y7");
    check_base_class_offset(lv, (C24*)(E24x13*), ABISELECT(32,20), "G24x13y7");
    check_base_class_offset(lv, (D0*)(E24x13*), ABISELECT(24,12), "G24x13y7");
    check_base_class_offset(lv, (E24x13*), ABISELECT(16,8), "G24x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G24x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G24x13y7.ff");
    test_class_info(&lv, &cd_G24x13y7);
    dp->~G24x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x13y7(Test_G24x13y7, "G24x13y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G24x13y7C1Ev();
extern void _ZN8G24x13y7D1Ev();
Name_Map name_map_G24x13y7[] = {
  NSPAIR(_ZN8G24x13y7C1Ev),
  NSPAIR(_ZN8G24x13y7D1Ev),
  {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_E24x13;
extern VTBL_ENTRY _ZTI6E24x13[];
extern  VTBL_ENTRY _ZTV6E24x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x13y7[] = {
  // 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(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_E24x13,    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_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 _ZTI8G24x13y7[];
extern void _ZN6E24x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv)();
extern void ABISELECT(_ZThn16_N6E24x133fooEv,_ZThn12_N6E24x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G24x13y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G24x13y7[0]),
  (VTBL_ENTRY)&_ZN6E24x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G24x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv),
};
extern VTBL_ENTRY _ZTV8G24x13y7[];
extern void _ZN6E24x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x13__8G24x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x13[0]),
  (VTBL_ENTRY)&_ZN6E24x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv)();
extern void ABISELECT(_ZThn16_N6E24x133fooEv,_ZThn12_N6E24x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C24__6E24x13__8G24x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E24x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__8G24x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x13y7[] = {
  {&(_ZTV8G24x13y7[6]),  6,17},
  {&(_ZTV8G24x13y7[11]),  11,17},
  {&(_ZTV8G24x13y7[16]),  16,17},
  {&(_tg__ZTV6E24x13__8G24x13y7[4]),  4,5},
  {&(_tg__ZTV3C24__6E24x13__8G24x13y7[4]),  4,5},
  {&(_tg__ZTV3C24__8G24x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x13y7[];
extern  VTBL_ENTRY _ZTV8G24x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x13y7[];
static VTBL_ENTRY alt_thunk_names322[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E24x133fooEv,_ZTv0_n16_N6E24x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x133fooEv,_ZThn12_N6E24x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x133fooEv,_ZThn12_N6E24x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G24x13y7 = {  "G24x13y7", // class name
  bases_G24x13y7, 6,
  &(vtc_G24x13y7[0]), // expected_vtbl_contents
  &(vtt_G24x13y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G24x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x13y7),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x13y7),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names322,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E25x13  : virtual C25 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E25x133fooEv
  ~E25x13(); // tgen
  E25x13(); // tgen
};
//SIG(-1 E25x13) C1{ VBC2{ BC3{ v1 Fi} VBC4{ Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E25x13 ::foo(){vfunc_called(this, "_ZN6E25x133fooEv");}
E25x13 ::~E25x13(){ note_dtor("E25x13", this);} // tgen
E25x13 ::E25x13(){ note_ctor("E25x13", this);} // tgen

static void Test_E25x13()
{
  extern Class_Descriptor cd_E25x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E25x13, buf);
    E25x13 *dp, &lv = *(dp=new (buf) E25x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E25x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E25x13)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(16,12), "E25x13");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(32,24), "E25x13");
    check_base_class_offset(lv, (C25*), ABISELECT(16,12), "E25x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E25x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E25x13.fd");
    test_class_info(&lv, &cd_E25x13);
    dp->~E25x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE25x13(Test_E25x13, "E25x13", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E25x13C1Ev();
extern void _ZN6E25x13D1Ev();
Name_Map name_map_E25x13[] = {
  NSPAIR(_ZN6E25x13C1Ev),
  NSPAIR(_ZN6E25x13D1Ev),
  {0,0}
};
extern Class_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_E25x13[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6E25x13[];
extern void _ZN6E25x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv)();
extern void ABISELECT(_ZThn16_N6E25x133fooEv,_ZThn12_N6E25x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E25x13[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x13[0]),
  (VTBL_ENTRY)&_ZN6E25x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E25x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv),
};
extern VTBL_ENTRY _ZTV6E25x13[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__6E25x13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_E25x13[] = {
  {&(_ZTV6E25x13[4]),  4,10},
  {&(_ZTV6E25x13[9]),  9,10},
  {&(_tg__ZTV3C25__6E25x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E25x13[];
extern  VTBL_ENTRY _ZTV6E25x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x13[];
static VTBL_ENTRY alt_thunk_names323[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x133fooEv,_ZThn12_N6E25x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E25x13 = {  "E25x13", // class name
  bases_E25x13, 4,
  &(vtc_E25x13[0]), // expected_vtbl_contents
  &(vtt_E25x13[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E25x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E25x13),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E25x13),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names323,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x13y0  : E25x13 , F1 {
  int ff;
  ~G25x13y0(); // tgen
  G25x13y0(); // tgen
};
//SIG(1 G25x13y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G25x13y0 ::~G25x13y0(){ note_dtor("G25x13y0", this);} // tgen
G25x13y0 ::G25x13y0(){ note_ctor("G25x13y0", this);} // tgen

static void Test_G25x13y0()
{
  extern Class_Descriptor cd_G25x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G25x13y0, buf);
    G25x13y0 *dp, &lv = *(dp=new (buf) G25x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G25x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x13y0)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,24), "G25x13y0");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,36), "G25x13y0");
    check_base_class_offset(lv, (C25*)(E25x13*), ABISELECT(32,24), "G25x13y0");
    check_base_class_offset(lv, (D0*)(E25x13*), ABISELECT(8,4), "G25x13y0");
    check_base_class_offset(lv, (E25x13*), 0, "G25x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G25x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G25x13y0.ff");
    test_class_info(&lv, &cd_G25x13y0);
    dp->~G25x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x13y0(Test_G25x13y0, "G25x13y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G25x13y0C1Ev();
extern void _ZN8G25x13y0D1Ev();
Name_Map name_map_G25x13y0[] = {
  NSPAIR(_ZN8G25x13y0C1Ev),
  NSPAIR(_ZN8G25x13y0D1Ev),
  {0,0}
};
extern Class_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_E25x13;
extern VTBL_ENTRY _ZTI6E25x13[];
extern  VTBL_ENTRY _ZTV6E25x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x13y0[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E25x13,    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
    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 _ZTI8G25x13y0[];
extern void _ZN6E25x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv)();
extern void ABISELECT(_ZThn32_N6E25x133fooEv,_ZThn24_N6E25x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G25x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x13y0[0]),
  (VTBL_ENTRY)&_ZN6E25x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G25x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G25x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv),
};
extern VTBL_ENTRY _ZTV8G25x13y0[];
extern void _ZN6E25x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x13__8G25x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x13[0]),
  (VTBL_ENTRY)&_ZN6E25x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv)();
extern void ABISELECT(_ZThn32_N6E25x133fooEv,_ZThn24_N6E25x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C25__6E25x13__8G25x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E25x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__8G25x13y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x13y0[] = {
  {&(_ZTV8G25x13y0[4]),  4,13},
  {&(_tg__ZTV6E25x13__8G25x13y0[4]),  4,5},
  {&(_tg__ZTV3C25__6E25x13__8G25x13y0[4]),  4,5},
  {&(_ZTV8G25x13y0[12]),  12,13},
  {&(_tg__ZTV3C25__8G25x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x13y0[];
extern  VTBL_ENTRY _ZTV8G25x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x13y0[];
static VTBL_ENTRY alt_thunk_names324[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E25x133fooEv,_ZThn24_N6E25x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E25x133fooEv,_ZThn24_N6E25x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G25x13y0 = {  "G25x13y0", // class name
  bases_G25x13y0, 6,
  &(vtc_G25x13y0[0]), // expected_vtbl_contents
  &(vtt_G25x13y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G25x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x13y0),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x13y0),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names324,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x13y1  : virtual E25x13 , F1 {
  int ff;
  ~G25x13y1(); // tgen
  G25x13y1(); // tgen
};
//SIG(1 G25x13y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G25x13y1 ::~G25x13y1(){ note_dtor("G25x13y1", this);} // tgen
G25x13y1 ::G25x13y1(){ note_ctor("G25x13y1", this);} // tgen

static void Test_G25x13y1()
{
  extern Class_Descriptor cd_G25x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G25x13y1, buf);
    G25x13y1 *dp, &lv = *(dp=new (buf) G25x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G25x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x13y1)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,24), "G25x13y1");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,36), "G25x13y1");
    check_base_class_offset(lv, (C25*)(E25x13*), ABISELECT(32,24), "G25x13y1");
    check_base_class_offset(lv, (D0*)(E25x13*), ABISELECT(24,16), "G25x13y1");
    check_base_class_offset(lv, (E25x13*), ABISELECT(16,12), "G25x13y1");
    check_base_class_offset(lv, (F1*), 0, "G25x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x13y1.ff");
    test_class_info(&lv, &cd_G25x13y1);
    dp->~G25x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x13y1(Test_G25x13y1, "G25x13y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G25x13y1C1Ev();
extern void _ZN8G25x13y1D1Ev();
Name_Map name_map_G25x13y1[] = {
  NSPAIR(_ZN8G25x13y1C1Ev),
  NSPAIR(_ZN8G25x13y1D1Ev),
  {0,0}
};
extern Class_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_E25x13;
extern VTBL_ENTRY _ZTI6E25x13[];
extern  VTBL_ENTRY _ZTV6E25x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x13y1[] = {
  // 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
    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(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_E25x13,    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 _ZTI8G25x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E25x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv)();
extern void ABISELECT(_ZThn16_N6E25x133fooEv,_ZThn12_N6E25x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G25x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G25x13y1[0]),
  (VTBL_ENTRY)&_ZN6E25x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G25x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv),
};
extern VTBL_ENTRY _ZTV8G25x13y1[];
extern void _ZN6E25x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x13__8G25x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x13[0]),
  (VTBL_ENTRY)&_ZN6E25x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv)();
extern void ABISELECT(_ZThn16_N6E25x133fooEv,_ZThn12_N6E25x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C25__6E25x13__8G25x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E25x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__8G25x13y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x13y1[] = {
  {&(_ZTV8G25x13y1[5]),  5,17},
  {&(_ZTV8G25x13y1[11]),  11,17},
  {&(_ZTV8G25x13y1[16]),  16,17},
  {&(_tg__ZTV6E25x13__8G25x13y1[4]),  4,5},
  {&(_tg__ZTV3C25__6E25x13__8G25x13y1[4]),  4,5},
  {&(_tg__ZTV3C25__8G25x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x13y1[];
extern  VTBL_ENTRY _ZTV8G25x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x13y1[];
static VTBL_ENTRY alt_thunk_names325[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x133fooEv,_ZThn12_N6E25x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x133fooEv,_ZThn12_N6E25x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G25x13y1 = {  "G25x13y1", // class name
  bases_G25x13y1, 6,
  &(vtc_G25x13y1[0]), // expected_vtbl_contents
  &(vtt_G25x13y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G25x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x13y1),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x13y1),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names325,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x13y2  : E25x13 , virtual F1 {
  int ff;
  ~G25x13y2(); // tgen
  G25x13y2(); // tgen
};
//SIG(1 G25x13y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G25x13y2 ::~G25x13y2(){ note_dtor("G25x13y2", this);} // tgen
G25x13y2 ::G25x13y2(){ note_ctor("G25x13y2", this);} // tgen

static void Test_G25x13y2()
{
  extern Class_Descriptor cd_G25x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G25x13y2, buf);
    G25x13y2 *dp, &lv = *(dp=new (buf) G25x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G25x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x13y2)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(24,16), "G25x13y2");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(40,28), "G25x13y2");
    check_base_class_offset(lv, (C25*)(E25x13*), ABISELECT(24,16), "G25x13y2");
    check_base_class_offset(lv, (D0*)(E25x13*), ABISELECT(8,4), "G25x13y2");
    check_base_class_offset(lv, (E25x13*), 0, "G25x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G25x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G25x13y2.ff");
    test_class_info(&lv, &cd_G25x13y2);
    dp->~G25x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x13y2(Test_G25x13y2, "G25x13y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G25x13y2C1Ev();
extern void _ZN8G25x13y2D1Ev();
Name_Map name_map_G25x13y2[] = {
  NSPAIR(_ZN8G25x13y2C1Ev),
  NSPAIR(_ZN8G25x13y2D1Ev),
  {0,0}
};
extern Class_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_E25x13;
extern VTBL_ENTRY _ZTI6E25x13[];
extern  VTBL_ENTRY _ZTV6E25x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x13y2[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E25x13,    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
    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 _ZTI8G25x13y2[];
extern void _ZN6E25x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv)();
extern void ABISELECT(_ZThn24_N6E25x133fooEv,_ZThn16_N6E25x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x13y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x13y2[0]),
  (VTBL_ENTRY)&_ZN6E25x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G25x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G25x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G25x13y2[];
extern void _ZN6E25x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x13__8G25x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x13[0]),
  (VTBL_ENTRY)&_ZN6E25x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv)();
extern void ABISELECT(_ZThn24_N6E25x133fooEv,_ZThn16_N6E25x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C25__6E25x13__8G25x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E25x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__8G25x13y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x13y2[] = {
  {&(_ZTV8G25x13y2[5]),  5,15},
  {&(_tg__ZTV6E25x13__8G25x13y2[4]),  4,5},
  {&(_tg__ZTV3C25__6E25x13__8G25x13y2[4]),  4,5},
  {&(_ZTV8G25x13y2[10]),  10,15},
  {&(_ZTV8G25x13y2[14]),  14,15},
  {&(_tg__ZTV3C25__8G25x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x13y2[];
extern  VTBL_ENTRY _ZTV8G25x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x13y2[];
static VTBL_ENTRY alt_thunk_names326[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E25x133fooEv,_ZThn16_N6E25x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E25x133fooEv,_ZThn16_N6E25x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G25x13y2 = {  "G25x13y2", // class name
  bases_G25x13y2, 6,
  &(vtc_G25x13y2[0]), // expected_vtbl_contents
  &(vtt_G25x13y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G25x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x13y2),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x13y2),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names326,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x13y3  : virtual E25x13 , virtual F1 {
  int ff;
  ~G25x13y3(); // tgen
  G25x13y3(); // tgen
};
//SIG(1 G25x13y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G25x13y3 ::~G25x13y3(){ note_dtor("G25x13y3", this);} // tgen
G25x13y3 ::G25x13y3(){ note_ctor("G25x13y3", this);} // tgen

static void Test_G25x13y3()
{
  extern Class_Descriptor cd_G25x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G25x13y3, buf);
    G25x13y3 *dp, &lv = *(dp=new (buf) G25x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G25x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x13y3)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,20), "G25x13y3");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,32), "G25x13y3");
    check_base_class_offset(lv, (C25*)(E25x13*), ABISELECT(32,20), "G25x13y3");
    check_base_class_offset(lv, (D0*)(E25x13*), ABISELECT(24,12), "G25x13y3");
    check_base_class_offset(lv, (E25x13*), ABISELECT(16,8), "G25x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G25x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G25x13y3.ff");
    test_class_info(&lv, &cd_G25x13y3);
    dp->~G25x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x13y3(Test_G25x13y3, "G25x13y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G25x13y3C1Ev();
extern void _ZN8G25x13y3D1Ev();
Name_Map name_map_G25x13y3[] = {
  NSPAIR(_ZN8G25x13y3C1Ev),
  NSPAIR(_ZN8G25x13y3D1Ev),
  {0,0}
};
extern Class_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_E25x13;
extern VTBL_ENTRY _ZTI6E25x13[];
extern  VTBL_ENTRY _ZTV6E25x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x13y3[] = {
  // 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
    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_E25x13,    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
    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 _ZTI8G25x13y3[];
extern void _ZN6E25x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv)();
extern void ABISELECT(_ZThn16_N6E25x133fooEv,_ZThn12_N6E25x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x13y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G25x13y3[0]),
  (VTBL_ENTRY)&_ZN6E25x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G25x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G25x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G25x13y3[];
extern void _ZN6E25x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x13__8G25x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x13[0]),
  (VTBL_ENTRY)&_ZN6E25x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv)();
extern void ABISELECT(_ZThn16_N6E25x133fooEv,_ZThn12_N6E25x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C25__6E25x13__8G25x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E25x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__8G25x13y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x13y3[] = {
  {&(_ZTV8G25x13y3[6]),  6,21},
  {&(_ZTV8G25x13y3[11]),  11,21},
  {&(_ZTV8G25x13y3[16]),  16,21},
  {&(_ZTV8G25x13y3[20]),  20,21},
  {&(_tg__ZTV6E25x13__8G25x13y3[4]),  4,5},
  {&(_tg__ZTV3C25__6E25x13__8G25x13y3[4]),  4,5},
  {&(_tg__ZTV3C25__8G25x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x13y3[];
extern  VTBL_ENTRY _ZTV8G25x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x13y3[];
static VTBL_ENTRY alt_thunk_names327[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x133fooEv,_ZThn12_N6E25x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x133fooEv,_ZThn12_N6E25x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G25x13y3 = {  "G25x13y3", // class name
  bases_G25x13y3, 6,
  &(vtc_G25x13y3[0]), // expected_vtbl_contents
  &(vtt_G25x13y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G25x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x13y3),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x13y3),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names327,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x13y4  : E25x13 , F0 {
  int ff;
  ~G25x13y4(); // tgen
  G25x13y4(); // tgen
};
//SIG(1 G25x13y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G25x13y4 ::~G25x13y4(){ note_dtor("G25x13y4", this);} // tgen
G25x13y4 ::G25x13y4(){ note_ctor("G25x13y4", this);} // tgen

static void Test_G25x13y4()
{
  extern Class_Descriptor cd_G25x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x13y4, buf);
    G25x13y4 *dp, &lv = *(dp=new (buf) G25x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x13y4)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(24,20), "G25x13y4");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(40,32), "G25x13y4");
    check_base_class_offset(lv, (C25*)(E25x13*), ABISELECT(24,20), "G25x13y4");
    check_base_class_offset(lv, (D0*)(E25x13*), ABISELECT(8,4), "G25x13y4");
    check_base_class_offset(lv, (E25x13*), 0, "G25x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G25x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G25x13y4.ff");
    test_class_info(&lv, &cd_G25x13y4);
    dp->~G25x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x13y4(Test_G25x13y4, "G25x13y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G25x13y4C1Ev();
extern void _ZN8G25x13y4D1Ev();
Name_Map name_map_G25x13y4[] = {
  NSPAIR(_ZN8G25x13y4C1Ev),
  NSPAIR(_ZN8G25x13y4D1Ev),
  {0,0}
};
extern Class_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_E25x13;
extern VTBL_ENTRY _ZTI6E25x13[];
extern  VTBL_ENTRY _ZTV6E25x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x13y4[] = {
  // 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
    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_E25x13,    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 _ZTI8G25x13y4[];
extern void _ZN6E25x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv)();
extern void ABISELECT(_ZThn24_N6E25x133fooEv,_ZThn20_N6E25x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G25x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x13y4[0]),
  (VTBL_ENTRY)&_ZN6E25x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G25x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv),
};
extern VTBL_ENTRY _ZTV8G25x13y4[];
extern void _ZN6E25x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x13__8G25x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x13[0]),
  (VTBL_ENTRY)&_ZN6E25x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv)();
extern void ABISELECT(_ZThn24_N6E25x133fooEv,_ZThn20_N6E25x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C25__6E25x13__8G25x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E25x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__8G25x13y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x13y4[] = {
  {&(_ZTV8G25x13y4[4]),  4,10},
  {&(_tg__ZTV6E25x13__8G25x13y4[4]),  4,5},
  {&(_tg__ZTV3C25__6E25x13__8G25x13y4[4]),  4,5},
  {&(_ZTV8G25x13y4[9]),  9,10},
  {&(_tg__ZTV3C25__8G25x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x13y4[];
extern  VTBL_ENTRY _ZTV8G25x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x13y4[];
static VTBL_ENTRY alt_thunk_names328[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E25x133fooEv,_ZThn20_N6E25x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E25x133fooEv,_ZThn20_N6E25x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G25x13y4 = {  "G25x13y4", // class name
  bases_G25x13y4, 6,
  &(vtc_G25x13y4[0]), // expected_vtbl_contents
  &(vtt_G25x13y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G25x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x13y4),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x13y4),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names328,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x13y5  : virtual E25x13 , F0 {
  int ff;
  ~G25x13y5(); // tgen
  G25x13y5(); // tgen
};
//SIG(1 G25x13y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G25x13y5 ::~G25x13y5(){ note_dtor("G25x13y5", this);} // tgen
G25x13y5 ::G25x13y5(){ note_ctor("G25x13y5", this);} // tgen

static void Test_G25x13y5()
{
  extern Class_Descriptor cd_G25x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G25x13y5, buf);
    G25x13y5 *dp, &lv = *(dp=new (buf) G25x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G25x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x13y5)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,24), "G25x13y5");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,36), "G25x13y5");
    check_base_class_offset(lv, (C25*)(E25x13*), ABISELECT(32,24), "G25x13y5");
    check_base_class_offset(lv, (D0*)(E25x13*), ABISELECT(24,16), "G25x13y5");
    check_base_class_offset(lv, (E25x13*), ABISELECT(16,12), "G25x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G25x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x13y5.ff");
    test_class_info(&lv, &cd_G25x13y5);
    dp->~G25x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x13y5(Test_G25x13y5, "G25x13y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G25x13y5C1Ev();
extern void _ZN8G25x13y5D1Ev();
Name_Map name_map_G25x13y5[] = {
  NSPAIR(_ZN8G25x13y5C1Ev),
  NSPAIR(_ZN8G25x13y5D1Ev),
  {0,0}
};
extern Class_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_E25x13;
extern VTBL_ENTRY _ZTI6E25x13[];
extern  VTBL_ENTRY _ZTV6E25x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x13y5[] = {
  // 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
    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(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_E25x13,    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 _ZTI8G25x13y5[];
extern void _ZN6E25x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv)();
extern void ABISELECT(_ZThn16_N6E25x133fooEv,_ZThn12_N6E25x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G25x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G25x13y5[0]),
  (VTBL_ENTRY)&_ZN6E25x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G25x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv),
};
extern VTBL_ENTRY _ZTV8G25x13y5[];
extern void _ZN6E25x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x13__8G25x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x13[0]),
  (VTBL_ENTRY)&_ZN6E25x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv)();
extern void ABISELECT(_ZThn16_N6E25x133fooEv,_ZThn12_N6E25x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C25__6E25x13__8G25x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E25x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__8G25x13y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x13y5[] = {
  {&(_ZTV8G25x13y5[5]),  5,16},
  {&(_ZTV8G25x13y5[10]),  10,16},
  {&(_ZTV8G25x13y5[15]),  15,16},
  {&(_tg__ZTV6E25x13__8G25x13y5[4]),  4,5},
  {&(_tg__ZTV3C25__6E25x13__8G25x13y5[4]),  4,5},
  {&(_tg__ZTV3C25__8G25x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x13y5[];
extern  VTBL_ENTRY _ZTV8G25x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x13y5[];
static VTBL_ENTRY alt_thunk_names329[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x133fooEv,_ZThn12_N6E25x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x133fooEv,_ZThn12_N6E25x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G25x13y5 = {  "G25x13y5", // class name
  bases_G25x13y5, 6,
  &(vtc_G25x13y5[0]), // expected_vtbl_contents
  &(vtt_G25x13y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G25x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x13y5),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x13y5),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names329,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x13y6  : E25x13 , virtual F0 {
  int ff;
  ~G25x13y6(); // tgen
  G25x13y6(); // tgen
};
//SIG(1 G25x13y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G25x13y6 ::~G25x13y6(){ note_dtor("G25x13y6", this);} // tgen
G25x13y6 ::G25x13y6(){ note_ctor("G25x13y6", this);} // tgen

static void Test_G25x13y6()
{
  extern Class_Descriptor cd_G25x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x13y6, buf);
    G25x13y6 *dp, &lv = *(dp=new (buf) G25x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x13y6)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(24,16), "G25x13y6");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(40,28), "G25x13y6");
    check_base_class_offset(lv, (C25*)(E25x13*), ABISELECT(24,16), "G25x13y6");
    check_base_class_offset(lv, (D0*)(E25x13*), ABISELECT(8,4), "G25x13y6");
    check_base_class_offset(lv, (E25x13*), 0, "G25x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G25x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G25x13y6.ff");
    test_class_info(&lv, &cd_G25x13y6);
    dp->~G25x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x13y6(Test_G25x13y6, "G25x13y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G25x13y6C1Ev();
extern void _ZN8G25x13y6D1Ev();
Name_Map name_map_G25x13y6[] = {
  NSPAIR(_ZN8G25x13y6C1Ev),
  NSPAIR(_ZN8G25x13y6D1Ev),
  {0,0}
};
extern Class_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_E25x13;
extern VTBL_ENTRY _ZTI6E25x13[];
extern  VTBL_ENTRY _ZTV6E25x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x13y6[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E25x13,    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 _ZTI8G25x13y6[];
extern void _ZN6E25x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv)();
extern void ABISELECT(_ZThn24_N6E25x133fooEv,_ZThn16_N6E25x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G25x13y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x13y6[0]),
  (VTBL_ENTRY)&_ZN6E25x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G25x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv),
};
extern VTBL_ENTRY _ZTV8G25x13y6[];
extern void _ZN6E25x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x13__8G25x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x13[0]),
  (VTBL_ENTRY)&_ZN6E25x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv)();
extern void ABISELECT(_ZThn24_N6E25x133fooEv,_ZThn16_N6E25x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C25__6E25x13__8G25x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E25x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__8G25x13y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x13y6[] = {
  {&(_ZTV8G25x13y6[5]),  5,11},
  {&(_tg__ZTV6E25x13__8G25x13y6[4]),  4,5},
  {&(_tg__ZTV3C25__6E25x13__8G25x13y6[4]),  4,5},
  {&(_ZTV8G25x13y6[10]),  10,11},
  {&(_tg__ZTV3C25__8G25x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x13y6[];
extern  VTBL_ENTRY _ZTV8G25x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x13y6[];
static VTBL_ENTRY alt_thunk_names330[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E25x133fooEv,_ZThn16_N6E25x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E25x133fooEv,_ZThn16_N6E25x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G25x13y6 = {  "G25x13y6", // class name
  bases_G25x13y6, 6,
  &(vtc_G25x13y6[0]), // expected_vtbl_contents
  &(vtt_G25x13y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G25x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x13y6),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x13y6),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names330,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x13y7  : virtual E25x13 , virtual F0 {
  int ff;
  ~G25x13y7(); // tgen
  G25x13y7(); // tgen
};
//SIG(1 G25x13y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G25x13y7 ::~G25x13y7(){ note_dtor("G25x13y7", this);} // tgen
G25x13y7 ::G25x13y7(){ note_ctor("G25x13y7", this);} // tgen

static void Test_G25x13y7()
{
  extern Class_Descriptor cd_G25x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G25x13y7, buf);
    G25x13y7 *dp, &lv = *(dp=new (buf) G25x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G25x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x13y7)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,20), "G25x13y7");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,32), "G25x13y7");
    check_base_class_offset(lv, (C25*)(E25x13*), ABISELECT(32,20), "G25x13y7");
    check_base_class_offset(lv, (D0*)(E25x13*), ABISELECT(24,12), "G25x13y7");
    check_base_class_offset(lv, (E25x13*), ABISELECT(16,8), "G25x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G25x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G25x13y7.ff");
    test_class_info(&lv, &cd_G25x13y7);
    dp->~G25x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x13y7(Test_G25x13y7, "G25x13y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G25x13y7C1Ev();
extern void _ZN8G25x13y7D1Ev();
Name_Map name_map_G25x13y7[] = {
  NSPAIR(_ZN8G25x13y7C1Ev),
  NSPAIR(_ZN8G25x13y7D1Ev),
  {0,0}
};
extern Class_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_E25x13;
extern VTBL_ENTRY _ZTI6E25x13[];
extern  VTBL_ENTRY _ZTV6E25x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x13y7[] = {
  // 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(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_E25x13,    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 _ZTI8G25x13y7[];
extern void _ZN6E25x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv)();
extern void ABISELECT(_ZThn16_N6E25x133fooEv,_ZThn12_N6E25x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G25x13y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G25x13y7[0]),
  (VTBL_ENTRY)&_ZN6E25x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G25x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv),
};
extern VTBL_ENTRY _ZTV8G25x13y7[];
extern void _ZN6E25x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x13__8G25x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x13[0]),
  (VTBL_ENTRY)&_ZN6E25x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv)();
extern void ABISELECT(_ZThn16_N6E25x133fooEv,_ZThn12_N6E25x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C25__6E25x13__8G25x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E25x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__8G25x13y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x13y7[] = {
  {&(_ZTV8G25x13y7[6]),  6,17},
  {&(_ZTV8G25x13y7[11]),  11,17},
  {&(_ZTV8G25x13y7[16]),  16,17},
  {&(_tg__ZTV6E25x13__8G25x13y7[4]),  4,5},
  {&(_tg__ZTV3C25__6E25x13__8G25x13y7[4]),  4,5},
  {&(_tg__ZTV3C25__8G25x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x13y7[];
extern  VTBL_ENTRY _ZTV8G25x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x13y7[];
static VTBL_ENTRY alt_thunk_names331[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E25x133fooEv,_ZTv0_n16_N6E25x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x133fooEv,_ZThn12_N6E25x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x133fooEv,_ZThn12_N6E25x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G25x13y7 = {  "G25x13y7", // class name
  bases_G25x13y7, 6,
  &(vtc_G25x13y7[0]), // expected_vtbl_contents
  &(vtt_G25x13y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G25x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x13y7),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x13y7),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names331,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E26x13  : virtual C26 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E26x133fooEv
  ~E26x13(); // tgen
  E26x13(); // tgen
};
//SIG(-1 E26x13) C1{ VBC2{ VBC3{ Fi} VBC4{ Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E26x13 ::foo(){vfunc_called(this, "_ZN6E26x133fooEv");}
E26x13 ::~E26x13(){ note_dtor("E26x13", this);} // tgen
E26x13 ::E26x13(){ note_ctor("E26x13", this);} // tgen

static void Test_E26x13()
{
  extern Class_Descriptor cd_E26x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E26x13, buf);
    E26x13 *dp, &lv = *(dp=new (buf) E26x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E26x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E26x13)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(28,20), "E26x13");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(32,24), "E26x13");
    check_base_class_offset(lv, (C26*), ABISELECT(16,12), "E26x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E26x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E26x13.fd");
    test_class_info(&lv, &cd_E26x13);
    dp->~E26x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE26x13(Test_E26x13, "E26x13", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E26x13C1Ev();
extern void _ZN6E26x13D1Ev();
Name_Map name_map_E26x13[] = {
  NSPAIR(_ZN6E26x13C1Ev),
  NSPAIR(_ZN6E26x13D1Ev),
  {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_E26x13[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6E26x13[];
extern void _ZN6E26x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv)();
extern void ABISELECT(_ZThn16_N6E26x133fooEv,_ZThn12_N6E26x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E26x13[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x13[0]),
  (VTBL_ENTRY)&_ZN6E26x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E26x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv),
};
extern VTBL_ENTRY _ZTV6E26x13[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__6E26x13[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_E26x13[] = {
  {&(_ZTV6E26x13[5]),  5,12},
  {&(_ZTV6E26x13[11]),  11,12},
  {&(_tg__ZTV3C26__6E26x13[4]),  4,5},
};
extern VTBL_ENTRY _ZTI6E26x13[];
extern  VTBL_ENTRY _ZTV6E26x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x13[];
static VTBL_ENTRY alt_thunk_names332[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x133fooEv,_ZThn12_N6E26x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E26x13 = {  "E26x13", // class name
  bases_E26x13, 4,
  &(vtc_E26x13[0]), // expected_vtbl_contents
  &(vtt_E26x13[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E26x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E26x13),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E26x13),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names332,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x13y0  : E26x13 , F1 {
  int ff;
  ~G26x13y0(); // tgen
  G26x13y0(); // tgen
};
//SIG(1 G26x13y0) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G26x13y0 ::~G26x13y0(){ note_dtor("G26x13y0", this);} // tgen
G26x13y0 ::G26x13y0(){ note_ctor("G26x13y0", this);} // tgen

static void Test_G26x13y0()
{
  extern Class_Descriptor cd_G26x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G26x13y0, buf);
    G26x13y0 *dp, &lv = *(dp=new (buf) G26x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G26x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x13y0)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,32), "G26x13y0");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,36), "G26x13y0");
    check_base_class_offset(lv, (C26*)(E26x13*), ABISELECT(32,24), "G26x13y0");
    check_base_class_offset(lv, (D0*)(E26x13*), ABISELECT(8,4), "G26x13y0");
    check_base_class_offset(lv, (E26x13*), 0, "G26x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G26x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G26x13y0.ff");
    test_class_info(&lv, &cd_G26x13y0);
    dp->~G26x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x13y0(Test_G26x13y0, "G26x13y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G26x13y0C1Ev();
extern void _ZN8G26x13y0D1Ev();
Name_Map name_map_G26x13y0[] = {
  NSPAIR(_ZN8G26x13y0C1Ev),
  NSPAIR(_ZN8G26x13y0D1Ev),
  {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_E26x13;
extern VTBL_ENTRY _ZTI6E26x13[];
extern  VTBL_ENTRY _ZTV6E26x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x13y0[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E26x13,    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 _ZTI8G26x13y0[];
extern void _ZN6E26x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv)();
extern void ABISELECT(_ZThn32_N6E26x133fooEv,_ZThn24_N6E26x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G26x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x13y0[0]),
  (VTBL_ENTRY)&_ZN6E26x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G26x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G26x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv),
};
extern VTBL_ENTRY _ZTV8G26x13y0[];
extern void _ZN6E26x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x13__8G26x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x13[0]),
  (VTBL_ENTRY)&_ZN6E26x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv)();
extern void ABISELECT(_ZThn32_N6E26x133fooEv,_ZThn24_N6E26x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C26__6E26x13__8G26x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E26x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__8G26x13y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x13y0[] = {
  {&(_ZTV8G26x13y0[5]),  5,15},
  {&(_tg__ZTV6E26x13__8G26x13y0[5]),  5,6},
  {&(_tg__ZTV3C26__6E26x13__8G26x13y0[5]),  5,6},
  {&(_ZTV8G26x13y0[14]),  14,15},
  {&(_tg__ZTV3C26__8G26x13y0[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x13y0[];
extern  VTBL_ENTRY _ZTV8G26x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x13y0[];
static VTBL_ENTRY alt_thunk_names333[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E26x133fooEv,_ZThn24_N6E26x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E26x133fooEv,_ZThn24_N6E26x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G26x13y0 = {  "G26x13y0", // class name
  bases_G26x13y0, 6,
  &(vtc_G26x13y0[0]), // expected_vtbl_contents
  &(vtt_G26x13y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G26x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x13y0),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x13y0),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names333,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x13y1  : virtual E26x13 , F1 {
  int ff;
  ~G26x13y1(); // tgen
  G26x13y1(); // tgen
};
//SIG(1 G26x13y1) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G26x13y1 ::~G26x13y1(){ note_dtor("G26x13y1", this);} // tgen
G26x13y1 ::G26x13y1(){ note_ctor("G26x13y1", this);} // tgen

static void Test_G26x13y1()
{
  extern Class_Descriptor cd_G26x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G26x13y1, buf);
    G26x13y1 *dp, &lv = *(dp=new (buf) G26x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G26x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x13y1)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,32), "G26x13y1");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,36), "G26x13y1");
    check_base_class_offset(lv, (C26*)(E26x13*), ABISELECT(32,24), "G26x13y1");
    check_base_class_offset(lv, (D0*)(E26x13*), ABISELECT(24,16), "G26x13y1");
    check_base_class_offset(lv, (E26x13*), ABISELECT(16,12), "G26x13y1");
    check_base_class_offset(lv, (F1*), 0, "G26x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x13y1.ff");
    test_class_info(&lv, &cd_G26x13y1);
    dp->~G26x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x13y1(Test_G26x13y1, "G26x13y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G26x13y1C1Ev();
extern void _ZN8G26x13y1D1Ev();
Name_Map name_map_G26x13y1[] = {
  NSPAIR(_ZN8G26x13y1C1Ev),
  NSPAIR(_ZN8G26x13y1D1Ev),
  {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_E26x13;
extern VTBL_ENTRY _ZTI6E26x13[];
extern  VTBL_ENTRY _ZTV6E26x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x13y1[] = {
  // 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
    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(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_E26x13,    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_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 _ZTI8G26x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E26x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv)();
extern void ABISELECT(_ZThn16_N6E26x133fooEv,_ZThn12_N6E26x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G26x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G26x13y1[0]),
  (VTBL_ENTRY)&_ZN6E26x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G26x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv),
};
extern VTBL_ENTRY _ZTV8G26x13y1[];
extern void _ZN6E26x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x13__8G26x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x13[0]),
  (VTBL_ENTRY)&_ZN6E26x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv)();
extern void ABISELECT(_ZThn16_N6E26x133fooEv,_ZThn12_N6E26x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C26__6E26x13__8G26x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E26x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__8G26x13y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x13y1[] = {
  {&(_ZTV8G26x13y1[6]),  6,20},
  {&(_ZTV8G26x13y1[13]),  13,20},
  {&(_ZTV8G26x13y1[19]),  19,20},
  {&(_tg__ZTV6E26x13__8G26x13y1[5]),  5,6},
  {&(_tg__ZTV3C26__6E26x13__8G26x13y1[5]),  5,6},
  {&(_tg__ZTV3C26__8G26x13y1[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x13y1[];
extern  VTBL_ENTRY _ZTV8G26x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x13y1[];
static VTBL_ENTRY alt_thunk_names334[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x133fooEv,_ZThn12_N6E26x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x133fooEv,_ZThn12_N6E26x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G26x13y1 = {  "G26x13y1", // class name
  bases_G26x13y1, 6,
  &(vtc_G26x13y1[0]), // expected_vtbl_contents
  &(vtt_G26x13y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G26x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x13y1),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x13y1),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names334,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x13y2  : E26x13 , virtual F1 {
  int ff;
  ~G26x13y2(); // tgen
  G26x13y2(); // tgen
};
//SIG(1 G26x13y2) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G26x13y2 ::~G26x13y2(){ note_dtor("G26x13y2", this);} // tgen
G26x13y2 ::G26x13y2(){ note_ctor("G26x13y2", this);} // tgen

static void Test_G26x13y2()
{
  extern Class_Descriptor cd_G26x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G26x13y2, buf);
    G26x13y2 *dp, &lv = *(dp=new (buf) G26x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G26x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x13y2)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(36,24), "G26x13y2");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(40,28), "G26x13y2");
    check_base_class_offset(lv, (C26*)(E26x13*), ABISELECT(24,16), "G26x13y2");
    check_base_class_offset(lv, (D0*)(E26x13*), ABISELECT(8,4), "G26x13y2");
    check_base_class_offset(lv, (E26x13*), 0, "G26x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G26x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G26x13y2.ff");
    test_class_info(&lv, &cd_G26x13y2);
    dp->~G26x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x13y2(Test_G26x13y2, "G26x13y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G26x13y2C1Ev();
extern void _ZN8G26x13y2D1Ev();
Name_Map name_map_G26x13y2[] = {
  NSPAIR(_ZN8G26x13y2C1Ev),
  NSPAIR(_ZN8G26x13y2D1Ev),
  {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_E26x13;
extern VTBL_ENTRY _ZTI6E26x13[];
extern  VTBL_ENTRY _ZTV6E26x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x13y2[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E26x13,    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
    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 _ZTI8G26x13y2[];
extern void _ZN6E26x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv)();
extern void ABISELECT(_ZThn24_N6E26x133fooEv,_ZThn16_N6E26x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x13y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x13y2[0]),
  (VTBL_ENTRY)&_ZN6E26x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G26x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G26x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G26x13y2[];
extern void _ZN6E26x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x13__8G26x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x13[0]),
  (VTBL_ENTRY)&_ZN6E26x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv)();
extern void ABISELECT(_ZThn24_N6E26x133fooEv,_ZThn16_N6E26x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C26__6E26x13__8G26x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E26x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__8G26x13y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x13y2[] = {
  {&(_ZTV8G26x13y2[6]),  6,17},
  {&(_tg__ZTV6E26x13__8G26x13y2[5]),  5,6},
  {&(_tg__ZTV3C26__6E26x13__8G26x13y2[5]),  5,6},
  {&(_ZTV8G26x13y2[12]),  12,17},
  {&(_ZTV8G26x13y2[16]),  16,17},
  {&(_tg__ZTV3C26__8G26x13y2[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x13y2[];
extern  VTBL_ENTRY _ZTV8G26x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x13y2[];
static VTBL_ENTRY alt_thunk_names335[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E26x133fooEv,_ZThn16_N6E26x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E26x133fooEv,_ZThn16_N6E26x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G26x13y2 = {  "G26x13y2", // class name
  bases_G26x13y2, 6,
  &(vtc_G26x13y2[0]), // expected_vtbl_contents
  &(vtt_G26x13y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G26x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x13y2),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x13y2),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names335,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x13y3  : virtual E26x13 , virtual F1 {
  int ff;
  ~G26x13y3(); // tgen
  G26x13y3(); // tgen
};
//SIG(1 G26x13y3) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G26x13y3 ::~G26x13y3(){ note_dtor("G26x13y3", this);} // tgen
G26x13y3 ::G26x13y3(){ note_ctor("G26x13y3", this);} // tgen

static void Test_G26x13y3()
{
  extern Class_Descriptor cd_G26x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G26x13y3, buf);
    G26x13y3 *dp, &lv = *(dp=new (buf) G26x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G26x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x13y3)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,28), "G26x13y3");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,32), "G26x13y3");
    check_base_class_offset(lv, (C26*)(E26x13*), ABISELECT(32,20), "G26x13y3");
    check_base_class_offset(lv, (D0*)(E26x13*), ABISELECT(24,12), "G26x13y3");
    check_base_class_offset(lv, (E26x13*), ABISELECT(16,8), "G26x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G26x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G26x13y3.ff");
    test_class_info(&lv, &cd_G26x13y3);
    dp->~G26x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x13y3(Test_G26x13y3, "G26x13y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G26x13y3C1Ev();
extern void _ZN8G26x13y3D1Ev();
Name_Map name_map_G26x13y3[] = {
  NSPAIR(_ZN8G26x13y3C1Ev),
  NSPAIR(_ZN8G26x13y3D1Ev),
  {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_E26x13;
extern VTBL_ENTRY _ZTI6E26x13[];
extern  VTBL_ENTRY _ZTV6E26x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x13y3[] = {
  // 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
    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_E26x13,    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
    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 _ZTI8G26x13y3[];
extern void _ZN6E26x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv)();
extern void ABISELECT(_ZThn16_N6E26x133fooEv,_ZThn12_N6E26x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x13y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G26x13y3[0]),
  (VTBL_ENTRY)&_ZN6E26x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G26x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G26x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G26x13y3[];
extern void _ZN6E26x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x13__8G26x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x13[0]),
  (VTBL_ENTRY)&_ZN6E26x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv)();
extern void ABISELECT(_ZThn16_N6E26x133fooEv,_ZThn12_N6E26x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C26__6E26x13__8G26x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E26x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__8G26x13y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x13y3[] = {
  {&(_ZTV8G26x13y3[7]),  7,24},
  {&(_ZTV8G26x13y3[13]),  13,24},
  {&(_ZTV8G26x13y3[19]),  19,24},
  {&(_ZTV8G26x13y3[23]),  23,24},
  {&(_tg__ZTV6E26x13__8G26x13y3[5]),  5,6},
  {&(_tg__ZTV3C26__6E26x13__8G26x13y3[5]),  5,6},
  {&(_tg__ZTV3C26__8G26x13y3[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x13y3[];
extern  VTBL_ENTRY _ZTV8G26x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x13y3[];
static VTBL_ENTRY alt_thunk_names336[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x133fooEv,_ZThn12_N6E26x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x133fooEv,_ZThn12_N6E26x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G26x13y3 = {  "G26x13y3", // class name
  bases_G26x13y3, 6,
  &(vtc_G26x13y3[0]), // expected_vtbl_contents
  &(vtt_G26x13y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G26x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x13y3),24, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x13y3),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names336,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x13y4  : E26x13 , F0 {
  int ff;
  ~G26x13y4(); // tgen
  G26x13y4(); // tgen
};
//SIG(1 G26x13y4) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G26x13y4 ::~G26x13y4(){ note_dtor("G26x13y4", this);} // tgen
G26x13y4 ::G26x13y4(){ note_ctor("G26x13y4", this);} // tgen

static void Test_G26x13y4()
{
  extern Class_Descriptor cd_G26x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x13y4, buf);
    G26x13y4 *dp, &lv = *(dp=new (buf) G26x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x13y4)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(36,28), "G26x13y4");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(40,32), "G26x13y4");
    check_base_class_offset(lv, (C26*)(E26x13*), ABISELECT(24,20), "G26x13y4");
    check_base_class_offset(lv, (D0*)(E26x13*), ABISELECT(8,4), "G26x13y4");
    check_base_class_offset(lv, (E26x13*), 0, "G26x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G26x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G26x13y4.ff");
    test_class_info(&lv, &cd_G26x13y4);
    dp->~G26x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x13y4(Test_G26x13y4, "G26x13y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G26x13y4C1Ev();
extern void _ZN8G26x13y4D1Ev();
Name_Map name_map_G26x13y4[] = {
  NSPAIR(_ZN8G26x13y4C1Ev),
  NSPAIR(_ZN8G26x13y4D1Ev),
  {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_E26x13;
extern VTBL_ENTRY _ZTI6E26x13[];
extern  VTBL_ENTRY _ZTV6E26x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x13y4[] = {
  // 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
    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_E26x13,    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 _ZTI8G26x13y4[];
extern void _ZN6E26x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv)();
extern void ABISELECT(_ZThn24_N6E26x133fooEv,_ZThn20_N6E26x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G26x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x13y4[0]),
  (VTBL_ENTRY)&_ZN6E26x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G26x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv),
};
extern VTBL_ENTRY _ZTV8G26x13y4[];
extern void _ZN6E26x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x13__8G26x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x13[0]),
  (VTBL_ENTRY)&_ZN6E26x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv)();
extern void ABISELECT(_ZThn24_N6E26x133fooEv,_ZThn20_N6E26x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C26__6E26x13__8G26x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E26x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__8G26x13y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x13y4[] = {
  {&(_ZTV8G26x13y4[5]),  5,12},
  {&(_tg__ZTV6E26x13__8G26x13y4[5]),  5,6},
  {&(_tg__ZTV3C26__6E26x13__8G26x13y4[5]),  5,6},
  {&(_ZTV8G26x13y4[11]),  11,12},
  {&(_tg__ZTV3C26__8G26x13y4[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x13y4[];
extern  VTBL_ENTRY _ZTV8G26x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x13y4[];
static VTBL_ENTRY alt_thunk_names337[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E26x133fooEv,_ZThn20_N6E26x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E26x133fooEv,_ZThn20_N6E26x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G26x13y4 = {  "G26x13y4", // class name
  bases_G26x13y4, 6,
  &(vtc_G26x13y4[0]), // expected_vtbl_contents
  &(vtt_G26x13y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G26x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x13y4),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x13y4),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names337,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x13y5  : virtual E26x13 , F0 {
  int ff;
  ~G26x13y5(); // tgen
  G26x13y5(); // tgen
};
//SIG(1 G26x13y5) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G26x13y5 ::~G26x13y5(){ note_dtor("G26x13y5", this);} // tgen
G26x13y5 ::G26x13y5(){ note_ctor("G26x13y5", this);} // tgen

static void Test_G26x13y5()
{
  extern Class_Descriptor cd_G26x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G26x13y5, buf);
    G26x13y5 *dp, &lv = *(dp=new (buf) G26x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G26x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x13y5)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,32), "G26x13y5");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,36), "G26x13y5");
    check_base_class_offset(lv, (C26*)(E26x13*), ABISELECT(32,24), "G26x13y5");
    check_base_class_offset(lv, (D0*)(E26x13*), ABISELECT(24,16), "G26x13y5");
    check_base_class_offset(lv, (E26x13*), ABISELECT(16,12), "G26x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G26x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x13y5.ff");
    test_class_info(&lv, &cd_G26x13y5);
    dp->~G26x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x13y5(Test_G26x13y5, "G26x13y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G26x13y5C1Ev();
extern void _ZN8G26x13y5D1Ev();
Name_Map name_map_G26x13y5[] = {
  NSPAIR(_ZN8G26x13y5C1Ev),
  NSPAIR(_ZN8G26x13y5D1Ev),
  {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_E26x13;
extern VTBL_ENTRY _ZTI6E26x13[];
extern  VTBL_ENTRY _ZTV6E26x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x13y5[] = {
  // 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
    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(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_E26x13,    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
    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 _ZTI8G26x13y5[];
extern void _ZN6E26x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv)();
extern void ABISELECT(_ZThn16_N6E26x133fooEv,_ZThn12_N6E26x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G26x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G26x13y5[0]),
  (VTBL_ENTRY)&_ZN6E26x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G26x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv),
};
extern VTBL_ENTRY _ZTV8G26x13y5[];
extern void _ZN6E26x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x13__8G26x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x13[0]),
  (VTBL_ENTRY)&_ZN6E26x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv)();
extern void ABISELECT(_ZThn16_N6E26x133fooEv,_ZThn12_N6E26x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C26__6E26x13__8G26x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E26x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__8G26x13y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x13y5[] = {
  {&(_ZTV8G26x13y5[6]),  6,19},
  {&(_ZTV8G26x13y5[12]),  12,19},
  {&(_ZTV8G26x13y5[18]),  18,19},
  {&(_tg__ZTV6E26x13__8G26x13y5[5]),  5,6},
  {&(_tg__ZTV3C26__6E26x13__8G26x13y5[5]),  5,6},
  {&(_tg__ZTV3C26__8G26x13y5[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x13y5[];
extern  VTBL_ENTRY _ZTV8G26x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x13y5[];
static VTBL_ENTRY alt_thunk_names338[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x133fooEv,_ZThn12_N6E26x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x133fooEv,_ZThn12_N6E26x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G26x13y5 = {  "G26x13y5", // class name
  bases_G26x13y5, 6,
  &(vtc_G26x13y5[0]), // expected_vtbl_contents
  &(vtt_G26x13y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G26x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x13y5),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x13y5),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names338,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x13y6  : E26x13 , virtual F0 {
  int ff;
  ~G26x13y6(); // tgen
  G26x13y6(); // tgen
};
//SIG(1 G26x13y6) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G26x13y6 ::~G26x13y6(){ note_dtor("G26x13y6", this);} // tgen
G26x13y6 ::G26x13y6(){ note_ctor("G26x13y6", this);} // tgen

static void Test_G26x13y6()
{
  extern Class_Descriptor cd_G26x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x13y6, buf);
    G26x13y6 *dp, &lv = *(dp=new (buf) G26x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x13y6)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(36,24), "G26x13y6");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(40,28), "G26x13y6");
    check_base_class_offset(lv, (C26*)(E26x13*), ABISELECT(24,16), "G26x13y6");
    check_base_class_offset(lv, (D0*)(E26x13*), ABISELECT(8,4), "G26x13y6");
    check_base_class_offset(lv, (E26x13*), 0, "G26x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G26x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G26x13y6.ff");
    test_class_info(&lv, &cd_G26x13y6);
    dp->~G26x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x13y6(Test_G26x13y6, "G26x13y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G26x13y6C1Ev();
extern void _ZN8G26x13y6D1Ev();
Name_Map name_map_G26x13y6[] = {
  NSPAIR(_ZN8G26x13y6C1Ev),
  NSPAIR(_ZN8G26x13y6D1Ev),
  {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_E26x13;
extern VTBL_ENTRY _ZTI6E26x13[];
extern  VTBL_ENTRY _ZTV6E26x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x13y6[] = {
  // 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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E26x13,    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 _ZTI8G26x13y6[];
extern void _ZN6E26x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv)();
extern void ABISELECT(_ZThn24_N6E26x133fooEv,_ZThn16_N6E26x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G26x13y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x13y6[0]),
  (VTBL_ENTRY)&_ZN6E26x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G26x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv),
};
extern VTBL_ENTRY _ZTV8G26x13y6[];
extern void _ZN6E26x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x13__8G26x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x13[0]),
  (VTBL_ENTRY)&_ZN6E26x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv)();
extern void ABISELECT(_ZThn24_N6E26x133fooEv,_ZThn16_N6E26x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C26__6E26x13__8G26x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E26x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__8G26x13y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x13y6[] = {
  {&(_ZTV8G26x13y6[6]),  6,13},
  {&(_tg__ZTV6E26x13__8G26x13y6[5]),  5,6},
  {&(_tg__ZTV3C26__6E26x13__8G26x13y6[5]),  5,6},
  {&(_ZTV8G26x13y6[12]),  12,13},
  {&(_tg__ZTV3C26__8G26x13y6[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x13y6[];
extern  VTBL_ENTRY _ZTV8G26x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x13y6[];
static VTBL_ENTRY alt_thunk_names339[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E26x133fooEv,_ZThn16_N6E26x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E26x133fooEv,_ZThn16_N6E26x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G26x13y6 = {  "G26x13y6", // class name
  bases_G26x13y6, 6,
  &(vtc_G26x13y6[0]), // expected_vtbl_contents
  &(vtt_G26x13y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G26x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x13y6),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x13y6),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names339,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x13y7  : virtual E26x13 , virtual F0 {
  int ff;
  ~G26x13y7(); // tgen
  G26x13y7(); // tgen
};
//SIG(1 G26x13y7) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G26x13y7 ::~G26x13y7(){ note_dtor("G26x13y7", this);} // tgen
G26x13y7 ::G26x13y7(){ note_ctor("G26x13y7", this);} // tgen

static void Test_G26x13y7()
{
  extern Class_Descriptor cd_G26x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G26x13y7, buf);
    G26x13y7 *dp, &lv = *(dp=new (buf) G26x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G26x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x13y7)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,28), "G26x13y7");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,32), "G26x13y7");
    check_base_class_offset(lv, (C26*)(E26x13*), ABISELECT(32,20), "G26x13y7");
    check_base_class_offset(lv, (D0*)(E26x13*), ABISELECT(24,12), "G26x13y7");
    check_base_class_offset(lv, (E26x13*), ABISELECT(16,8), "G26x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G26x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G26x13y7.ff");
    test_class_info(&lv, &cd_G26x13y7);
    dp->~G26x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x13y7(Test_G26x13y7, "G26x13y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G26x13y7C1Ev();
extern void _ZN8G26x13y7D1Ev();
Name_Map name_map_G26x13y7[] = {
  NSPAIR(_ZN8G26x13y7C1Ev),
  NSPAIR(_ZN8G26x13y7D1Ev),
  {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_E26x13;
extern VTBL_ENTRY _ZTI6E26x13[];
extern  VTBL_ENTRY _ZTV6E26x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x13y7[] = {
  // 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(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_E26x13,    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_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 _ZTI8G26x13y7[];
extern void _ZN6E26x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv)();
extern void ABISELECT(_ZThn16_N6E26x133fooEv,_ZThn12_N6E26x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G26x13y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G26x13y7[0]),
  (VTBL_ENTRY)&_ZN6E26x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G26x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv),
};
extern VTBL_ENTRY _ZTV8G26x13y7[];
extern void _ZN6E26x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x13__8G26x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x13[0]),
  (VTBL_ENTRY)&_ZN6E26x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv)();
extern void ABISELECT(_ZThn16_N6E26x133fooEv,_ZThn12_N6E26x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C26__6E26x13__8G26x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E26x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__8G26x13y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x13y7[] = {
  {&(_ZTV8G26x13y7[7]),  7,20},
  {&(_ZTV8G26x13y7[13]),  13,20},
  {&(_ZTV8G26x13y7[19]),  19,20},
  {&(_tg__ZTV6E26x13__8G26x13y7[5]),  5,6},
  {&(_tg__ZTV3C26__6E26x13__8G26x13y7[5]),  5,6},
  {&(_tg__ZTV3C26__8G26x13y7[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x13y7[];
extern  VTBL_ENTRY _ZTV8G26x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x13y7[];
static VTBL_ENTRY alt_thunk_names340[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E26x133fooEv,_ZTv0_n20_N6E26x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x133fooEv,_ZThn12_N6E26x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x133fooEv,_ZThn12_N6E26x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G26x13y7 = {  "G26x13y7", // class name
  bases_G26x13y7, 6,
  &(vtc_G26x13y7[0]), // expected_vtbl_contents
  &(vtt_G26x13y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G26x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x13y7),20, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x13y7),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names340,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E27x13  : virtual C27 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E27x133fooEv
  ~E27x13(); // tgen
  E27x13(); // tgen
};
//SIG(-1 E27x13) C1{ VBC2{ VBC3{ v1 Fi} VBC4{ Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E27x13 ::foo(){vfunc_called(this, "_ZN6E27x133fooEv");}
E27x13 ::~E27x13(){ note_dtor("E27x13", this);} // tgen
E27x13 ::E27x13(){ note_ctor("E27x13", this);} // tgen

static void Test_E27x13()
{
  extern Class_Descriptor cd_E27x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E27x13, buf);
    E27x13 *dp, &lv = *(dp=new (buf) E27x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E27x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E27x13)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(32,20), "E27x13");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(44,28), "E27x13");
    check_base_class_offset(lv, (C27*), ABISELECT(16,12), "E27x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E27x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E27x13.fd");
    test_class_info(&lv, &cd_E27x13);
    dp->~E27x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE27x13(Test_E27x13, "E27x13", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E27x13C1Ev();
extern void _ZN6E27x13D1Ev();
Name_Map name_map_E27x13[] = {
  NSPAIR(_ZN6E27x13C1Ev),
  NSPAIR(_ZN6E27x13D1Ev),
  {0,0}
};
extern Class_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_E27x13[] = {
  // 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_C27,    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_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 _ZTI6E27x13[];
extern void _ZN6E27x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv)();
extern void ABISELECT(_ZThn16_N6E27x133fooEv,_ZThn12_N6E27x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv)();
extern void ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn20_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E27x13[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&_ZN6E27x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv),
};
extern VTBL_ENTRY _ZTV6E27x13[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__6E27x13[] = {
  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__6E27x13[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_E27x13[] = {
  {&(_ZTV6E27x13[5]),  5,16},
  {&(_ZTV6E27x13[11]),  11,16},
  {&(_ZTV6E27x13[15]),  15,16},
  {&(_tg__ZTV3C27__6E27x13[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__6E27x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E27x13[];
extern  VTBL_ENTRY _ZTV6E27x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x13[];
static VTBL_ENTRY alt_thunk_names341[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn20_N6E27x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x133fooEv,_ZThn12_N6E27x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E27x13 = {  "E27x13", // class name
  bases_E27x13, 4,
  &(vtc_E27x13[0]), // expected_vtbl_contents
  &(vtt_E27x13[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E27x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E27x13),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E27x13),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names341,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x13y0  : E27x13 , F1 {
  int ff;
  ~G27x13y0(); // tgen
  G27x13y0(); // tgen
};
//SIG(1 G27x13y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G27x13y0 ::~G27x13y0(){ note_dtor("G27x13y0", this);} // tgen
G27x13y0 ::G27x13y0(){ note_ctor("G27x13y0", this);} // tgen

static void Test_G27x13y0()
{
  extern Class_Descriptor cd_G27x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G27x13y0, buf);
    G27x13y0 *dp, &lv = *(dp=new (buf) G27x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G27x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x13y0)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,32), "G27x13y0");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,40), "G27x13y0");
    check_base_class_offset(lv, (C27*)(E27x13*), ABISELECT(32,24), "G27x13y0");
    check_base_class_offset(lv, (D0*)(E27x13*), ABISELECT(8,4), "G27x13y0");
    check_base_class_offset(lv, (E27x13*), 0, "G27x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G27x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G27x13y0.ff");
    test_class_info(&lv, &cd_G27x13y0);
    dp->~G27x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x13y0(Test_G27x13y0, "G27x13y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G27x13y0C1Ev();
extern void _ZN8G27x13y0D1Ev();
Name_Map name_map_G27x13y0[] = {
  NSPAIR(_ZN8G27x13y0C1Ev),
  NSPAIR(_ZN8G27x13y0D1Ev),
  {0,0}
};
extern Class_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_E27x13;
extern VTBL_ENTRY _ZTI6E27x13[];
extern  VTBL_ENTRY _ZTV6E27x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x13y0[] = {
  // 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)
    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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E27x13,    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 _ZTI8G27x13y0[];
extern void _ZN6E27x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv)();
extern void ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn24_N6E27x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv)();
extern void ABISELECT(_ZThn48_N6E27x133fooEv,_ZThn32_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x13y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x13y0[0]),
  (VTBL_ENTRY)&_ZN6E27x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G27x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G27x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G27x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv),
};
extern VTBL_ENTRY _ZTV8G27x13y0[];
extern void _ZN6E27x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x13__8G27x13y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&_ZN6E27x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv)();
extern void ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn24_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C27__6E27x13__8G27x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv)();
extern void ABISELECT(_ZThn48_N6E27x133fooEv,_ZThn32_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x13__8G27x13y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__8G27x13y0[] = {
  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__8G27x13y0[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x13y0[] = {
  {&(_ZTV8G27x13y0[5]),  5,19},
  {&(_tg__ZTV6E27x13__8G27x13y0[5]),  5,6},
  {&(_tg__ZTV3C27__6E27x13__8G27x13y0[5]),  5,6},
  {&(_tg__ZTV2A1__6E27x13__8G27x13y0[3]),  3,4},
  {&(_ZTV8G27x13y0[14]),  14,19},
  {&(_ZTV8G27x13y0[18]),  18,19},
  {&(_tg__ZTV3C27__8G27x13y0[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__8G27x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x13y0[];
extern  VTBL_ENTRY _ZTV8G27x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x13y0[];
static VTBL_ENTRY alt_thunk_names342[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E27x133fooEv,_ZThn32_N6E27x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E27x133fooEv,_ZThn32_N6E27x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn24_N6E27x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn24_N6E27x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x13y0 = {  "G27x13y0", // class name
  bases_G27x13y0, 6,
  &(vtc_G27x13y0[0]), // expected_vtbl_contents
  &(vtt_G27x13y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G27x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x13y0),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x13y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names342,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x13y1  : virtual E27x13 , F1 {
  int ff;
  ~G27x13y1(); // tgen
  G27x13y1(); // tgen
};
//SIG(1 G27x13y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G27x13y1 ::~G27x13y1(){ note_dtor("G27x13y1", this);} // tgen
G27x13y1 ::G27x13y1(){ note_ctor("G27x13y1", this);} // tgen

static void Test_G27x13y1()
{
  extern Class_Descriptor cd_G27x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G27x13y1, buf);
    G27x13y1 *dp, &lv = *(dp=new (buf) G27x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G27x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x13y1)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,32), "G27x13y1");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,40), "G27x13y1");
    check_base_class_offset(lv, (C27*)(E27x13*), ABISELECT(32,24), "G27x13y1");
    check_base_class_offset(lv, (D0*)(E27x13*), ABISELECT(24,16), "G27x13y1");
    check_base_class_offset(lv, (E27x13*), ABISELECT(16,12), "G27x13y1");
    check_base_class_offset(lv, (F1*), 0, "G27x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x13y1.ff");
    test_class_info(&lv, &cd_G27x13y1);
    dp->~G27x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x13y1(Test_G27x13y1, "G27x13y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G27x13y1C1Ev();
extern void _ZN8G27x13y1D1Ev();
Name_Map name_map_G27x13y1[] = {
  NSPAIR(_ZN8G27x13y1C1Ev),
  NSPAIR(_ZN8G27x13y1D1Ev),
  {0,0}
};
extern Class_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_E27x13;
extern VTBL_ENTRY _ZTI6E27x13[];
extern  VTBL_ENTRY _ZTV6E27x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x13y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    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_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
    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(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_E27x13,    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_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 _ZTI8G27x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E27x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv)();
extern void ABISELECT(_ZThn16_N6E27x133fooEv,_ZThn12_N6E27x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv)();
extern void ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn20_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x13y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G27x13y1[0]),
  (VTBL_ENTRY)&_ZN6E27x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G27x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G27x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv),
};
extern VTBL_ENTRY _ZTV8G27x13y1[];
extern void _ZN6E27x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x13__8G27x13y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&_ZN6E27x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv)();
extern void ABISELECT(_ZThn16_N6E27x133fooEv,_ZThn12_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C27__6E27x13__8G27x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv)();
extern void ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn20_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x13__8G27x13y1[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__8G27x13y1[] = {
  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__8G27x13y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x13y1[] = {
  {&(_ZTV8G27x13y1[6]),  6,24},
  {&(_ZTV8G27x13y1[13]),  13,24},
  {&(_ZTV8G27x13y1[19]),  19,24},
  {&(_ZTV8G27x13y1[23]),  23,24},
  {&(_tg__ZTV6E27x13__8G27x13y1[5]),  5,6},
  {&(_tg__ZTV3C27__6E27x13__8G27x13y1[5]),  5,6},
  {&(_tg__ZTV2A1__6E27x13__8G27x13y1[3]),  3,4},
  {&(_tg__ZTV3C27__8G27x13y1[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__8G27x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x13y1[];
extern  VTBL_ENTRY _ZTV8G27x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x13y1[];
static VTBL_ENTRY alt_thunk_names343[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn20_N6E27x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn20_N6E27x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x133fooEv,_ZThn12_N6E27x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x133fooEv,_ZThn12_N6E27x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x13y1 = {  "G27x13y1", // class name
  bases_G27x13y1, 6,
  &(vtc_G27x13y1[0]), // expected_vtbl_contents
  &(vtt_G27x13y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G27x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x13y1),24, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x13y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names343,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x13y2  : E27x13 , virtual F1 {
  int ff;
  ~G27x13y2(); // tgen
  G27x13y2(); // tgen
};
//SIG(1 G27x13y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G27x13y2 ::~G27x13y2(){ note_dtor("G27x13y2", this);} // tgen
G27x13y2 ::G27x13y2(){ note_ctor("G27x13y2", this);} // tgen

static void Test_G27x13y2()
{
  extern Class_Descriptor cd_G27x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G27x13y2, buf);
    G27x13y2 *dp, &lv = *(dp=new (buf) G27x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G27x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x13y2)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(40,24), "G27x13y2");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(52,32), "G27x13y2");
    check_base_class_offset(lv, (C27*)(E27x13*), ABISELECT(24,16), "G27x13y2");
    check_base_class_offset(lv, (D0*)(E27x13*), ABISELECT(8,4), "G27x13y2");
    check_base_class_offset(lv, (E27x13*), 0, "G27x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G27x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G27x13y2.ff");
    test_class_info(&lv, &cd_G27x13y2);
    dp->~G27x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x13y2(Test_G27x13y2, "G27x13y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G27x13y2C1Ev();
extern void _ZN8G27x13y2D1Ev();
Name_Map name_map_G27x13y2[] = {
  NSPAIR(_ZN8G27x13y2C1Ev),
  NSPAIR(_ZN8G27x13y2D1Ev),
  {0,0}
};
extern Class_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_E27x13;
extern VTBL_ENTRY _ZTI6E27x13[];
extern  VTBL_ENTRY _ZTV6E27x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x13y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,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_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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E27x13,    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
    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 _ZTI8G27x13y2[];
extern void _ZN6E27x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv)();
extern void ABISELECT(_ZThn24_N6E27x133fooEv,_ZThn16_N6E27x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv)();
extern void ABISELECT(_ZThn40_N6E27x133fooEv,_ZThn24_N6E27x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G27x13y2[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x13y2[0]),
  (VTBL_ENTRY)&_ZN6E27x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G27x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G27x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G27x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G27x13y2[];
extern void _ZN6E27x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x13__8G27x13y2[] = {
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&_ZN6E27x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv)();
extern void ABISELECT(_ZThn24_N6E27x133fooEv,_ZThn16_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C27__6E27x13__8G27x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv)();
extern void ABISELECT(_ZThn40_N6E27x133fooEv,_ZThn24_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x13__8G27x13y2[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__8G27x13y2[] = {
  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__8G27x13y2[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x13y2[] = {
  {&(_ZTV8G27x13y2[6]),  6,21},
  {&(_tg__ZTV6E27x13__8G27x13y2[5]),  5,6},
  {&(_tg__ZTV3C27__6E27x13__8G27x13y2[5]),  5,6},
  {&(_tg__ZTV2A1__6E27x13__8G27x13y2[3]),  3,4},
  {&(_ZTV8G27x13y2[12]),  12,21},
  {&(_ZTV8G27x13y2[16]),  16,21},
  {&(_ZTV8G27x13y2[20]),  20,21},
  {&(_tg__ZTV3C27__8G27x13y2[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__8G27x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x13y2[];
extern  VTBL_ENTRY _ZTV8G27x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x13y2[];
static VTBL_ENTRY alt_thunk_names344[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E27x133fooEv,_ZThn24_N6E27x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E27x133fooEv,_ZThn24_N6E27x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x133fooEv,_ZThn16_N6E27x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x133fooEv,_ZThn16_N6E27x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x13y2 = {  "G27x13y2", // class name
  bases_G27x13y2, 6,
  &(vtc_G27x13y2[0]), // expected_vtbl_contents
  &(vtt_G27x13y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G27x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x13y2),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x13y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names344,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x13y3  : virtual E27x13 , virtual F1 {
  int ff;
  ~G27x13y3(); // tgen
  G27x13y3(); // tgen
};
//SIG(1 G27x13y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G27x13y3 ::~G27x13y3(){ note_dtor("G27x13y3", this);} // tgen
G27x13y3 ::G27x13y3(){ note_ctor("G27x13y3", this);} // tgen

static void Test_G27x13y3()
{
  extern Class_Descriptor cd_G27x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G27x13y3, buf);
    G27x13y3 *dp, &lv = *(dp=new (buf) G27x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G27x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x13y3)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,28), "G27x13y3");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,36), "G27x13y3");
    check_base_class_offset(lv, (C27*)(E27x13*), ABISELECT(32,20), "G27x13y3");
    check_base_class_offset(lv, (D0*)(E27x13*), ABISELECT(24,12), "G27x13y3");
    check_base_class_offset(lv, (E27x13*), ABISELECT(16,8), "G27x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G27x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G27x13y3.ff");
    test_class_info(&lv, &cd_G27x13y3);
    dp->~G27x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x13y3(Test_G27x13y3, "G27x13y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G27x13y3C1Ev();
extern void _ZN8G27x13y3D1Ev();
Name_Map name_map_G27x13y3[] = {
  NSPAIR(_ZN8G27x13y3C1Ev),
  NSPAIR(_ZN8G27x13y3D1Ev),
  {0,0}
};
extern Class_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_E27x13;
extern VTBL_ENTRY _ZTI6E27x13[];
extern  VTBL_ENTRY _ZTV6E27x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x13y3[] = {
  // 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
    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_E27x13,    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
    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 _ZTI8G27x13y3[];
extern void _ZN6E27x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv)();
extern void ABISELECT(_ZThn16_N6E27x133fooEv,_ZThn12_N6E27x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv)();
extern void ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn20_N6E27x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G27x13y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x13y3[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G27x13y3[0]),
  (VTBL_ENTRY)&_ZN6E27x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G27x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G27x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G27x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G27x13y3[];
extern void _ZN6E27x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x13__8G27x13y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&_ZN6E27x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv)();
extern void ABISELECT(_ZThn16_N6E27x133fooEv,_ZThn12_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C27__6E27x13__8G27x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv)();
extern void ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn20_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x13__8G27x13y3[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__8G27x13y3[] = {
  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__8G27x13y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x13y3[] = {
  {&(_ZTV8G27x13y3[7]),  7,28},
  {&(_ZTV8G27x13y3[13]),  13,28},
  {&(_ZTV8G27x13y3[19]),  19,28},
  {&(_ZTV8G27x13y3[23]),  23,28},
  {&(_ZTV8G27x13y3[27]),  27,28},
  {&(_tg__ZTV6E27x13__8G27x13y3[5]),  5,6},
  {&(_tg__ZTV3C27__6E27x13__8G27x13y3[5]),  5,6},
  {&(_tg__ZTV2A1__6E27x13__8G27x13y3[3]),  3,4},
  {&(_tg__ZTV3C27__8G27x13y3[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__8G27x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x13y3[];
extern  VTBL_ENTRY _ZTV8G27x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x13y3[];
static VTBL_ENTRY alt_thunk_names345[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn20_N6E27x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn20_N6E27x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x133fooEv,_ZThn12_N6E27x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x133fooEv,_ZThn12_N6E27x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x13y3 = {  "G27x13y3", // class name
  bases_G27x13y3, 6,
  &(vtc_G27x13y3[0]), // expected_vtbl_contents
  &(vtt_G27x13y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G27x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x13y3),28, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x13y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names345,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x13y4  : E27x13 , F0 {
  int ff;
  ~G27x13y4(); // tgen
  G27x13y4(); // tgen
};
//SIG(1 G27x13y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G27x13y4 ::~G27x13y4(){ note_dtor("G27x13y4", this);} // tgen
G27x13y4 ::G27x13y4(){ note_ctor("G27x13y4", this);} // tgen

static void Test_G27x13y4()
{
  extern Class_Descriptor cd_G27x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x13y4, buf);
    G27x13y4 *dp, &lv = *(dp=new (buf) G27x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x13y4)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(40,28), "G27x13y4");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(52,36), "G27x13y4");
    check_base_class_offset(lv, (C27*)(E27x13*), ABISELECT(24,20), "G27x13y4");
    check_base_class_offset(lv, (D0*)(E27x13*), ABISELECT(8,4), "G27x13y4");
    check_base_class_offset(lv, (E27x13*), 0, "G27x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G27x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G27x13y4.ff");
    test_class_info(&lv, &cd_G27x13y4);
    dp->~G27x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x13y4(Test_G27x13y4, "G27x13y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G27x13y4C1Ev();
extern void _ZN8G27x13y4D1Ev();
Name_Map name_map_G27x13y4[] = {
  NSPAIR(_ZN8G27x13y4C1Ev),
  NSPAIR(_ZN8G27x13y4D1Ev),
  {0,0}
};
extern Class_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_E27x13;
extern VTBL_ENTRY _ZTI6E27x13[];
extern  VTBL_ENTRY _ZTV6E27x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x13y4[] = {
  // 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)
    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
    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_E27x13,    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 _ZTI8G27x13y4[];
extern void _ZN6E27x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv)();
extern void ABISELECT(_ZThn24_N6E27x133fooEv,_ZThn20_N6E27x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv)();
extern void ABISELECT(_ZThn40_N6E27x133fooEv,_ZThn28_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x13y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x13y4[0]),
  (VTBL_ENTRY)&_ZN6E27x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G27x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G27x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv),
};
extern VTBL_ENTRY _ZTV8G27x13y4[];
extern void _ZN6E27x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x13__8G27x13y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&_ZN6E27x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv)();
extern void ABISELECT(_ZThn24_N6E27x133fooEv,_ZThn20_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C27__6E27x13__8G27x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv)();
extern void ABISELECT(_ZThn40_N6E27x133fooEv,_ZThn28_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x13__8G27x13y4[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__8G27x13y4[] = {
  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__8G27x13y4[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x13y4[] = {
  {&(_ZTV8G27x13y4[5]),  5,16},
  {&(_tg__ZTV6E27x13__8G27x13y4[5]),  5,6},
  {&(_tg__ZTV3C27__6E27x13__8G27x13y4[5]),  5,6},
  {&(_tg__ZTV2A1__6E27x13__8G27x13y4[3]),  3,4},
  {&(_ZTV8G27x13y4[11]),  11,16},
  {&(_ZTV8G27x13y4[15]),  15,16},
  {&(_tg__ZTV3C27__8G27x13y4[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__8G27x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x13y4[];
extern  VTBL_ENTRY _ZTV8G27x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x13y4[];
static VTBL_ENTRY alt_thunk_names346[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E27x133fooEv,_ZThn28_N6E27x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E27x133fooEv,_ZThn28_N6E27x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x133fooEv,_ZThn20_N6E27x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x133fooEv,_ZThn20_N6E27x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x13y4 = {  "G27x13y4", // class name
  bases_G27x13y4, 6,
  &(vtc_G27x13y4[0]), // expected_vtbl_contents
  &(vtt_G27x13y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G27x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x13y4),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x13y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names346,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x13y5  : virtual E27x13 , F0 {
  int ff;
  ~G27x13y5(); // tgen
  G27x13y5(); // tgen
};
//SIG(1 G27x13y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G27x13y5 ::~G27x13y5(){ note_dtor("G27x13y5", this);} // tgen
G27x13y5 ::G27x13y5(){ note_ctor("G27x13y5", this);} // tgen

static void Test_G27x13y5()
{
  extern Class_Descriptor cd_G27x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G27x13y5, buf);
    G27x13y5 *dp, &lv = *(dp=new (buf) G27x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G27x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x13y5)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,32), "G27x13y5");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,40), "G27x13y5");
    check_base_class_offset(lv, (C27*)(E27x13*), ABISELECT(32,24), "G27x13y5");
    check_base_class_offset(lv, (D0*)(E27x13*), ABISELECT(24,16), "G27x13y5");
    check_base_class_offset(lv, (E27x13*), ABISELECT(16,12), "G27x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G27x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x13y5.ff");
    test_class_info(&lv, &cd_G27x13y5);
    dp->~G27x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x13y5(Test_G27x13y5, "G27x13y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G27x13y5C1Ev();
extern void _ZN8G27x13y5D1Ev();
Name_Map name_map_G27x13y5[] = {
  NSPAIR(_ZN8G27x13y5C1Ev),
  NSPAIR(_ZN8G27x13y5D1Ev),
  {0,0}
};
extern Class_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_E27x13;
extern VTBL_ENTRY _ZTI6E27x13[];
extern  VTBL_ENTRY _ZTV6E27x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x13y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    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_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
    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(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_E27x13,    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
    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 _ZTI8G27x13y5[];
extern void _ZN6E27x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv)();
extern void ABISELECT(_ZThn16_N6E27x133fooEv,_ZThn12_N6E27x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv)();
extern void ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn20_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x13y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x13y5[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G27x13y5[0]),
  (VTBL_ENTRY)&_ZN6E27x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G27x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G27x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv),
};
extern VTBL_ENTRY _ZTV8G27x13y5[];
extern void _ZN6E27x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x13__8G27x13y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&_ZN6E27x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv)();
extern void ABISELECT(_ZThn16_N6E27x133fooEv,_ZThn12_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C27__6E27x13__8G27x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv)();
extern void ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn20_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x13__8G27x13y5[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__8G27x13y5[] = {
  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__8G27x13y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x13y5[] = {
  {&(_ZTV8G27x13y5[6]),  6,23},
  {&(_ZTV8G27x13y5[12]),  12,23},
  {&(_ZTV8G27x13y5[18]),  18,23},
  {&(_ZTV8G27x13y5[22]),  22,23},
  {&(_tg__ZTV6E27x13__8G27x13y5[5]),  5,6},
  {&(_tg__ZTV3C27__6E27x13__8G27x13y5[5]),  5,6},
  {&(_tg__ZTV2A1__6E27x13__8G27x13y5[3]),  3,4},
  {&(_tg__ZTV3C27__8G27x13y5[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__8G27x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x13y5[];
extern  VTBL_ENTRY _ZTV8G27x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x13y5[];
static VTBL_ENTRY alt_thunk_names347[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn20_N6E27x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn20_N6E27x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x133fooEv,_ZThn12_N6E27x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x133fooEv,_ZThn12_N6E27x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x13y5 = {  "G27x13y5", // class name
  bases_G27x13y5, 6,
  &(vtc_G27x13y5[0]), // expected_vtbl_contents
  &(vtt_G27x13y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G27x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x13y5),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x13y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names347,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x13y6  : E27x13 , virtual F0 {
  int ff;
  ~G27x13y6(); // tgen
  G27x13y6(); // tgen
};
//SIG(1 G27x13y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G27x13y6 ::~G27x13y6(){ note_dtor("G27x13y6", this);} // tgen
G27x13y6 ::G27x13y6(){ note_ctor("G27x13y6", this);} // tgen

static void Test_G27x13y6()
{
  extern Class_Descriptor cd_G27x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G27x13y6, buf);
    G27x13y6 *dp, &lv = *(dp=new (buf) G27x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G27x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x13y6)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(40,24), "G27x13y6");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(52,32), "G27x13y6");
    check_base_class_offset(lv, (C27*)(E27x13*), ABISELECT(24,16), "G27x13y6");
    check_base_class_offset(lv, (D0*)(E27x13*), ABISELECT(8,4), "G27x13y6");
    check_base_class_offset(lv, (E27x13*), 0, "G27x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G27x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G27x13y6.ff");
    test_class_info(&lv, &cd_G27x13y6);
    dp->~G27x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x13y6(Test_G27x13y6, "G27x13y6", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G27x13y6C1Ev();
extern void _ZN8G27x13y6D1Ev();
Name_Map name_map_G27x13y6[] = {
  NSPAIR(_ZN8G27x13y6C1Ev),
  NSPAIR(_ZN8G27x13y6D1Ev),
  {0,0}
};
extern Class_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_E27x13;
extern VTBL_ENTRY _ZTI6E27x13[];
extern  VTBL_ENTRY _ZTV6E27x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x13y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,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_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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E27x13,    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 _ZTI8G27x13y6[];
extern void _ZN6E27x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv)();
extern void ABISELECT(_ZThn24_N6E27x133fooEv,_ZThn16_N6E27x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv)();
extern void ABISELECT(_ZThn40_N6E27x133fooEv,_ZThn24_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x13y6[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x13y6[0]),
  (VTBL_ENTRY)&_ZN6E27x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G27x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G27x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv),
};
extern VTBL_ENTRY _ZTV8G27x13y6[];
extern void _ZN6E27x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x13__8G27x13y6[] = {
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&_ZN6E27x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv)();
extern void ABISELECT(_ZThn24_N6E27x133fooEv,_ZThn16_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C27__6E27x13__8G27x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv)();
extern void ABISELECT(_ZThn40_N6E27x133fooEv,_ZThn24_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x13__8G27x13y6[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__8G27x13y6[] = {
  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__8G27x13y6[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x13y6[] = {
  {&(_ZTV8G27x13y6[6]),  6,17},
  {&(_tg__ZTV6E27x13__8G27x13y6[5]),  5,6},
  {&(_tg__ZTV3C27__6E27x13__8G27x13y6[5]),  5,6},
  {&(_tg__ZTV2A1__6E27x13__8G27x13y6[3]),  3,4},
  {&(_ZTV8G27x13y6[12]),  12,17},
  {&(_ZTV8G27x13y6[16]),  16,17},
  {&(_tg__ZTV3C27__8G27x13y6[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__8G27x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x13y6[];
extern  VTBL_ENTRY _ZTV8G27x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x13y6[];
static VTBL_ENTRY alt_thunk_names348[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E27x133fooEv,_ZThn24_N6E27x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E27x133fooEv,_ZThn24_N6E27x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x133fooEv,_ZThn16_N6E27x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x133fooEv,_ZThn16_N6E27x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x13y6 = {  "G27x13y6", // class name
  bases_G27x13y6, 6,
  &(vtc_G27x13y6[0]), // expected_vtbl_contents
  &(vtt_G27x13y6[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G27x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x13y6),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x13y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names348,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x13y7  : virtual E27x13 , virtual F0 {
  int ff;
  ~G27x13y7(); // tgen
  G27x13y7(); // tgen
};
//SIG(1 G27x13y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G27x13y7 ::~G27x13y7(){ note_dtor("G27x13y7", this);} // tgen
G27x13y7 ::G27x13y7(){ note_ctor("G27x13y7", this);} // tgen

static void Test_G27x13y7()
{
  extern Class_Descriptor cd_G27x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G27x13y7, buf);
    G27x13y7 *dp, &lv = *(dp=new (buf) G27x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G27x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x13y7)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,28), "G27x13y7");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,36), "G27x13y7");
    check_base_class_offset(lv, (C27*)(E27x13*), ABISELECT(32,20), "G27x13y7");
    check_base_class_offset(lv, (D0*)(E27x13*), ABISELECT(24,12), "G27x13y7");
    check_base_class_offset(lv, (E27x13*), ABISELECT(16,8), "G27x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G27x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G27x13y7.ff");
    test_class_info(&lv, &cd_G27x13y7);
    dp->~G27x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x13y7(Test_G27x13y7, "G27x13y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G27x13y7C1Ev();
extern void _ZN8G27x13y7D1Ev();
Name_Map name_map_G27x13y7[] = {
  NSPAIR(_ZN8G27x13y7C1Ev),
  NSPAIR(_ZN8G27x13y7D1Ev),
  {0,0}
};
extern Class_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_E27x13;
extern VTBL_ENTRY _ZTI6E27x13[];
extern  VTBL_ENTRY _ZTV6E27x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x13y7[] = {
  // 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(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_E27x13,    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_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 _ZTI8G27x13y7[];
extern void _ZN6E27x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv)();
extern void ABISELECT(_ZThn16_N6E27x133fooEv,_ZThn12_N6E27x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv)();
extern void ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn20_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x13y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x13y7[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G27x13y7[0]),
  (VTBL_ENTRY)&_ZN6E27x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G27x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G27x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv),
};
extern VTBL_ENTRY _ZTV8G27x13y7[];
extern void _ZN6E27x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x13__8G27x13y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&_ZN6E27x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv)();
extern void ABISELECT(_ZThn16_N6E27x133fooEv,_ZThn12_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C27__6E27x13__8G27x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv)();
extern void ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn20_N6E27x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x13__8G27x13y7[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E27x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__8G27x13y7[] = {
  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__8G27x13y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x13y7[] = {
  {&(_ZTV8G27x13y7[7]),  7,24},
  {&(_ZTV8G27x13y7[13]),  13,24},
  {&(_ZTV8G27x13y7[19]),  19,24},
  {&(_ZTV8G27x13y7[23]),  23,24},
  {&(_tg__ZTV6E27x13__8G27x13y7[5]),  5,6},
  {&(_tg__ZTV3C27__6E27x13__8G27x13y7[5]),  5,6},
  {&(_tg__ZTV2A1__6E27x13__8G27x13y7[3]),  3,4},
  {&(_tg__ZTV3C27__8G27x13y7[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__8G27x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x13y7[];
extern  VTBL_ENTRY _ZTV8G27x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x13y7[];
static VTBL_ENTRY alt_thunk_names349[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x133fooEv,_ZTv0_n12_N6E27x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn20_N6E27x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x133fooEv,_ZThn20_N6E27x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E27x133fooEv,_ZTv0_n20_N6E27x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x133fooEv,_ZThn12_N6E27x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x133fooEv,_ZThn12_N6E27x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x13y7 = {  "G27x13y7", // class name
  bases_G27x13y7, 6,
  &(vtc_G27x13y7[0]), // expected_vtbl_contents
  &(vtt_G27x13y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G27x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x13y7),24, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x13y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names349,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E28x13  : virtual C28 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E28x133fooEv
  ~E28x13(); // tgen
  E28x13(); // tgen
};
//SIG(-1 E28x13) C1{ VBC2{ BC3{ Fi} VBC4{ v1 Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E28x13 ::foo(){vfunc_called(this, "_ZN6E28x133fooEv");}
E28x13 ::~E28x13(){ note_dtor("E28x13", this);} // tgen
E28x13 ::E28x13(){ note_ctor("E28x13", this);} // tgen

static void Test_E28x13()
{
  extern Class_Descriptor cd_E28x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E28x13, buf);
    E28x13 *dp, &lv = *(dp=new (buf) E28x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E28x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E28x13)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(24,16), "E28x13");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(32,24), "E28x13");
    check_base_class_offset(lv, (C28*), ABISELECT(16,12), "E28x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E28x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E28x13.fd");
    test_class_info(&lv, &cd_E28x13);
    dp->~E28x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE28x13(Test_E28x13, "E28x13", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E28x13C1Ev();
extern void _ZN6E28x13D1Ev();
Name_Map name_map_E28x13[] = {
  NSPAIR(_ZN6E28x13C1Ev),
  NSPAIR(_ZN6E28x13D1Ev),
  {0,0}
};
extern Class_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_E28x13[] = {
  // 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
    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
    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 _ZTI6E28x13[];
extern void _ZN6E28x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv)();
extern void ABISELECT(_ZThn16_N6E28x133fooEv,_ZThn12_N6E28x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv)();
extern void ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E28x13[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&_ZN6E28x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv),
};
extern VTBL_ENTRY _ZTV6E28x13[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__6E28x13[] = {
  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__6E28x13[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_E28x13[] = {
  {&(_ZTV6E28x13[4]),  4,14},
  {&(_ZTV6E28x13[9]),  9,14},
  {&(_ZTV6E28x13[13]),  13,14},
  {&(_tg__ZTV3C28__6E28x13[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__6E28x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E28x13[];
extern  VTBL_ENTRY _ZTV6E28x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x13[];
static VTBL_ENTRY alt_thunk_names350[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x133fooEv,_ZThn12_N6E28x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E28x13 = {  "E28x13", // class name
  bases_E28x13, 4,
  &(vtc_E28x13[0]), // expected_vtbl_contents
  &(vtt_E28x13[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E28x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E28x13),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E28x13),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names350,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x13y0  : E28x13 , F1 {
  int ff;
  ~G28x13y0(); // tgen
  G28x13y0(); // tgen
};
//SIG(1 G28x13y0) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G28x13y0 ::~G28x13y0(){ note_dtor("G28x13y0", this);} // tgen
G28x13y0 ::G28x13y0(){ note_ctor("G28x13y0", this);} // tgen

static void Test_G28x13y0()
{
  extern Class_Descriptor cd_G28x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G28x13y0, buf);
    G28x13y0 *dp, &lv = *(dp=new (buf) G28x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G28x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x13y0)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,28), "G28x13y0");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,36), "G28x13y0");
    check_base_class_offset(lv, (C28*)(E28x13*), ABISELECT(32,24), "G28x13y0");
    check_base_class_offset(lv, (D0*)(E28x13*), ABISELECT(8,4), "G28x13y0");
    check_base_class_offset(lv, (E28x13*), 0, "G28x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G28x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G28x13y0.ff");
    test_class_info(&lv, &cd_G28x13y0);
    dp->~G28x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x13y0(Test_G28x13y0, "G28x13y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G28x13y0C1Ev();
extern void _ZN8G28x13y0D1Ev();
Name_Map name_map_G28x13y0[] = {
  NSPAIR(_ZN8G28x13y0C1Ev),
  NSPAIR(_ZN8G28x13y0D1Ev),
  {0,0}
};
extern Class_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_E28x13;
extern VTBL_ENTRY _ZTI6E28x13[];
extern  VTBL_ENTRY _ZTV6E28x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x13y0[] = {
  // 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)
    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
    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_E28x13,    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
    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 _ZTI8G28x13y0[];
extern void _ZN6E28x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv)();
extern void ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv)();
extern void ABISELECT(_ZThn48_N6E28x133fooEv,_ZThn36_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x13y0[0]),
  (VTBL_ENTRY)&_ZN6E28x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G28x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G28x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv),
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G28x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv),
};
extern VTBL_ENTRY _ZTV8G28x13y0[];
extern void _ZN6E28x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x13__8G28x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&_ZN6E28x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv)();
extern void ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C28__6E28x13__8G28x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv)();
extern void ABISELECT(_ZThn48_N6E28x133fooEv,_ZThn36_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x13__8G28x13y0[] = {
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__8G28x13y0[] = {
  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__8G28x13y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x13y0[] = {
  {&(_ZTV8G28x13y0[4]),  4,17},
  {&(_tg__ZTV6E28x13__8G28x13y0[4]),  4,5},
  {&(_tg__ZTV3C28__6E28x13__8G28x13y0[4]),  4,5},
  {&(_tg__ZTV2B1__6E28x13__8G28x13y0[3]),  3,4},
  {&(_ZTV8G28x13y0[12]),  12,17},
  {&(_ZTV8G28x13y0[16]),  16,17},
  {&(_tg__ZTV3C28__8G28x13y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__8G28x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x13y0[];
extern  VTBL_ENTRY _ZTV8G28x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x13y0[];
static VTBL_ENTRY alt_thunk_names351[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E28x133fooEv,_ZThn36_N6E28x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E28x133fooEv,_ZThn36_N6E28x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x13y0 = {  "G28x13y0", // class name
  bases_G28x13y0, 6,
  &(vtc_G28x13y0[0]), // expected_vtbl_contents
  &(vtt_G28x13y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G28x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x13y0),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x13y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names351,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x13y1  : virtual E28x13 , F1 {
  int ff;
  ~G28x13y1(); // tgen
  G28x13y1(); // tgen
};
//SIG(1 G28x13y1) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G28x13y1 ::~G28x13y1(){ note_dtor("G28x13y1", this);} // tgen
G28x13y1 ::G28x13y1(){ note_ctor("G28x13y1", this);} // tgen

static void Test_G28x13y1()
{
  extern Class_Descriptor cd_G28x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G28x13y1, buf);
    G28x13y1 *dp, &lv = *(dp=new (buf) G28x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G28x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x13y1)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,28), "G28x13y1");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,36), "G28x13y1");
    check_base_class_offset(lv, (C28*)(E28x13*), ABISELECT(32,24), "G28x13y1");
    check_base_class_offset(lv, (D0*)(E28x13*), ABISELECT(24,16), "G28x13y1");
    check_base_class_offset(lv, (E28x13*), ABISELECT(16,12), "G28x13y1");
    check_base_class_offset(lv, (F1*), 0, "G28x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x13y1.ff");
    test_class_info(&lv, &cd_G28x13y1);
    dp->~G28x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x13y1(Test_G28x13y1, "G28x13y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G28x13y1C1Ev();
extern void _ZN8G28x13y1D1Ev();
Name_Map name_map_G28x13y1[] = {
  NSPAIR(_ZN8G28x13y1C1Ev),
  NSPAIR(_ZN8G28x13y1D1Ev),
  {0,0}
};
extern Class_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_E28x13;
extern VTBL_ENTRY _ZTI6E28x13[];
extern  VTBL_ENTRY _ZTV6E28x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x13y1[] = {
  // 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
    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,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_E28x13,    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_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 _ZTI8G28x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E28x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv)();
extern void ABISELECT(_ZThn16_N6E28x133fooEv,_ZThn12_N6E28x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv)();
extern void ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G28x13y1[0]),
  (VTBL_ENTRY)&_ZN6E28x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G28x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G28x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv),
};
extern VTBL_ENTRY _ZTV8G28x13y1[];
extern void _ZN6E28x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x13__8G28x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&_ZN6E28x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv)();
extern void ABISELECT(_ZThn16_N6E28x133fooEv,_ZThn12_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C28__6E28x13__8G28x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv)();
extern void ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x13__8G28x13y1[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__8G28x13y1[] = {
  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__8G28x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x13y1[] = {
  {&(_ZTV8G28x13y1[5]),  5,21},
  {&(_ZTV8G28x13y1[11]),  11,21},
  {&(_ZTV8G28x13y1[16]),  16,21},
  {&(_ZTV8G28x13y1[20]),  20,21},
  {&(_tg__ZTV6E28x13__8G28x13y1[4]),  4,5},
  {&(_tg__ZTV3C28__6E28x13__8G28x13y1[4]),  4,5},
  {&(_tg__ZTV2B1__6E28x13__8G28x13y1[3]),  3,4},
  {&(_tg__ZTV3C28__8G28x13y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__8G28x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x13y1[];
extern  VTBL_ENTRY _ZTV8G28x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x13y1[];
static VTBL_ENTRY alt_thunk_names352[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x133fooEv,_ZThn12_N6E28x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x133fooEv,_ZThn12_N6E28x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x13y1 = {  "G28x13y1", // class name
  bases_G28x13y1, 6,
  &(vtc_G28x13y1[0]), // expected_vtbl_contents
  &(vtt_G28x13y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G28x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x13y1),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x13y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names352,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x13y2  : E28x13 , virtual F1 {
  int ff;
  ~G28x13y2(); // tgen
  G28x13y2(); // tgen
};
//SIG(1 G28x13y2) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G28x13y2 ::~G28x13y2(){ note_dtor("G28x13y2", this);} // tgen
G28x13y2 ::G28x13y2(){ note_ctor("G28x13y2", this);} // tgen

static void Test_G28x13y2()
{
  extern Class_Descriptor cd_G28x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G28x13y2, buf);
    G28x13y2 *dp, &lv = *(dp=new (buf) G28x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G28x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x13y2)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(32,20), "G28x13y2");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(40,28), "G28x13y2");
    check_base_class_offset(lv, (C28*)(E28x13*), ABISELECT(24,16), "G28x13y2");
    check_base_class_offset(lv, (D0*)(E28x13*), ABISELECT(8,4), "G28x13y2");
    check_base_class_offset(lv, (E28x13*), 0, "G28x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G28x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G28x13y2.ff");
    test_class_info(&lv, &cd_G28x13y2);
    dp->~G28x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x13y2(Test_G28x13y2, "G28x13y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G28x13y2C1Ev();
extern void _ZN8G28x13y2D1Ev();
Name_Map name_map_G28x13y2[] = {
  NSPAIR(_ZN8G28x13y2C1Ev),
  NSPAIR(_ZN8G28x13y2D1Ev),
  {0,0}
};
extern Class_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_E28x13;
extern VTBL_ENTRY _ZTI6E28x13[];
extern  VTBL_ENTRY _ZTV6E28x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x13y2[] = {
  // 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
    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(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_E28x13,    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
    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 _ZTI8G28x13y2[];
extern void _ZN6E28x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv)();
extern void ABISELECT(_ZThn24_N6E28x133fooEv,_ZThn16_N6E28x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv)();
extern void ABISELECT(_ZThn40_N6E28x133fooEv,_ZThn28_N6E28x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G28x13y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x13y2[0]),
  (VTBL_ENTRY)&_ZN6E28x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G28x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G28x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G28x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G28x13y2[];
extern void _ZN6E28x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x13__8G28x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&_ZN6E28x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv)();
extern void ABISELECT(_ZThn24_N6E28x133fooEv,_ZThn16_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C28__6E28x13__8G28x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv)();
extern void ABISELECT(_ZThn40_N6E28x133fooEv,_ZThn28_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x13__8G28x13y2[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__8G28x13y2[] = {
  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__8G28x13y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x13y2[] = {
  {&(_ZTV8G28x13y2[5]),  5,19},
  {&(_tg__ZTV6E28x13__8G28x13y2[4]),  4,5},
  {&(_tg__ZTV3C28__6E28x13__8G28x13y2[4]),  4,5},
  {&(_tg__ZTV2B1__6E28x13__8G28x13y2[3]),  3,4},
  {&(_ZTV8G28x13y2[10]),  10,19},
  {&(_ZTV8G28x13y2[14]),  14,19},
  {&(_ZTV8G28x13y2[18]),  18,19},
  {&(_tg__ZTV3C28__8G28x13y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__8G28x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x13y2[];
extern  VTBL_ENTRY _ZTV8G28x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x13y2[];
static VTBL_ENTRY alt_thunk_names353[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E28x133fooEv,_ZThn28_N6E28x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E28x133fooEv,_ZThn28_N6E28x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x133fooEv,_ZThn16_N6E28x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x133fooEv,_ZThn16_N6E28x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x13y2 = {  "G28x13y2", // class name
  bases_G28x13y2, 6,
  &(vtc_G28x13y2[0]), // expected_vtbl_contents
  &(vtt_G28x13y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G28x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x13y2),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x13y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names353,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x13y3  : virtual E28x13 , virtual F1 {
  int ff;
  ~G28x13y3(); // tgen
  G28x13y3(); // tgen
};
//SIG(1 G28x13y3) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G28x13y3 ::~G28x13y3(){ note_dtor("G28x13y3", this);} // tgen
G28x13y3 ::G28x13y3(){ note_ctor("G28x13y3", this);} // tgen

static void Test_G28x13y3()
{
  extern Class_Descriptor cd_G28x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G28x13y3, buf);
    G28x13y3 *dp, &lv = *(dp=new (buf) G28x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G28x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x13y3)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,24), "G28x13y3");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,32), "G28x13y3");
    check_base_class_offset(lv, (C28*)(E28x13*), ABISELECT(32,20), "G28x13y3");
    check_base_class_offset(lv, (D0*)(E28x13*), ABISELECT(24,12), "G28x13y3");
    check_base_class_offset(lv, (E28x13*), ABISELECT(16,8), "G28x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G28x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G28x13y3.ff");
    test_class_info(&lv, &cd_G28x13y3);
    dp->~G28x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x13y3(Test_G28x13y3, "G28x13y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G28x13y3C1Ev();
extern void _ZN8G28x13y3D1Ev();
Name_Map name_map_G28x13y3[] = {
  NSPAIR(_ZN8G28x13y3C1Ev),
  NSPAIR(_ZN8G28x13y3D1Ev),
  {0,0}
};
extern Class_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_E28x13;
extern VTBL_ENTRY _ZTI6E28x13[];
extern  VTBL_ENTRY _ZTV6E28x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x13y3[] = {
  // 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
    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_E28x13,    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
    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 _ZTI8G28x13y3[];
extern void _ZN6E28x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv)();
extern void ABISELECT(_ZThn16_N6E28x133fooEv,_ZThn12_N6E28x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv)();
extern void ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G28x13y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G28x13y3[0]),
  (VTBL_ENTRY)&_ZN6E28x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G28x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G28x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G28x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G28x13y3[];
extern void _ZN6E28x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x13__8G28x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&_ZN6E28x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv)();
extern void ABISELECT(_ZThn16_N6E28x133fooEv,_ZThn12_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C28__6E28x13__8G28x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv)();
extern void ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x13__8G28x13y3[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__8G28x13y3[] = {
  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__8G28x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x13y3[] = {
  {&(_ZTV8G28x13y3[6]),  6,25},
  {&(_ZTV8G28x13y3[11]),  11,25},
  {&(_ZTV8G28x13y3[16]),  16,25},
  {&(_ZTV8G28x13y3[20]),  20,25},
  {&(_ZTV8G28x13y3[24]),  24,25},
  {&(_tg__ZTV6E28x13__8G28x13y3[4]),  4,5},
  {&(_tg__ZTV3C28__6E28x13__8G28x13y3[4]),  4,5},
  {&(_tg__ZTV2B1__6E28x13__8G28x13y3[3]),  3,4},
  {&(_tg__ZTV3C28__8G28x13y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__8G28x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x13y3[];
extern  VTBL_ENTRY _ZTV8G28x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x13y3[];
static VTBL_ENTRY alt_thunk_names354[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x133fooEv,_ZThn12_N6E28x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x133fooEv,_ZThn12_N6E28x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x13y3 = {  "G28x13y3", // class name
  bases_G28x13y3, 6,
  &(vtc_G28x13y3[0]), // expected_vtbl_contents
  &(vtt_G28x13y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G28x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x13y3),25, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x13y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names354,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x13y4  : E28x13 , F0 {
  int ff;
  ~G28x13y4(); // tgen
  G28x13y4(); // tgen
};
//SIG(1 G28x13y4) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G28x13y4 ::~G28x13y4(){ note_dtor("G28x13y4", this);} // tgen
G28x13y4 ::G28x13y4(){ note_ctor("G28x13y4", this);} // tgen

static void Test_G28x13y4()
{
  extern Class_Descriptor cd_G28x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x13y4, buf);
    G28x13y4 *dp, &lv = *(dp=new (buf) G28x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x13y4)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(32,24), "G28x13y4");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(40,32), "G28x13y4");
    check_base_class_offset(lv, (C28*)(E28x13*), ABISELECT(24,20), "G28x13y4");
    check_base_class_offset(lv, (D0*)(E28x13*), ABISELECT(8,4), "G28x13y4");
    check_base_class_offset(lv, (E28x13*), 0, "G28x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G28x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G28x13y4.ff");
    test_class_info(&lv, &cd_G28x13y4);
    dp->~G28x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x13y4(Test_G28x13y4, "G28x13y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G28x13y4C1Ev();
extern void _ZN8G28x13y4D1Ev();
Name_Map name_map_G28x13y4[] = {
  NSPAIR(_ZN8G28x13y4C1Ev),
  NSPAIR(_ZN8G28x13y4D1Ev),
  {0,0}
};
extern Class_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_E28x13;
extern VTBL_ENTRY _ZTI6E28x13[];
extern  VTBL_ENTRY _ZTV6E28x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x13y4[] = {
  // 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
    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,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_E28x13,    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 _ZTI8G28x13y4[];
extern void _ZN6E28x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv)();
extern void ABISELECT(_ZThn24_N6E28x133fooEv,_ZThn20_N6E28x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv)();
extern void ABISELECT(_ZThn40_N6E28x133fooEv,_ZThn32_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x13y4[0]),
  (VTBL_ENTRY)&_ZN6E28x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G28x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv),
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G28x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv),
};
extern VTBL_ENTRY _ZTV8G28x13y4[];
extern void _ZN6E28x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x13__8G28x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&_ZN6E28x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv)();
extern void ABISELECT(_ZThn24_N6E28x133fooEv,_ZThn20_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C28__6E28x13__8G28x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv)();
extern void ABISELECT(_ZThn40_N6E28x133fooEv,_ZThn32_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x13__8G28x13y4[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__8G28x13y4[] = {
  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__8G28x13y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x13y4[] = {
  {&(_ZTV8G28x13y4[4]),  4,14},
  {&(_tg__ZTV6E28x13__8G28x13y4[4]),  4,5},
  {&(_tg__ZTV3C28__6E28x13__8G28x13y4[4]),  4,5},
  {&(_tg__ZTV2B1__6E28x13__8G28x13y4[3]),  3,4},
  {&(_ZTV8G28x13y4[9]),  9,14},
  {&(_ZTV8G28x13y4[13]),  13,14},
  {&(_tg__ZTV3C28__8G28x13y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__8G28x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x13y4[];
extern  VTBL_ENTRY _ZTV8G28x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x13y4[];
static VTBL_ENTRY alt_thunk_names355[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E28x133fooEv,_ZThn32_N6E28x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E28x133fooEv,_ZThn32_N6E28x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x133fooEv,_ZThn20_N6E28x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x133fooEv,_ZThn20_N6E28x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x13y4 = {  "G28x13y4", // class name
  bases_G28x13y4, 6,
  &(vtc_G28x13y4[0]), // expected_vtbl_contents
  &(vtt_G28x13y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G28x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x13y4),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x13y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names355,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x13y5  : virtual E28x13 , F0 {
  int ff;
  ~G28x13y5(); // tgen
  G28x13y5(); // tgen
};
//SIG(1 G28x13y5) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G28x13y5 ::~G28x13y5(){ note_dtor("G28x13y5", this);} // tgen
G28x13y5 ::G28x13y5(){ note_ctor("G28x13y5", this);} // tgen

static void Test_G28x13y5()
{
  extern Class_Descriptor cd_G28x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G28x13y5, buf);
    G28x13y5 *dp, &lv = *(dp=new (buf) G28x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G28x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x13y5)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,28), "G28x13y5");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,36), "G28x13y5");
    check_base_class_offset(lv, (C28*)(E28x13*), ABISELECT(32,24), "G28x13y5");
    check_base_class_offset(lv, (D0*)(E28x13*), ABISELECT(24,16), "G28x13y5");
    check_base_class_offset(lv, (E28x13*), ABISELECT(16,12), "G28x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G28x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x13y5.ff");
    test_class_info(&lv, &cd_G28x13y5);
    dp->~G28x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x13y5(Test_G28x13y5, "G28x13y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G28x13y5C1Ev();
extern void _ZN8G28x13y5D1Ev();
Name_Map name_map_G28x13y5[] = {
  NSPAIR(_ZN8G28x13y5C1Ev),
  NSPAIR(_ZN8G28x13y5D1Ev),
  {0,0}
};
extern Class_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_E28x13;
extern VTBL_ENTRY _ZTI6E28x13[];
extern  VTBL_ENTRY _ZTV6E28x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x13y5[] = {
  // 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
    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,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_E28x13,    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_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 _ZTI8G28x13y5[];
extern void _ZN6E28x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv)();
extern void ABISELECT(_ZThn16_N6E28x133fooEv,_ZThn12_N6E28x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv)();
extern void ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G28x13y5[0]),
  (VTBL_ENTRY)&_ZN6E28x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G28x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G28x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv),
};
extern VTBL_ENTRY _ZTV8G28x13y5[];
extern void _ZN6E28x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x13__8G28x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&_ZN6E28x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv)();
extern void ABISELECT(_ZThn16_N6E28x133fooEv,_ZThn12_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C28__6E28x13__8G28x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv)();
extern void ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x13__8G28x13y5[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__8G28x13y5[] = {
  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__8G28x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x13y5[] = {
  {&(_ZTV8G28x13y5[5]),  5,20},
  {&(_ZTV8G28x13y5[10]),  10,20},
  {&(_ZTV8G28x13y5[15]),  15,20},
  {&(_ZTV8G28x13y5[19]),  19,20},
  {&(_tg__ZTV6E28x13__8G28x13y5[4]),  4,5},
  {&(_tg__ZTV3C28__6E28x13__8G28x13y5[4]),  4,5},
  {&(_tg__ZTV2B1__6E28x13__8G28x13y5[3]),  3,4},
  {&(_tg__ZTV3C28__8G28x13y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__8G28x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x13y5[];
extern  VTBL_ENTRY _ZTV8G28x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x13y5[];
static VTBL_ENTRY alt_thunk_names356[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x133fooEv,_ZThn12_N6E28x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x133fooEv,_ZThn12_N6E28x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x13y5 = {  "G28x13y5", // class name
  bases_G28x13y5, 6,
  &(vtc_G28x13y5[0]), // expected_vtbl_contents
  &(vtt_G28x13y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G28x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x13y5),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x13y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names356,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x13y6  : E28x13 , virtual F0 {
  int ff;
  ~G28x13y6(); // tgen
  G28x13y6(); // tgen
};
//SIG(1 G28x13y6) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G28x13y6 ::~G28x13y6(){ note_dtor("G28x13y6", this);} // tgen
G28x13y6 ::G28x13y6(){ note_ctor("G28x13y6", this);} // tgen

static void Test_G28x13y6()
{
  extern Class_Descriptor cd_G28x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x13y6, buf);
    G28x13y6 *dp, &lv = *(dp=new (buf) G28x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x13y6)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(32,20), "G28x13y6");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(40,28), "G28x13y6");
    check_base_class_offset(lv, (C28*)(E28x13*), ABISELECT(24,16), "G28x13y6");
    check_base_class_offset(lv, (D0*)(E28x13*), ABISELECT(8,4), "G28x13y6");
    check_base_class_offset(lv, (E28x13*), 0, "G28x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G28x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G28x13y6.ff");
    test_class_info(&lv, &cd_G28x13y6);
    dp->~G28x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x13y6(Test_G28x13y6, "G28x13y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G28x13y6C1Ev();
extern void _ZN8G28x13y6D1Ev();
Name_Map name_map_G28x13y6[] = {
  NSPAIR(_ZN8G28x13y6C1Ev),
  NSPAIR(_ZN8G28x13y6D1Ev),
  {0,0}
};
extern Class_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_E28x13;
extern VTBL_ENTRY _ZTI6E28x13[];
extern  VTBL_ENTRY _ZTV6E28x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x13y6[] = {
  // 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
    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(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_E28x13,    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 _ZTI8G28x13y6[];
extern void _ZN6E28x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv)();
extern void ABISELECT(_ZThn24_N6E28x133fooEv,_ZThn16_N6E28x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv)();
extern void ABISELECT(_ZThn40_N6E28x133fooEv,_ZThn28_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x13y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x13y6[0]),
  (VTBL_ENTRY)&_ZN6E28x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G28x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G28x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv),
};
extern VTBL_ENTRY _ZTV8G28x13y6[];
extern void _ZN6E28x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x13__8G28x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&_ZN6E28x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv)();
extern void ABISELECT(_ZThn24_N6E28x133fooEv,_ZThn16_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C28__6E28x13__8G28x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv)();
extern void ABISELECT(_ZThn40_N6E28x133fooEv,_ZThn28_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x13__8G28x13y6[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__8G28x13y6[] = {
  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__8G28x13y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x13y6[] = {
  {&(_ZTV8G28x13y6[5]),  5,15},
  {&(_tg__ZTV6E28x13__8G28x13y6[4]),  4,5},
  {&(_tg__ZTV3C28__6E28x13__8G28x13y6[4]),  4,5},
  {&(_tg__ZTV2B1__6E28x13__8G28x13y6[3]),  3,4},
  {&(_ZTV8G28x13y6[10]),  10,15},
  {&(_ZTV8G28x13y6[14]),  14,15},
  {&(_tg__ZTV3C28__8G28x13y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__8G28x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x13y6[];
extern  VTBL_ENTRY _ZTV8G28x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x13y6[];
static VTBL_ENTRY alt_thunk_names357[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E28x133fooEv,_ZThn28_N6E28x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E28x133fooEv,_ZThn28_N6E28x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x133fooEv,_ZThn16_N6E28x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x133fooEv,_ZThn16_N6E28x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x13y6 = {  "G28x13y6", // class name
  bases_G28x13y6, 6,
  &(vtc_G28x13y6[0]), // expected_vtbl_contents
  &(vtt_G28x13y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G28x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x13y6),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x13y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names357,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x13y7  : virtual E28x13 , virtual F0 {
  int ff;
  ~G28x13y7(); // tgen
  G28x13y7(); // tgen
};
//SIG(1 G28x13y7) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G28x13y7 ::~G28x13y7(){ note_dtor("G28x13y7", this);} // tgen
G28x13y7 ::G28x13y7(){ note_ctor("G28x13y7", this);} // tgen

static void Test_G28x13y7()
{
  extern Class_Descriptor cd_G28x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G28x13y7, buf);
    G28x13y7 *dp, &lv = *(dp=new (buf) G28x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G28x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x13y7)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,24), "G28x13y7");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,32), "G28x13y7");
    check_base_class_offset(lv, (C28*)(E28x13*), ABISELECT(32,20), "G28x13y7");
    check_base_class_offset(lv, (D0*)(E28x13*), ABISELECT(24,12), "G28x13y7");
    check_base_class_offset(lv, (E28x13*), ABISELECT(16,8), "G28x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G28x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G28x13y7.ff");
    test_class_info(&lv, &cd_G28x13y7);
    dp->~G28x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x13y7(Test_G28x13y7, "G28x13y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G28x13y7C1Ev();
extern void _ZN8G28x13y7D1Ev();
Name_Map name_map_G28x13y7[] = {
  NSPAIR(_ZN8G28x13y7C1Ev),
  NSPAIR(_ZN8G28x13y7D1Ev),
  {0,0}
};
extern Class_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_E28x13;
extern VTBL_ENTRY _ZTI6E28x13[];
extern  VTBL_ENTRY _ZTV6E28x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x13y7[] = {
  // 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(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_E28x13,    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_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 _ZTI8G28x13y7[];
extern void _ZN6E28x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv)();
extern void ABISELECT(_ZThn16_N6E28x133fooEv,_ZThn12_N6E28x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv)();
extern void ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x13y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G28x13y7[0]),
  (VTBL_ENTRY)&_ZN6E28x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G28x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G28x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv),
};
extern VTBL_ENTRY _ZTV8G28x13y7[];
extern void _ZN6E28x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x13__8G28x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&_ZN6E28x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv)();
extern void ABISELECT(_ZThn16_N6E28x133fooEv,_ZThn12_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C28__6E28x13__8G28x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv)();
extern void ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x13__8G28x13y7[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E28x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__8G28x13y7[] = {
  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__8G28x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x13y7[] = {
  {&(_ZTV8G28x13y7[6]),  6,21},
  {&(_ZTV8G28x13y7[11]),  11,21},
  {&(_ZTV8G28x13y7[16]),  16,21},
  {&(_ZTV8G28x13y7[20]),  20,21},
  {&(_tg__ZTV6E28x13__8G28x13y7[4]),  4,5},
  {&(_tg__ZTV3C28__6E28x13__8G28x13y7[4]),  4,5},
  {&(_tg__ZTV2B1__6E28x13__8G28x13y7[3]),  3,4},
  {&(_tg__ZTV3C28__8G28x13y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__8G28x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x13y7[];
extern  VTBL_ENTRY _ZTV8G28x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x13y7[];
static VTBL_ENTRY alt_thunk_names358[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x133fooEv,_ZTv0_n12_N6E28x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x133fooEv,_ZThn24_N6E28x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E28x133fooEv,_ZTv0_n16_N6E28x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x133fooEv,_ZThn12_N6E28x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x133fooEv,_ZThn12_N6E28x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x13y7 = {  "G28x13y7", // class name
  bases_G28x13y7, 6,
  &(vtc_G28x13y7[0]), // expected_vtbl_contents
  &(vtt_G28x13y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G28x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x13y7),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x13y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names358,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E29x13  : virtual C29 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E29x133fooEv
  ~E29x13(); // tgen
  E29x13(); // tgen
};
//SIG(-1 E29x13) C1{ VBC2{ BC3{ v1 Fi} VBC4{ v1 Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E29x13 ::foo(){vfunc_called(this, "_ZN6E29x133fooEv");}
E29x13 ::~E29x13(){ note_dtor("E29x13", this);} // tgen
E29x13 ::E29x13(){ note_ctor("E29x13", this);} // tgen

static void Test_E29x13()
{
  extern Class_Descriptor cd_E29x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E29x13, buf);
    E29x13 *dp, &lv = *(dp=new (buf) E29x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E29x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E29x13)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(16,12), "E29x13");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(32,24), "E29x13");
    check_base_class_offset(lv, (C29*), ABISELECT(16,12), "E29x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E29x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E29x13.fd");
    test_class_info(&lv, &cd_E29x13);
    dp->~E29x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE29x13(Test_E29x13, "E29x13", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E29x13C1Ev();
extern void _ZN6E29x13D1Ev();
Name_Map name_map_E29x13[] = {
  NSPAIR(_ZN6E29x13C1Ev),
  NSPAIR(_ZN6E29x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x13[] = {
  // 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
    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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6E29x13[];
extern void _ZN6E29x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv)();
extern void ABISELECT(_ZThn16_N6E29x133fooEv,_ZThn12_N6E29x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv)();
extern void ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E29x13[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&_ZN6E29x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv),
};
extern VTBL_ENTRY _ZTV6E29x13[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__6E29x13[] = {
  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__6E29x13[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_E29x13[] = {
  {&(_ZTV6E29x13[4]),  4,14},
  {&(_ZTV6E29x13[9]),  9,14},
  {&(_ZTV6E29x13[13]),  13,14},
  {&(_tg__ZTV3C29__6E29x13[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__6E29x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E29x13[];
extern  VTBL_ENTRY _ZTV6E29x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x13[];
static VTBL_ENTRY alt_thunk_names359[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x133fooEv,_ZThn12_N6E29x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E29x13 = {  "E29x13", // class name
  bases_E29x13, 4,
  &(vtc_E29x13[0]), // expected_vtbl_contents
  &(vtt_E29x13[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E29x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E29x13),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E29x13),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names359,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x13y0  : E29x13 , F1 {
  int ff;
  ~G29x13y0(); // tgen
  G29x13y0(); // tgen
};
//SIG(1 G29x13y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G29x13y0 ::~G29x13y0(){ note_dtor("G29x13y0", this);} // tgen
G29x13y0 ::G29x13y0(){ note_ctor("G29x13y0", this);} // tgen

static void Test_G29x13y0()
{
  extern Class_Descriptor cd_G29x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G29x13y0, buf);
    G29x13y0 *dp, &lv = *(dp=new (buf) G29x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G29x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x13y0)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,24), "G29x13y0");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,36), "G29x13y0");
    check_base_class_offset(lv, (C29*)(E29x13*), ABISELECT(32,24), "G29x13y0");
    check_base_class_offset(lv, (D0*)(E29x13*), ABISELECT(8,4), "G29x13y0");
    check_base_class_offset(lv, (E29x13*), 0, "G29x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G29x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G29x13y0.ff");
    test_class_info(&lv, &cd_G29x13y0);
    dp->~G29x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x13y0(Test_G29x13y0, "G29x13y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G29x13y0C1Ev();
extern void _ZN8G29x13y0D1Ev();
Name_Map name_map_G29x13y0[] = {
  NSPAIR(_ZN8G29x13y0C1Ev),
  NSPAIR(_ZN8G29x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x13;
extern VTBL_ENTRY _ZTI6E29x13[];
extern  VTBL_ENTRY _ZTV6E29x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x13y0[] = {
  // 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
    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,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
    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_E29x13,    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
    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 _ZTI8G29x13y0[];
extern void _ZN6E29x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv)();
extern void ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv)();
extern void ABISELECT(_ZThn48_N6E29x133fooEv,_ZThn36_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x13y0[0]),
  (VTBL_ENTRY)&_ZN6E29x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G29x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G29x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv),
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G29x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv),
};
extern VTBL_ENTRY _ZTV8G29x13y0[];
extern void _ZN6E29x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x13__8G29x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&_ZN6E29x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv)();
extern void ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C29__6E29x13__8G29x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv)();
extern void ABISELECT(_ZThn48_N6E29x133fooEv,_ZThn36_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x13__8G29x13y0[] = {
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__8G29x13y0[] = {
  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__8G29x13y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x13y0[] = {
  {&(_ZTV8G29x13y0[4]),  4,17},
  {&(_tg__ZTV6E29x13__8G29x13y0[4]),  4,5},
  {&(_tg__ZTV3C29__6E29x13__8G29x13y0[4]),  4,5},
  {&(_tg__ZTV2B1__6E29x13__8G29x13y0[3]),  3,4},
  {&(_ZTV8G29x13y0[12]),  12,17},
  {&(_ZTV8G29x13y0[16]),  16,17},
  {&(_tg__ZTV3C29__8G29x13y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__8G29x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x13y0[];
extern  VTBL_ENTRY _ZTV8G29x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x13y0[];
static VTBL_ENTRY alt_thunk_names360[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E29x133fooEv,_ZThn36_N6E29x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E29x133fooEv,_ZThn36_N6E29x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x13y0 = {  "G29x13y0", // class name
  bases_G29x13y0, 6,
  &(vtc_G29x13y0[0]), // expected_vtbl_contents
  &(vtt_G29x13y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G29x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x13y0),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x13y0),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names360,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x13y1  : virtual E29x13 , F1 {
  int ff;
  ~G29x13y1(); // tgen
  G29x13y1(); // tgen
};
//SIG(1 G29x13y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G29x13y1 ::~G29x13y1(){ note_dtor("G29x13y1", this);} // tgen
G29x13y1 ::G29x13y1(){ note_ctor("G29x13y1", this);} // tgen

static void Test_G29x13y1()
{
  extern Class_Descriptor cd_G29x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G29x13y1, buf);
    G29x13y1 *dp, &lv = *(dp=new (buf) G29x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G29x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x13y1)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,24), "G29x13y1");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,36), "G29x13y1");
    check_base_class_offset(lv, (C29*)(E29x13*), ABISELECT(32,24), "G29x13y1");
    check_base_class_offset(lv, (D0*)(E29x13*), ABISELECT(24,16), "G29x13y1");
    check_base_class_offset(lv, (E29x13*), ABISELECT(16,12), "G29x13y1");
    check_base_class_offset(lv, (F1*), 0, "G29x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x13y1.ff");
    test_class_info(&lv, &cd_G29x13y1);
    dp->~G29x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x13y1(Test_G29x13y1, "G29x13y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G29x13y1C1Ev();
extern void _ZN8G29x13y1D1Ev();
Name_Map name_map_G29x13y1[] = {
  NSPAIR(_ZN8G29x13y1C1Ev),
  NSPAIR(_ZN8G29x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x13;
extern VTBL_ENTRY _ZTI6E29x13[];
extern  VTBL_ENTRY _ZTV6E29x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x13y1[] = {
  // 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
    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,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
    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_E29x13,    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 _ZTI8G29x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E29x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv)();
extern void ABISELECT(_ZThn16_N6E29x133fooEv,_ZThn12_N6E29x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv)();
extern void ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G29x13y1[0]),
  (VTBL_ENTRY)&_ZN6E29x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G29x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G29x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv),
};
extern VTBL_ENTRY _ZTV8G29x13y1[];
extern void _ZN6E29x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x13__8G29x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&_ZN6E29x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv)();
extern void ABISELECT(_ZThn16_N6E29x133fooEv,_ZThn12_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C29__6E29x13__8G29x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv)();
extern void ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x13__8G29x13y1[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__8G29x13y1[] = {
  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__8G29x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x13y1[] = {
  {&(_ZTV8G29x13y1[5]),  5,21},
  {&(_ZTV8G29x13y1[11]),  11,21},
  {&(_ZTV8G29x13y1[16]),  16,21},
  {&(_ZTV8G29x13y1[20]),  20,21},
  {&(_tg__ZTV6E29x13__8G29x13y1[4]),  4,5},
  {&(_tg__ZTV3C29__6E29x13__8G29x13y1[4]),  4,5},
  {&(_tg__ZTV2B1__6E29x13__8G29x13y1[3]),  3,4},
  {&(_tg__ZTV3C29__8G29x13y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__8G29x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x13y1[];
extern  VTBL_ENTRY _ZTV8G29x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x13y1[];
static VTBL_ENTRY alt_thunk_names361[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x133fooEv,_ZThn12_N6E29x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x133fooEv,_ZThn12_N6E29x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x13y1 = {  "G29x13y1", // class name
  bases_G29x13y1, 6,
  &(vtc_G29x13y1[0]), // expected_vtbl_contents
  &(vtt_G29x13y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G29x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x13y1),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x13y1),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names361,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x13y2  : E29x13 , virtual F1 {
  int ff;
  ~G29x13y2(); // tgen
  G29x13y2(); // tgen
};
//SIG(1 G29x13y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G29x13y2 ::~G29x13y2(){ note_dtor("G29x13y2", this);} // tgen
G29x13y2 ::G29x13y2(){ note_ctor("G29x13y2", this);} // tgen

static void Test_G29x13y2()
{
  extern Class_Descriptor cd_G29x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G29x13y2, buf);
    G29x13y2 *dp, &lv = *(dp=new (buf) G29x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G29x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x13y2)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(24,16), "G29x13y2");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(40,28), "G29x13y2");
    check_base_class_offset(lv, (C29*)(E29x13*), ABISELECT(24,16), "G29x13y2");
    check_base_class_offset(lv, (D0*)(E29x13*), ABISELECT(8,4), "G29x13y2");
    check_base_class_offset(lv, (E29x13*), 0, "G29x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G29x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G29x13y2.ff");
    test_class_info(&lv, &cd_G29x13y2);
    dp->~G29x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x13y2(Test_G29x13y2, "G29x13y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G29x13y2C1Ev();
extern void _ZN8G29x13y2D1Ev();
Name_Map name_map_G29x13y2[] = {
  NSPAIR(_ZN8G29x13y2C1Ev),
  NSPAIR(_ZN8G29x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x13;
extern VTBL_ENTRY _ZTI6E29x13[];
extern  VTBL_ENTRY _ZTV6E29x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x13y2[] = {
  // 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
    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(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
    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_E29x13,    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
    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 _ZTI8G29x13y2[];
extern void _ZN6E29x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv)();
extern void ABISELECT(_ZThn24_N6E29x133fooEv,_ZThn16_N6E29x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv)();
extern void ABISELECT(_ZThn40_N6E29x133fooEv,_ZThn28_N6E29x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G29x13y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x13y2[0]),
  (VTBL_ENTRY)&_ZN6E29x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G29x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G29x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G29x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G29x13y2[];
extern void _ZN6E29x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x13__8G29x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&_ZN6E29x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv)();
extern void ABISELECT(_ZThn24_N6E29x133fooEv,_ZThn16_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C29__6E29x13__8G29x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv)();
extern void ABISELECT(_ZThn40_N6E29x133fooEv,_ZThn28_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x13__8G29x13y2[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__8G29x13y2[] = {
  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__8G29x13y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x13y2[] = {
  {&(_ZTV8G29x13y2[5]),  5,19},
  {&(_tg__ZTV6E29x13__8G29x13y2[4]),  4,5},
  {&(_tg__ZTV3C29__6E29x13__8G29x13y2[4]),  4,5},
  {&(_tg__ZTV2B1__6E29x13__8G29x13y2[3]),  3,4},
  {&(_ZTV8G29x13y2[10]),  10,19},
  {&(_ZTV8G29x13y2[14]),  14,19},
  {&(_ZTV8G29x13y2[18]),  18,19},
  {&(_tg__ZTV3C29__8G29x13y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__8G29x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x13y2[];
extern  VTBL_ENTRY _ZTV8G29x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x13y2[];
static VTBL_ENTRY alt_thunk_names362[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E29x133fooEv,_ZThn28_N6E29x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E29x133fooEv,_ZThn28_N6E29x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x133fooEv,_ZThn16_N6E29x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x133fooEv,_ZThn16_N6E29x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x13y2 = {  "G29x13y2", // class name
  bases_G29x13y2, 6,
  &(vtc_G29x13y2[0]), // expected_vtbl_contents
  &(vtt_G29x13y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G29x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x13y2),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x13y2),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names362,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x13y3  : virtual E29x13 , virtual F1 {
  int ff;
  ~G29x13y3(); // tgen
  G29x13y3(); // tgen
};
//SIG(1 G29x13y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G29x13y3 ::~G29x13y3(){ note_dtor("G29x13y3", this);} // tgen
G29x13y3 ::G29x13y3(){ note_ctor("G29x13y3", this);} // tgen

static void Test_G29x13y3()
{
  extern Class_Descriptor cd_G29x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G29x13y3, buf);
    G29x13y3 *dp, &lv = *(dp=new (buf) G29x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G29x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x13y3)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,20), "G29x13y3");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,32), "G29x13y3");
    check_base_class_offset(lv, (C29*)(E29x13*), ABISELECT(32,20), "G29x13y3");
    check_base_class_offset(lv, (D0*)(E29x13*), ABISELECT(24,12), "G29x13y3");
    check_base_class_offset(lv, (E29x13*), ABISELECT(16,8), "G29x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G29x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G29x13y3.ff");
    test_class_info(&lv, &cd_G29x13y3);
    dp->~G29x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x13y3(Test_G29x13y3, "G29x13y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G29x13y3C1Ev();
extern void _ZN8G29x13y3D1Ev();
Name_Map name_map_G29x13y3[] = {
  NSPAIR(_ZN8G29x13y3C1Ev),
  NSPAIR(_ZN8G29x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x13;
extern VTBL_ENTRY _ZTI6E29x13[];
extern  VTBL_ENTRY _ZTV6E29x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x13y3[] = {
  // 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
    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_E29x13,    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(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 _ZTI8G29x13y3[];
extern void _ZN6E29x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv)();
extern void ABISELECT(_ZThn16_N6E29x133fooEv,_ZThn12_N6E29x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv)();
extern void ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G29x13y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G29x13y3[0]),
  (VTBL_ENTRY)&_ZN6E29x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G29x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G29x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G29x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G29x13y3[];
extern void _ZN6E29x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x13__8G29x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&_ZN6E29x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv)();
extern void ABISELECT(_ZThn16_N6E29x133fooEv,_ZThn12_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C29__6E29x13__8G29x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv)();
extern void ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x13__8G29x13y3[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__8G29x13y3[] = {
  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__8G29x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x13y3[] = {
  {&(_ZTV8G29x13y3[6]),  6,25},
  {&(_ZTV8G29x13y3[11]),  11,25},
  {&(_ZTV8G29x13y3[16]),  16,25},
  {&(_ZTV8G29x13y3[20]),  20,25},
  {&(_ZTV8G29x13y3[24]),  24,25},
  {&(_tg__ZTV6E29x13__8G29x13y3[4]),  4,5},
  {&(_tg__ZTV3C29__6E29x13__8G29x13y3[4]),  4,5},
  {&(_tg__ZTV2B1__6E29x13__8G29x13y3[3]),  3,4},
  {&(_tg__ZTV3C29__8G29x13y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__8G29x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x13y3[];
extern  VTBL_ENTRY _ZTV8G29x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x13y3[];
static VTBL_ENTRY alt_thunk_names363[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x133fooEv,_ZThn12_N6E29x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x133fooEv,_ZThn12_N6E29x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x13y3 = {  "G29x13y3", // class name
  bases_G29x13y3, 6,
  &(vtc_G29x13y3[0]), // expected_vtbl_contents
  &(vtt_G29x13y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G29x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x13y3),25, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x13y3),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names363,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x13y4  : E29x13 , F0 {
  int ff;
  ~G29x13y4(); // tgen
  G29x13y4(); // tgen
};
//SIG(1 G29x13y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G29x13y4 ::~G29x13y4(){ note_dtor("G29x13y4", this);} // tgen
G29x13y4 ::G29x13y4(){ note_ctor("G29x13y4", this);} // tgen

static void Test_G29x13y4()
{
  extern Class_Descriptor cd_G29x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x13y4, buf);
    G29x13y4 *dp, &lv = *(dp=new (buf) G29x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x13y4)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(24,20), "G29x13y4");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(40,32), "G29x13y4");
    check_base_class_offset(lv, (C29*)(E29x13*), ABISELECT(24,20), "G29x13y4");
    check_base_class_offset(lv, (D0*)(E29x13*), ABISELECT(8,4), "G29x13y4");
    check_base_class_offset(lv, (E29x13*), 0, "G29x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G29x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G29x13y4.ff");
    test_class_info(&lv, &cd_G29x13y4);
    dp->~G29x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x13y4(Test_G29x13y4, "G29x13y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G29x13y4C1Ev();
extern void _ZN8G29x13y4D1Ev();
Name_Map name_map_G29x13y4[] = {
  NSPAIR(_ZN8G29x13y4C1Ev),
  NSPAIR(_ZN8G29x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x13;
extern VTBL_ENTRY _ZTI6E29x13[];
extern  VTBL_ENTRY _ZTV6E29x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x13y4[] = {
  // 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
    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,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
    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_E29x13,    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 _ZTI8G29x13y4[];
extern void _ZN6E29x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv)();
extern void ABISELECT(_ZThn24_N6E29x133fooEv,_ZThn20_N6E29x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv)();
extern void ABISELECT(_ZThn40_N6E29x133fooEv,_ZThn32_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x13y4[0]),
  (VTBL_ENTRY)&_ZN6E29x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G29x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv),
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G29x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv),
};
extern VTBL_ENTRY _ZTV8G29x13y4[];
extern void _ZN6E29x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x13__8G29x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&_ZN6E29x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv)();
extern void ABISELECT(_ZThn24_N6E29x133fooEv,_ZThn20_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C29__6E29x13__8G29x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv)();
extern void ABISELECT(_ZThn40_N6E29x133fooEv,_ZThn32_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x13__8G29x13y4[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__8G29x13y4[] = {
  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__8G29x13y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x13y4[] = {
  {&(_ZTV8G29x13y4[4]),  4,14},
  {&(_tg__ZTV6E29x13__8G29x13y4[4]),  4,5},
  {&(_tg__ZTV3C29__6E29x13__8G29x13y4[4]),  4,5},
  {&(_tg__ZTV2B1__6E29x13__8G29x13y4[3]),  3,4},
  {&(_ZTV8G29x13y4[9]),  9,14},
  {&(_ZTV8G29x13y4[13]),  13,14},
  {&(_tg__ZTV3C29__8G29x13y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__8G29x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x13y4[];
extern  VTBL_ENTRY _ZTV8G29x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x13y4[];
static VTBL_ENTRY alt_thunk_names364[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E29x133fooEv,_ZThn32_N6E29x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E29x133fooEv,_ZThn32_N6E29x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x133fooEv,_ZThn20_N6E29x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x133fooEv,_ZThn20_N6E29x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x13y4 = {  "G29x13y4", // class name
  bases_G29x13y4, 6,
  &(vtc_G29x13y4[0]), // expected_vtbl_contents
  &(vtt_G29x13y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G29x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x13y4),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x13y4),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names364,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x13y5  : virtual E29x13 , F0 {
  int ff;
  ~G29x13y5(); // tgen
  G29x13y5(); // tgen
};
//SIG(1 G29x13y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G29x13y5 ::~G29x13y5(){ note_dtor("G29x13y5", this);} // tgen
G29x13y5 ::G29x13y5(){ note_ctor("G29x13y5", this);} // tgen

static void Test_G29x13y5()
{
  extern Class_Descriptor cd_G29x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G29x13y5, buf);
    G29x13y5 *dp, &lv = *(dp=new (buf) G29x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G29x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x13y5)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,24), "G29x13y5");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,36), "G29x13y5");
    check_base_class_offset(lv, (C29*)(E29x13*), ABISELECT(32,24), "G29x13y5");
    check_base_class_offset(lv, (D0*)(E29x13*), ABISELECT(24,16), "G29x13y5");
    check_base_class_offset(lv, (E29x13*), ABISELECT(16,12), "G29x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G29x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x13y5.ff");
    test_class_info(&lv, &cd_G29x13y5);
    dp->~G29x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x13y5(Test_G29x13y5, "G29x13y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G29x13y5C1Ev();
extern void _ZN8G29x13y5D1Ev();
Name_Map name_map_G29x13y5[] = {
  NSPAIR(_ZN8G29x13y5C1Ev),
  NSPAIR(_ZN8G29x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x13;
extern VTBL_ENTRY _ZTI6E29x13[];
extern  VTBL_ENTRY _ZTV6E29x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x13y5[] = {
  // 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
    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,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
    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_E29x13,    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 _ZTI8G29x13y5[];
extern void _ZN6E29x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv)();
extern void ABISELECT(_ZThn16_N6E29x133fooEv,_ZThn12_N6E29x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv)();
extern void ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G29x13y5[0]),
  (VTBL_ENTRY)&_ZN6E29x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G29x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G29x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv),
};
extern VTBL_ENTRY _ZTV8G29x13y5[];
extern void _ZN6E29x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x13__8G29x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&_ZN6E29x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv)();
extern void ABISELECT(_ZThn16_N6E29x133fooEv,_ZThn12_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C29__6E29x13__8G29x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv)();
extern void ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x13__8G29x13y5[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__8G29x13y5[] = {
  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__8G29x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x13y5[] = {
  {&(_ZTV8G29x13y5[5]),  5,20},
  {&(_ZTV8G29x13y5[10]),  10,20},
  {&(_ZTV8G29x13y5[15]),  15,20},
  {&(_ZTV8G29x13y5[19]),  19,20},
  {&(_tg__ZTV6E29x13__8G29x13y5[4]),  4,5},
  {&(_tg__ZTV3C29__6E29x13__8G29x13y5[4]),  4,5},
  {&(_tg__ZTV2B1__6E29x13__8G29x13y5[3]),  3,4},
  {&(_tg__ZTV3C29__8G29x13y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__8G29x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x13y5[];
extern  VTBL_ENTRY _ZTV8G29x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x13y5[];
static VTBL_ENTRY alt_thunk_names365[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x133fooEv,_ZThn12_N6E29x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x133fooEv,_ZThn12_N6E29x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x13y5 = {  "G29x13y5", // class name
  bases_G29x13y5, 6,
  &(vtc_G29x13y5[0]), // expected_vtbl_contents
  &(vtt_G29x13y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G29x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x13y5),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x13y5),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names365,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x13y6  : E29x13 , virtual F0 {
  int ff;
  ~G29x13y6(); // tgen
  G29x13y6(); // tgen
};
//SIG(1 G29x13y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G29x13y6 ::~G29x13y6(){ note_dtor("G29x13y6", this);} // tgen
G29x13y6 ::G29x13y6(){ note_ctor("G29x13y6", this);} // tgen

static void Test_G29x13y6()
{
  extern Class_Descriptor cd_G29x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x13y6, buf);
    G29x13y6 *dp, &lv = *(dp=new (buf) G29x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x13y6)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(24,16), "G29x13y6");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(40,28), "G29x13y6");
    check_base_class_offset(lv, (C29*)(E29x13*), ABISELECT(24,16), "G29x13y6");
    check_base_class_offset(lv, (D0*)(E29x13*), ABISELECT(8,4), "G29x13y6");
    check_base_class_offset(lv, (E29x13*), 0, "G29x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G29x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G29x13y6.ff");
    test_class_info(&lv, &cd_G29x13y6);
    dp->~G29x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x13y6(Test_G29x13y6, "G29x13y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G29x13y6C1Ev();
extern void _ZN8G29x13y6D1Ev();
Name_Map name_map_G29x13y6[] = {
  NSPAIR(_ZN8G29x13y6C1Ev),
  NSPAIR(_ZN8G29x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x13;
extern VTBL_ENTRY _ZTI6E29x13[];
extern  VTBL_ENTRY _ZTV6E29x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x13y6[] = {
  // 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
    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(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
    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_E29x13,    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 _ZTI8G29x13y6[];
extern void _ZN6E29x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv)();
extern void ABISELECT(_ZThn24_N6E29x133fooEv,_ZThn16_N6E29x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv)();
extern void ABISELECT(_ZThn40_N6E29x133fooEv,_ZThn28_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x13y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x13y6[0]),
  (VTBL_ENTRY)&_ZN6E29x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G29x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G29x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv),
};
extern VTBL_ENTRY _ZTV8G29x13y6[];
extern void _ZN6E29x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x13__8G29x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&_ZN6E29x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv)();
extern void ABISELECT(_ZThn24_N6E29x133fooEv,_ZThn16_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C29__6E29x13__8G29x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv)();
extern void ABISELECT(_ZThn40_N6E29x133fooEv,_ZThn28_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x13__8G29x13y6[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__8G29x13y6[] = {
  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__8G29x13y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x13y6[] = {
  {&(_ZTV8G29x13y6[5]),  5,15},
  {&(_tg__ZTV6E29x13__8G29x13y6[4]),  4,5},
  {&(_tg__ZTV3C29__6E29x13__8G29x13y6[4]),  4,5},
  {&(_tg__ZTV2B1__6E29x13__8G29x13y6[3]),  3,4},
  {&(_ZTV8G29x13y6[10]),  10,15},
  {&(_ZTV8G29x13y6[14]),  14,15},
  {&(_tg__ZTV3C29__8G29x13y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__8G29x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x13y6[];
extern  VTBL_ENTRY _ZTV8G29x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x13y6[];
static VTBL_ENTRY alt_thunk_names366[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E29x133fooEv,_ZThn28_N6E29x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E29x133fooEv,_ZThn28_N6E29x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x133fooEv,_ZThn16_N6E29x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x133fooEv,_ZThn16_N6E29x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x13y6 = {  "G29x13y6", // class name
  bases_G29x13y6, 6,
  &(vtc_G29x13y6[0]), // expected_vtbl_contents
  &(vtt_G29x13y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G29x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x13y6),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x13y6),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names366,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x13y7  : virtual E29x13 , virtual F0 {
  int ff;
  ~G29x13y7(); // tgen
  G29x13y7(); // tgen
};
//SIG(1 G29x13y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G29x13y7 ::~G29x13y7(){ note_dtor("G29x13y7", this);} // tgen
G29x13y7 ::G29x13y7(){ note_ctor("G29x13y7", this);} // tgen

static void Test_G29x13y7()
{
  extern Class_Descriptor cd_G29x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G29x13y7, buf);
    G29x13y7 *dp, &lv = *(dp=new (buf) G29x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G29x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x13y7)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,20), "G29x13y7");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,32), "G29x13y7");
    check_base_class_offset(lv, (C29*)(E29x13*), ABISELECT(32,20), "G29x13y7");
    check_base_class_offset(lv, (D0*)(E29x13*), ABISELECT(24,12), "G29x13y7");
    check_base_class_offset(lv, (E29x13*), ABISELECT(16,8), "G29x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G29x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G29x13y7.ff");
    test_class_info(&lv, &cd_G29x13y7);
    dp->~G29x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x13y7(Test_G29x13y7, "G29x13y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G29x13y7C1Ev();
extern void _ZN8G29x13y7D1Ev();
Name_Map name_map_G29x13y7[] = {
  NSPAIR(_ZN8G29x13y7C1Ev),
  NSPAIR(_ZN8G29x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x13;
extern VTBL_ENTRY _ZTI6E29x13[];
extern  VTBL_ENTRY _ZTV6E29x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x13y7[] = {
  // 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(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_E29x13,    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(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 _ZTI8G29x13y7[];
extern void _ZN6E29x133fooEv();
extern void ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv)();
extern void ABISELECT(_ZThn16_N6E29x133fooEv,_ZThn12_N6E29x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv)();
extern void ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x13y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G29x13y7[0]),
  (VTBL_ENTRY)&_ZN6E29x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G29x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G29x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv),
};
extern VTBL_ENTRY _ZTV8G29x13y7[];
extern void _ZN6E29x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x13__8G29x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&_ZN6E29x133fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv)();
extern void ABISELECT(_ZThn16_N6E29x133fooEv,_ZThn12_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C29__6E29x13__8G29x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv)();
extern void ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x13__8G29x13y7[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E29x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__8G29x13y7[] = {
  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__8G29x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x13y7[] = {
  {&(_ZTV8G29x13y7[6]),  6,21},
  {&(_ZTV8G29x13y7[11]),  11,21},
  {&(_ZTV8G29x13y7[16]),  16,21},
  {&(_ZTV8G29x13y7[20]),  20,21},
  {&(_tg__ZTV6E29x13__8G29x13y7[4]),  4,5},
  {&(_tg__ZTV3C29__6E29x13__8G29x13y7[4]),  4,5},
  {&(_tg__ZTV2B1__6E29x13__8G29x13y7[3]),  3,4},
  {&(_tg__ZTV3C29__8G29x13y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__8G29x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x13y7[];
extern  VTBL_ENTRY _ZTV8G29x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x13y7[];
static VTBL_ENTRY alt_thunk_names367[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x133fooEv,_ZTv0_n12_N6E29x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x133fooEv,_ZThn24_N6E29x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E29x133fooEv,_ZTv0_n16_N6E29x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x133fooEv,_ZThn12_N6E29x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x133fooEv,_ZThn12_N6E29x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x13y7 = {  "G29x13y7", // class name
  bases_G29x13y7, 6,
  &(vtc_G29x13y7[0]), // expected_vtbl_contents
  &(vtt_G29x13y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G29x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x13y7),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x13y7),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names367,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E30x13  : virtual C30 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E30x133fooEv
  ~E30x13(); // tgen
  E30x13(); // tgen
};
//SIG(-1 E30x13) C1{ VBC2{ VBC3{ Fi} VBC4{ v1 Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E30x13 ::foo(){vfunc_called(this, "_ZN6E30x133fooEv");}
E30x13 ::~E30x13(){ note_dtor("E30x13", this);} // tgen
E30x13 ::E30x13(){ note_ctor("E30x13", this);} // tgen

static void Test_E30x13()
{
  extern Class_Descriptor cd_E30x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E30x13, buf);
    E30x13 *dp, &lv = *(dp=new (buf) E30x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E30x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E30x13)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(28,20), "E30x13");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(32,24), "E30x13");
    check_base_class_offset(lv, (C30*), ABISELECT(16,12), "E30x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E30x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E30x13.fd");
    test_class_info(&lv, &cd_E30x13);
    dp->~E30x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE30x13(Test_E30x13, "E30x13", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E30x13C1Ev();
extern void _ZN6E30x13D1Ev();
Name_Map name_map_E30x13[] = {
  NSPAIR(_ZN6E30x13C1Ev),
  NSPAIR(_ZN6E30x13D1Ev),
  {0,0}
};
extern Class_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_E30x13[] = {
  // 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
    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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6E30x13[];
extern void _ZN6E30x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv)();
extern void ABISELECT(_ZThn16_N6E30x133fooEv,_ZThn12_N6E30x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv)();
extern void ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E30x13[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&_ZN6E30x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv),
};
extern VTBL_ENTRY _ZTV6E30x13[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__6E30x13[] = {
  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__6E30x13[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_E30x13[] = {
  {&(_ZTV6E30x13[5]),  5,16},
  {&(_ZTV6E30x13[11]),  11,16},
  {&(_ZTV6E30x13[15]),  15,16},
  {&(_tg__ZTV3C30__6E30x13[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__6E30x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E30x13[];
extern  VTBL_ENTRY _ZTV6E30x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x13[];
static VTBL_ENTRY alt_thunk_names368[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x133fooEv,_ZThn12_N6E30x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E30x13 = {  "E30x13", // class name
  bases_E30x13, 4,
  &(vtc_E30x13[0]), // expected_vtbl_contents
  &(vtt_E30x13[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E30x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E30x13),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E30x13),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names368,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x13y0  : E30x13 , F1 {
  int ff;
  ~G30x13y0(); // tgen
  G30x13y0(); // tgen
};
//SIG(1 G30x13y0) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G30x13y0 ::~G30x13y0(){ note_dtor("G30x13y0", this);} // tgen
G30x13y0 ::G30x13y0(){ note_ctor("G30x13y0", this);} // tgen

static void Test_G30x13y0()
{
  extern Class_Descriptor cd_G30x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G30x13y0, buf);
    G30x13y0 *dp, &lv = *(dp=new (buf) G30x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G30x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x13y0)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,32), "G30x13y0");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,36), "G30x13y0");
    check_base_class_offset(lv, (C30*)(E30x13*), ABISELECT(32,24), "G30x13y0");
    check_base_class_offset(lv, (D0*)(E30x13*), ABISELECT(8,4), "G30x13y0");
    check_base_class_offset(lv, (E30x13*), 0, "G30x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G30x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G30x13y0.ff");
    test_class_info(&lv, &cd_G30x13y0);
    dp->~G30x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x13y0(Test_G30x13y0, "G30x13y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G30x13y0C1Ev();
extern void _ZN8G30x13y0D1Ev();
Name_Map name_map_G30x13y0[] = {
  NSPAIR(_ZN8G30x13y0C1Ev),
  NSPAIR(_ZN8G30x13y0D1Ev),
  {0,0}
};
extern Class_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_E30x13;
extern VTBL_ENTRY _ZTI6E30x13[];
extern  VTBL_ENTRY _ZTV6E30x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x13y0[] = {
  // 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)
    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
    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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E30x13,    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 _ZTI8G30x13y0[];
extern void _ZN6E30x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv)();
extern void ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv)();
extern void ABISELECT(_ZThn48_N6E30x133fooEv,_ZThn36_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x13y0[0]),
  (VTBL_ENTRY)&_ZN6E30x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G30x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G30x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv),
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G30x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv),
};
extern VTBL_ENTRY _ZTV8G30x13y0[];
extern void _ZN6E30x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x13__8G30x13y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&_ZN6E30x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv)();
extern void ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C30__6E30x13__8G30x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv)();
extern void ABISELECT(_ZThn48_N6E30x133fooEv,_ZThn36_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x13__8G30x13y0[] = {
  ABISELECT(-48,-36),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__8G30x13y0[] = {
  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__8G30x13y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x13y0[] = {
  {&(_ZTV8G30x13y0[5]),  5,19},
  {&(_tg__ZTV6E30x13__8G30x13y0[5]),  5,6},
  {&(_tg__ZTV3C30__6E30x13__8G30x13y0[5]),  5,6},
  {&(_tg__ZTV2B1__6E30x13__8G30x13y0[3]),  3,4},
  {&(_ZTV8G30x13y0[14]),  14,19},
  {&(_ZTV8G30x13y0[18]),  18,19},
  {&(_tg__ZTV3C30__8G30x13y0[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__8G30x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x13y0[];
extern  VTBL_ENTRY _ZTV8G30x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x13y0[];
static VTBL_ENTRY alt_thunk_names369[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E30x133fooEv,_ZThn36_N6E30x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E30x133fooEv,_ZThn36_N6E30x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x13y0 = {  "G30x13y0", // class name
  bases_G30x13y0, 6,
  &(vtc_G30x13y0[0]), // expected_vtbl_contents
  &(vtt_G30x13y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G30x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x13y0),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x13y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names369,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x13y1  : virtual E30x13 , F1 {
  int ff;
  ~G30x13y1(); // tgen
  G30x13y1(); // tgen
};
//SIG(1 G30x13y1) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G30x13y1 ::~G30x13y1(){ note_dtor("G30x13y1", this);} // tgen
G30x13y1 ::G30x13y1(){ note_ctor("G30x13y1", this);} // tgen

static void Test_G30x13y1()
{
  extern Class_Descriptor cd_G30x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G30x13y1, buf);
    G30x13y1 *dp, &lv = *(dp=new (buf) G30x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G30x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x13y1)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,32), "G30x13y1");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,36), "G30x13y1");
    check_base_class_offset(lv, (C30*)(E30x13*), ABISELECT(32,24), "G30x13y1");
    check_base_class_offset(lv, (D0*)(E30x13*), ABISELECT(24,16), "G30x13y1");
    check_base_class_offset(lv, (E30x13*), ABISELECT(16,12), "G30x13y1");
    check_base_class_offset(lv, (F1*), 0, "G30x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x13y1.ff");
    test_class_info(&lv, &cd_G30x13y1);
    dp->~G30x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x13y1(Test_G30x13y1, "G30x13y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G30x13y1C1Ev();
extern void _ZN8G30x13y1D1Ev();
Name_Map name_map_G30x13y1[] = {
  NSPAIR(_ZN8G30x13y1C1Ev),
  NSPAIR(_ZN8G30x13y1D1Ev),
  {0,0}
};
extern Class_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_E30x13;
extern VTBL_ENTRY _ZTI6E30x13[];
extern  VTBL_ENTRY _ZTV6E30x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x13y1[] = {
  // 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
    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,24), //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(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_E30x13,    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_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 _ZTI8G30x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E30x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv)();
extern void ABISELECT(_ZThn16_N6E30x133fooEv,_ZThn12_N6E30x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv)();
extern void ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x13y1[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G30x13y1[0]),
  (VTBL_ENTRY)&_ZN6E30x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G30x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G30x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv),
};
extern VTBL_ENTRY _ZTV8G30x13y1[];
extern void _ZN6E30x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x13__8G30x13y1[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&_ZN6E30x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv)();
extern void ABISELECT(_ZThn16_N6E30x133fooEv,_ZThn12_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C30__6E30x13__8G30x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv)();
extern void ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x13__8G30x13y1[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__8G30x13y1[] = {
  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__8G30x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x13y1[] = {
  {&(_ZTV8G30x13y1[6]),  6,24},
  {&(_ZTV8G30x13y1[13]),  13,24},
  {&(_ZTV8G30x13y1[19]),  19,24},
  {&(_ZTV8G30x13y1[23]),  23,24},
  {&(_tg__ZTV6E30x13__8G30x13y1[5]),  5,6},
  {&(_tg__ZTV3C30__6E30x13__8G30x13y1[5]),  5,6},
  {&(_tg__ZTV2B1__6E30x13__8G30x13y1[3]),  3,4},
  {&(_tg__ZTV3C30__8G30x13y1[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__8G30x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x13y1[];
extern  VTBL_ENTRY _ZTV8G30x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x13y1[];
static VTBL_ENTRY alt_thunk_names370[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x133fooEv,_ZThn12_N6E30x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x133fooEv,_ZThn12_N6E30x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x13y1 = {  "G30x13y1", // class name
  bases_G30x13y1, 6,
  &(vtc_G30x13y1[0]), // expected_vtbl_contents
  &(vtt_G30x13y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G30x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x13y1),24, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x13y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names370,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x13y2  : E30x13 , virtual F1 {
  int ff;
  ~G30x13y2(); // tgen
  G30x13y2(); // tgen
};
//SIG(1 G30x13y2) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G30x13y2 ::~G30x13y2(){ note_dtor("G30x13y2", this);} // tgen
G30x13y2 ::G30x13y2(){ note_ctor("G30x13y2", this);} // tgen

static void Test_G30x13y2()
{
  extern Class_Descriptor cd_G30x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G30x13y2, buf);
    G30x13y2 *dp, &lv = *(dp=new (buf) G30x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G30x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x13y2)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(36,24), "G30x13y2");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(40,28), "G30x13y2");
    check_base_class_offset(lv, (C30*)(E30x13*), ABISELECT(24,16), "G30x13y2");
    check_base_class_offset(lv, (D0*)(E30x13*), ABISELECT(8,4), "G30x13y2");
    check_base_class_offset(lv, (E30x13*), 0, "G30x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G30x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G30x13y2.ff");
    test_class_info(&lv, &cd_G30x13y2);
    dp->~G30x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x13y2(Test_G30x13y2, "G30x13y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G30x13y2C1Ev();
extern void _ZN8G30x13y2D1Ev();
Name_Map name_map_G30x13y2[] = {
  NSPAIR(_ZN8G30x13y2C1Ev),
  NSPAIR(_ZN8G30x13y2D1Ev),
  {0,0}
};
extern Class_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_E30x13;
extern VTBL_ENTRY _ZTI6E30x13[];
extern  VTBL_ENTRY _ZTV6E30x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x13y2[] = {
  // 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
    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(24,16), //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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E30x13,    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
    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 _ZTI8G30x13y2[];
extern void _ZN6E30x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv)();
extern void ABISELECT(_ZThn24_N6E30x133fooEv,_ZThn16_N6E30x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv)();
extern void ABISELECT(_ZThn40_N6E30x133fooEv,_ZThn28_N6E30x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G30x13y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x13y2[0]),
  (VTBL_ENTRY)&_ZN6E30x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G30x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G30x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G30x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G30x13y2[];
extern void _ZN6E30x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x13__8G30x13y2[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&_ZN6E30x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv)();
extern void ABISELECT(_ZThn24_N6E30x133fooEv,_ZThn16_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C30__6E30x13__8G30x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv)();
extern void ABISELECT(_ZThn40_N6E30x133fooEv,_ZThn28_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x13__8G30x13y2[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__8G30x13y2[] = {
  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__8G30x13y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x13y2[] = {
  {&(_ZTV8G30x13y2[6]),  6,21},
  {&(_tg__ZTV6E30x13__8G30x13y2[5]),  5,6},
  {&(_tg__ZTV3C30__6E30x13__8G30x13y2[5]),  5,6},
  {&(_tg__ZTV2B1__6E30x13__8G30x13y2[3]),  3,4},
  {&(_ZTV8G30x13y2[12]),  12,21},
  {&(_ZTV8G30x13y2[16]),  16,21},
  {&(_ZTV8G30x13y2[20]),  20,21},
  {&(_tg__ZTV3C30__8G30x13y2[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__8G30x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x13y2[];
extern  VTBL_ENTRY _ZTV8G30x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x13y2[];
static VTBL_ENTRY alt_thunk_names371[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E30x133fooEv,_ZThn28_N6E30x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E30x133fooEv,_ZThn28_N6E30x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x133fooEv,_ZThn16_N6E30x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x133fooEv,_ZThn16_N6E30x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x13y2 = {  "G30x13y2", // class name
  bases_G30x13y2, 6,
  &(vtc_G30x13y2[0]), // expected_vtbl_contents
  &(vtt_G30x13y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G30x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x13y2),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x13y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names371,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x13y3  : virtual E30x13 , virtual F1 {
  int ff;
  ~G30x13y3(); // tgen
  G30x13y3(); // tgen
};
//SIG(1 G30x13y3) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G30x13y3 ::~G30x13y3(){ note_dtor("G30x13y3", this);} // tgen
G30x13y3 ::G30x13y3(){ note_ctor("G30x13y3", this);} // tgen

static void Test_G30x13y3()
{
  extern Class_Descriptor cd_G30x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G30x13y3, buf);
    G30x13y3 *dp, &lv = *(dp=new (buf) G30x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G30x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x13y3)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,28), "G30x13y3");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,32), "G30x13y3");
    check_base_class_offset(lv, (C30*)(E30x13*), ABISELECT(32,20), "G30x13y3");
    check_base_class_offset(lv, (D0*)(E30x13*), ABISELECT(24,12), "G30x13y3");
    check_base_class_offset(lv, (E30x13*), ABISELECT(16,8), "G30x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G30x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G30x13y3.ff");
    test_class_info(&lv, &cd_G30x13y3);
    dp->~G30x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x13y3(Test_G30x13y3, "G30x13y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G30x13y3C1Ev();
extern void _ZN8G30x13y3D1Ev();
Name_Map name_map_G30x13y3[] = {
  NSPAIR(_ZN8G30x13y3C1Ev),
  NSPAIR(_ZN8G30x13y3D1Ev),
  {0,0}
};
extern Class_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_E30x13;
extern VTBL_ENTRY _ZTI6E30x13[];
extern  VTBL_ENTRY _ZTV6E30x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x13y3[] = {
  // 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
    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_E30x13,    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
    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 _ZTI8G30x13y3[];
extern void _ZN6E30x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv)();
extern void ABISELECT(_ZThn16_N6E30x133fooEv,_ZThn12_N6E30x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv)();
extern void ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G30x13y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x13y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G30x13y3[0]),
  (VTBL_ENTRY)&_ZN6E30x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G30x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G30x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G30x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G30x13y3[];
extern void _ZN6E30x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x13__8G30x13y3[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&_ZN6E30x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv)();
extern void ABISELECT(_ZThn16_N6E30x133fooEv,_ZThn12_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C30__6E30x13__8G30x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv)();
extern void ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x13__8G30x13y3[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__8G30x13y3[] = {
  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__8G30x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x13y3[] = {
  {&(_ZTV8G30x13y3[7]),  7,28},
  {&(_ZTV8G30x13y3[13]),  13,28},
  {&(_ZTV8G30x13y3[19]),  19,28},
  {&(_ZTV8G30x13y3[23]),  23,28},
  {&(_ZTV8G30x13y3[27]),  27,28},
  {&(_tg__ZTV6E30x13__8G30x13y3[5]),  5,6},
  {&(_tg__ZTV3C30__6E30x13__8G30x13y3[5]),  5,6},
  {&(_tg__ZTV2B1__6E30x13__8G30x13y3[3]),  3,4},
  {&(_tg__ZTV3C30__8G30x13y3[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__8G30x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x13y3[];
extern  VTBL_ENTRY _ZTV8G30x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x13y3[];
static VTBL_ENTRY alt_thunk_names372[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x133fooEv,_ZThn12_N6E30x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x133fooEv,_ZThn12_N6E30x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x13y3 = {  "G30x13y3", // class name
  bases_G30x13y3, 6,
  &(vtc_G30x13y3[0]), // expected_vtbl_contents
  &(vtt_G30x13y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G30x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x13y3),28, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x13y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names372,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x13y4  : E30x13 , F0 {
  int ff;
  ~G30x13y4(); // tgen
  G30x13y4(); // tgen
};
//SIG(1 G30x13y4) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G30x13y4 ::~G30x13y4(){ note_dtor("G30x13y4", this);} // tgen
G30x13y4 ::G30x13y4(){ note_ctor("G30x13y4", this);} // tgen

static void Test_G30x13y4()
{
  extern Class_Descriptor cd_G30x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x13y4, buf);
    G30x13y4 *dp, &lv = *(dp=new (buf) G30x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x13y4)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(36,28), "G30x13y4");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(40,32), "G30x13y4");
    check_base_class_offset(lv, (C30*)(E30x13*), ABISELECT(24,20), "G30x13y4");
    check_base_class_offset(lv, (D0*)(E30x13*), ABISELECT(8,4), "G30x13y4");
    check_base_class_offset(lv, (E30x13*), 0, "G30x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G30x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G30x13y4.ff");
    test_class_info(&lv, &cd_G30x13y4);
    dp->~G30x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x13y4(Test_G30x13y4, "G30x13y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G30x13y4C1Ev();
extern void _ZN8G30x13y4D1Ev();
Name_Map name_map_G30x13y4[] = {
  NSPAIR(_ZN8G30x13y4C1Ev),
  NSPAIR(_ZN8G30x13y4D1Ev),
  {0,0}
};
extern Class_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_E30x13;
extern VTBL_ENTRY _ZTI6E30x13[];
extern  VTBL_ENTRY _ZTV6E30x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x13y4[] = {
  // 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)
    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
    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_E30x13,    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 _ZTI8G30x13y4[];
extern void _ZN6E30x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv)();
extern void ABISELECT(_ZThn24_N6E30x133fooEv,_ZThn20_N6E30x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv)();
extern void ABISELECT(_ZThn40_N6E30x133fooEv,_ZThn32_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x13y4[0]),
  (VTBL_ENTRY)&_ZN6E30x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G30x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv),
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G30x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv),
};
extern VTBL_ENTRY _ZTV8G30x13y4[];
extern void _ZN6E30x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x13__8G30x13y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&_ZN6E30x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv)();
extern void ABISELECT(_ZThn24_N6E30x133fooEv,_ZThn20_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C30__6E30x13__8G30x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv)();
extern void ABISELECT(_ZThn40_N6E30x133fooEv,_ZThn32_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x13__8G30x13y4[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__8G30x13y4[] = {
  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__8G30x13y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x13y4[] = {
  {&(_ZTV8G30x13y4[5]),  5,16},
  {&(_tg__ZTV6E30x13__8G30x13y4[5]),  5,6},
  {&(_tg__ZTV3C30__6E30x13__8G30x13y4[5]),  5,6},
  {&(_tg__ZTV2B1__6E30x13__8G30x13y4[3]),  3,4},
  {&(_ZTV8G30x13y4[11]),  11,16},
  {&(_ZTV8G30x13y4[15]),  15,16},
  {&(_tg__ZTV3C30__8G30x13y4[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__8G30x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x13y4[];
extern  VTBL_ENTRY _ZTV8G30x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x13y4[];
static VTBL_ENTRY alt_thunk_names373[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E30x133fooEv,_ZThn32_N6E30x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E30x133fooEv,_ZThn32_N6E30x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x133fooEv,_ZThn20_N6E30x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x133fooEv,_ZThn20_N6E30x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x13y4 = {  "G30x13y4", // class name
  bases_G30x13y4, 6,
  &(vtc_G30x13y4[0]), // expected_vtbl_contents
  &(vtt_G30x13y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G30x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x13y4),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x13y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names373,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x13y5  : virtual E30x13 , F0 {
  int ff;
  ~G30x13y5(); // tgen
  G30x13y5(); // tgen
};
//SIG(1 G30x13y5) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G30x13y5 ::~G30x13y5(){ note_dtor("G30x13y5", this);} // tgen
G30x13y5 ::G30x13y5(){ note_ctor("G30x13y5", this);} // tgen

static void Test_G30x13y5()
{
  extern Class_Descriptor cd_G30x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G30x13y5, buf);
    G30x13y5 *dp, &lv = *(dp=new (buf) G30x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G30x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x13y5)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,32), "G30x13y5");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,36), "G30x13y5");
    check_base_class_offset(lv, (C30*)(E30x13*), ABISELECT(32,24), "G30x13y5");
    check_base_class_offset(lv, (D0*)(E30x13*), ABISELECT(24,16), "G30x13y5");
    check_base_class_offset(lv, (E30x13*), ABISELECT(16,12), "G30x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G30x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x13y5.ff");
    test_class_info(&lv, &cd_G30x13y5);
    dp->~G30x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x13y5(Test_G30x13y5, "G30x13y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G30x13y5C1Ev();
extern void _ZN8G30x13y5D1Ev();
Name_Map name_map_G30x13y5[] = {
  NSPAIR(_ZN8G30x13y5C1Ev),
  NSPAIR(_ZN8G30x13y5D1Ev),
  {0,0}
};
extern Class_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_E30x13;
extern VTBL_ENTRY _ZTI6E30x13[];
extern  VTBL_ENTRY _ZTV6E30x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x13y5[] = {
  // 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
    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,24), //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(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_E30x13,    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
    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 _ZTI8G30x13y5[];
extern void _ZN6E30x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv)();
extern void ABISELECT(_ZThn16_N6E30x133fooEv,_ZThn12_N6E30x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv)();
extern void ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x13y5[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x13y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G30x13y5[0]),
  (VTBL_ENTRY)&_ZN6E30x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G30x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G30x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv),
};
extern VTBL_ENTRY _ZTV8G30x13y5[];
extern void _ZN6E30x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x13__8G30x13y5[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&_ZN6E30x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv)();
extern void ABISELECT(_ZThn16_N6E30x133fooEv,_ZThn12_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C30__6E30x13__8G30x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv)();
extern void ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x13__8G30x13y5[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__8G30x13y5[] = {
  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__8G30x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x13y5[] = {
  {&(_ZTV8G30x13y5[6]),  6,23},
  {&(_ZTV8G30x13y5[12]),  12,23},
  {&(_ZTV8G30x13y5[18]),  18,23},
  {&(_ZTV8G30x13y5[22]),  22,23},
  {&(_tg__ZTV6E30x13__8G30x13y5[5]),  5,6},
  {&(_tg__ZTV3C30__6E30x13__8G30x13y5[5]),  5,6},
  {&(_tg__ZTV2B1__6E30x13__8G30x13y5[3]),  3,4},
  {&(_tg__ZTV3C30__8G30x13y5[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__8G30x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x13y5[];
extern  VTBL_ENTRY _ZTV8G30x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x13y5[];
static VTBL_ENTRY alt_thunk_names374[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x133fooEv,_ZThn12_N6E30x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x133fooEv,_ZThn12_N6E30x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x13y5 = {  "G30x13y5", // class name
  bases_G30x13y5, 6,
  &(vtc_G30x13y5[0]), // expected_vtbl_contents
  &(vtt_G30x13y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G30x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x13y5),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x13y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names374,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x13y6  : E30x13 , virtual F0 {
  int ff;
  ~G30x13y6(); // tgen
  G30x13y6(); // tgen
};
//SIG(1 G30x13y6) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G30x13y6 ::~G30x13y6(){ note_dtor("G30x13y6", this);} // tgen
G30x13y6 ::G30x13y6(){ note_ctor("G30x13y6", this);} // tgen

static void Test_G30x13y6()
{
  extern Class_Descriptor cd_G30x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x13y6, buf);
    G30x13y6 *dp, &lv = *(dp=new (buf) G30x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x13y6)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(36,24), "G30x13y6");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(40,28), "G30x13y6");
    check_base_class_offset(lv, (C30*)(E30x13*), ABISELECT(24,16), "G30x13y6");
    check_base_class_offset(lv, (D0*)(E30x13*), ABISELECT(8,4), "G30x13y6");
    check_base_class_offset(lv, (E30x13*), 0, "G30x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G30x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G30x13y6.ff");
    test_class_info(&lv, &cd_G30x13y6);
    dp->~G30x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x13y6(Test_G30x13y6, "G30x13y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G30x13y6C1Ev();
extern void _ZN8G30x13y6D1Ev();
Name_Map name_map_G30x13y6[] = {
  NSPAIR(_ZN8G30x13y6C1Ev),
  NSPAIR(_ZN8G30x13y6D1Ev),
  {0,0}
};
extern Class_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_E30x13;
extern VTBL_ENTRY _ZTI6E30x13[];
extern  VTBL_ENTRY _ZTV6E30x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x13y6[] = {
  // 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
    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(24,16), //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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E30x13,    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 _ZTI8G30x13y6[];
extern void _ZN6E30x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv)();
extern void ABISELECT(_ZThn24_N6E30x133fooEv,_ZThn16_N6E30x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv)();
extern void ABISELECT(_ZThn40_N6E30x133fooEv,_ZThn28_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x13y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x13y6[0]),
  (VTBL_ENTRY)&_ZN6E30x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G30x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G30x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv),
};
extern VTBL_ENTRY _ZTV8G30x13y6[];
extern void _ZN6E30x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x13__8G30x13y6[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&_ZN6E30x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv)();
extern void ABISELECT(_ZThn24_N6E30x133fooEv,_ZThn16_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C30__6E30x13__8G30x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv)();
extern void ABISELECT(_ZThn40_N6E30x133fooEv,_ZThn28_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x13__8G30x13y6[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__8G30x13y6[] = {
  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__8G30x13y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x13y6[] = {
  {&(_ZTV8G30x13y6[6]),  6,17},
  {&(_tg__ZTV6E30x13__8G30x13y6[5]),  5,6},
  {&(_tg__ZTV3C30__6E30x13__8G30x13y6[5]),  5,6},
  {&(_tg__ZTV2B1__6E30x13__8G30x13y6[3]),  3,4},
  {&(_ZTV8G30x13y6[12]),  12,17},
  {&(_ZTV8G30x13y6[16]),  16,17},
  {&(_tg__ZTV3C30__8G30x13y6[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__8G30x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x13y6[];
extern  VTBL_ENTRY _ZTV8G30x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x13y6[];
static VTBL_ENTRY alt_thunk_names375[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E30x133fooEv,_ZThn28_N6E30x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E30x133fooEv,_ZThn28_N6E30x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x133fooEv,_ZThn16_N6E30x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x133fooEv,_ZThn16_N6E30x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x13y6 = {  "G30x13y6", // class name
  bases_G30x13y6, 6,
  &(vtc_G30x13y6[0]), // expected_vtbl_contents
  &(vtt_G30x13y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G30x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x13y6),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x13y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names375,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x13y7  : virtual E30x13 , virtual F0 {
  int ff;
  ~G30x13y7(); // tgen
  G30x13y7(); // tgen
};
//SIG(1 G30x13y7) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G30x13y7 ::~G30x13y7(){ note_dtor("G30x13y7", this);} // tgen
G30x13y7 ::G30x13y7(){ note_ctor("G30x13y7", this);} // tgen

static void Test_G30x13y7()
{
  extern Class_Descriptor cd_G30x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G30x13y7, buf);
    G30x13y7 *dp, &lv = *(dp=new (buf) G30x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G30x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x13y7)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,28), "G30x13y7");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,32), "G30x13y7");
    check_base_class_offset(lv, (C30*)(E30x13*), ABISELECT(32,20), "G30x13y7");
    check_base_class_offset(lv, (D0*)(E30x13*), ABISELECT(24,12), "G30x13y7");
    check_base_class_offset(lv, (E30x13*), ABISELECT(16,8), "G30x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G30x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G30x13y7.ff");
    test_class_info(&lv, &cd_G30x13y7);
    dp->~G30x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x13y7(Test_G30x13y7, "G30x13y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G30x13y7C1Ev();
extern void _ZN8G30x13y7D1Ev();
Name_Map name_map_G30x13y7[] = {
  NSPAIR(_ZN8G30x13y7C1Ev),
  NSPAIR(_ZN8G30x13y7D1Ev),
  {0,0}
};
extern Class_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_E30x13;
extern VTBL_ENTRY _ZTI6E30x13[];
extern  VTBL_ENTRY _ZTV6E30x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x13y7[] = {
  // 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(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_E30x13,    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_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 _ZTI8G30x13y7[];
extern void _ZN6E30x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv)();
extern void ABISELECT(_ZThn16_N6E30x133fooEv,_ZThn12_N6E30x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv)();
extern void ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x13y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x13y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G30x13y7[0]),
  (VTBL_ENTRY)&_ZN6E30x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G30x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G30x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv),
};
extern VTBL_ENTRY _ZTV8G30x13y7[];
extern void _ZN6E30x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x13__8G30x13y7[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&_ZN6E30x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv)();
extern void ABISELECT(_ZThn16_N6E30x133fooEv,_ZThn12_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C30__6E30x13__8G30x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv)();
extern void ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x13__8G30x13y7[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E30x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__8G30x13y7[] = {
  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__8G30x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x13y7[] = {
  {&(_ZTV8G30x13y7[7]),  7,24},
  {&(_ZTV8G30x13y7[13]),  13,24},
  {&(_ZTV8G30x13y7[19]),  19,24},
  {&(_ZTV8G30x13y7[23]),  23,24},
  {&(_tg__ZTV6E30x13__8G30x13y7[5]),  5,6},
  {&(_tg__ZTV3C30__6E30x13__8G30x13y7[5]),  5,6},
  {&(_tg__ZTV2B1__6E30x13__8G30x13y7[3]),  3,4},
  {&(_tg__ZTV3C30__8G30x13y7[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__8G30x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x13y7[];
extern  VTBL_ENTRY _ZTV8G30x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x13y7[];
static VTBL_ENTRY alt_thunk_names376[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x133fooEv,_ZTv0_n12_N6E30x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x133fooEv,_ZThn24_N6E30x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E30x133fooEv,_ZTv0_n20_N6E30x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x133fooEv,_ZThn12_N6E30x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x133fooEv,_ZThn12_N6E30x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x13y7 = {  "G30x13y7", // class name
  bases_G30x13y7, 6,
  &(vtc_G30x13y7[0]), // expected_vtbl_contents
  &(vtt_G30x13y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G30x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x13y7),24, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x13y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names376,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E31x13  : virtual C31 , D0 {
  int fd;
  virtual void  foo(); // _ZN6E31x133fooEv
  ~E31x13(); // tgen
  E31x13(); // tgen
};
//SIG(-1 E31x13) C1{ VBC2{ VBC3{ v1 Fi} VBC4{ v1 Fi} v1 Fi} BC5{ Fi} v1 Fi}


void  E31x13 ::foo(){vfunc_called(this, "_ZN6E31x133fooEv");}
E31x13 ::~E31x13(){ note_dtor("E31x13", this);} // tgen
E31x13 ::E31x13(){ note_ctor("E31x13", this);} // tgen

static void Test_E31x13()
{
  extern Class_Descriptor cd_E31x13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_E31x13, buf);
    E31x13 *dp, &lv = *(dp=new (buf) E31x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(E31x13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E31x13)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(32,20), "E31x13");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(48,28), "E31x13");
    check_base_class_offset(lv, (C31*), ABISELECT(16,12), "E31x13");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E31x13");
    check_field_offset(lv, fd, ABISELECT(12,8), "E31x13.fd");
    test_class_info(&lv, &cd_E31x13);
    dp->~E31x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE31x13(Test_E31x13, "E31x13", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN6E31x13C1Ev();
extern void _ZN6E31x13D1Ev();
Name_Map name_map_E31x13[] = {
  NSPAIR(_ZN6E31x13C1Ev),
  NSPAIR(_ZN6E31x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x13[] = {
  // 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_C31,    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_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 _ZTI6E31x13[];
extern void _ZN6E31x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv)();
extern void ABISELECT(_ZThn16_N6E31x133fooEv,_ZThn12_N6E31x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn20_N6E31x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn28_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E31x13[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&_ZN6E31x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern VTBL_ENTRY _ZTV6E31x13[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__6E31x13[] = {
  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__6E31x13[] = {
  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__6E31x13[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_E31x13[] = {
  {&(_ZTV6E31x13[5]),  5,20},
  {&(_ZTV6E31x13[11]),  11,20},
  {&(_ZTV6E31x13[15]),  15,20},
  {&(_ZTV6E31x13[19]),  19,20},
  {&(_tg__ZTV3C31__6E31x13[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__6E31x13[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__6E31x13[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E31x13[];
extern  VTBL_ENTRY _ZTV6E31x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x13[];
static VTBL_ENTRY alt_thunk_names377[] = {
  (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,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn28_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn20_N6E31x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x133fooEv,_ZThn12_N6E31x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E31x13 = {  "E31x13", // class name
  bases_E31x13, 4,
  &(vtc_E31x13[0]), // expected_vtbl_contents
  &(vtt_E31x13[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI6E31x13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E31x13),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E31x13),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names377,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x13y0  : E31x13 , F1 {
  int ff;
  ~G31x13y0(); // tgen
  G31x13y0(); // tgen
};
//SIG(1 G31x13y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G31x13y0 ::~G31x13y0(){ note_dtor("G31x13y0", this);} // tgen
G31x13y0 ::G31x13y0(){ note_ctor("G31x13y0", this);} // tgen

static void Test_G31x13y0()
{
  extern Class_Descriptor cd_G31x13y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G31x13y0, buf);
    G31x13y0 *dp, &lv = *(dp=new (buf) G31x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G31x13y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x13y0)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,32), "G31x13y0");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,40), "G31x13y0");
    check_base_class_offset(lv, (C31*)(E31x13*), ABISELECT(32,24), "G31x13y0");
    check_base_class_offset(lv, (D0*)(E31x13*), ABISELECT(8,4), "G31x13y0");
    check_base_class_offset(lv, (E31x13*), 0, "G31x13y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G31x13y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G31x13y0.ff");
    test_class_info(&lv, &cd_G31x13y0);
    dp->~G31x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x13y0(Test_G31x13y0, "G31x13y0", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G31x13y0C1Ev();
extern void _ZN8G31x13y0D1Ev();
Name_Map name_map_G31x13y0[] = {
  NSPAIR(_ZN8G31x13y0C1Ev),
  NSPAIR(_ZN8G31x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x13;
extern VTBL_ENTRY _ZTI6E31x13[];
extern  VTBL_ENTRY _ZTV6E31x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x13y0[] = {
  // 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)
    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
    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,24), //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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E31x13,    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 _ZTI8G31x13y0[];
extern void _ZN6E31x133fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv)();
extern void ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn24_N6E31x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn32_N6E31x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn64_N6E31x133fooEv,_ZThn40_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x13y0[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x13y0[0]),
  (VTBL_ENTRY)&_ZN6E31x133fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G31x13y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G31x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G31x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
  ABISELECT(-64,-40),
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G31x13y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern VTBL_ENTRY _ZTV8G31x13y0[];
extern void _ZN6E31x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x13__8G31x13y0[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&_ZN6E31x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv)();
extern void ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn24_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C31__6E31x13__8G31x13y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn32_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x13__8G31x13y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn64_N6E31x133fooEv,_ZThn40_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x13__8G31x13y0[] = {
  ABISELECT(-64,-40),
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__8G31x13y0[] = {
  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__8G31x13y0[] = {
  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__8G31x13y0[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x13y0[] = {
  {&(_ZTV8G31x13y0[5]),  5,23},
  {&(_tg__ZTV6E31x13__8G31x13y0[5]),  5,6},
  {&(_tg__ZTV3C31__6E31x13__8G31x13y0[5]),  5,6},
  {&(_tg__ZTV2A1__6E31x13__8G31x13y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x13__8G31x13y0[3]),  3,4},
  {&(_ZTV8G31x13y0[14]),  14,23},
  {&(_ZTV8G31x13y0[18]),  18,23},
  {&(_ZTV8G31x13y0[22]),  22,23},
  {&(_tg__ZTV3C31__8G31x13y0[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__8G31x13y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__8G31x13y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x13y0[];
extern  VTBL_ENTRY _ZTV8G31x13y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x13y0[];
static VTBL_ENTRY alt_thunk_names378[] = {
  (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,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn64_N6E31x133fooEv,_ZThn40_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn32_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn64_N6E31x133fooEv,_ZThn40_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn32_N6E31x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn24_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn24_N6E31x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x13y0 = {  "G31x13y0", // class name
  bases_G31x13y0, 6,
  &(vtc_G31x13y0[0]), // expected_vtbl_contents
  &(vtt_G31x13y0[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G31x13y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x13y0),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x13y0),11, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names378,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x13y1  : virtual E31x13 , F1 {
  int ff;
  ~G31x13y1(); // tgen
  G31x13y1(); // tgen
};
//SIG(1 G31x13y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G31x13y1 ::~G31x13y1(){ note_dtor("G31x13y1", this);} // tgen
G31x13y1 ::G31x13y1(){ note_ctor("G31x13y1", this);} // tgen

static void Test_G31x13y1()
{
  extern Class_Descriptor cd_G31x13y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G31x13y1, buf);
    G31x13y1 *dp, &lv = *(dp=new (buf) G31x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G31x13y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x13y1)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,32), "G31x13y1");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,40), "G31x13y1");
    check_base_class_offset(lv, (C31*)(E31x13*), ABISELECT(32,24), "G31x13y1");
    check_base_class_offset(lv, (D0*)(E31x13*), ABISELECT(24,16), "G31x13y1");
    check_base_class_offset(lv, (E31x13*), ABISELECT(16,12), "G31x13y1");
    check_base_class_offset(lv, (F1*), 0, "G31x13y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x13y1.ff");
    test_class_info(&lv, &cd_G31x13y1);
    dp->~G31x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x13y1(Test_G31x13y1, "G31x13y1", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G31x13y1C1Ev();
extern void _ZN8G31x13y1D1Ev();
Name_Map name_map_G31x13y1[] = {
  NSPAIR(_ZN8G31x13y1C1Ev),
  NSPAIR(_ZN8G31x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x13;
extern VTBL_ENTRY _ZTI6E31x13[];
extern  VTBL_ENTRY _ZTV6E31x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x13y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    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_B1,    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
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(32,24), //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(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_E31x13,    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_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 _ZTI8G31x13y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E31x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv)();
extern void ABISELECT(_ZThn16_N6E31x133fooEv,_ZThn12_N6E31x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn20_N6E31x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn28_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x13y1[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x13y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G31x13y1[0]),
  (VTBL_ENTRY)&_ZN6E31x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G31x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G31x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
  ABISELECT(-48,-28),
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G31x13y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern VTBL_ENTRY _ZTV8G31x13y1[];
extern void _ZN6E31x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x13__8G31x13y1[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&_ZN6E31x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv)();
extern void ABISELECT(_ZThn16_N6E31x133fooEv,_ZThn12_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C31__6E31x13__8G31x13y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn20_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x13__8G31x13y1[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn28_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x13__8G31x13y1[] = {
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__8G31x13y1[] = {
  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__8G31x13y1[] = {
  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__8G31x13y1[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x13y1[] = {
  {&(_ZTV8G31x13y1[6]),  6,28},
  {&(_ZTV8G31x13y1[13]),  13,28},
  {&(_ZTV8G31x13y1[19]),  19,28},
  {&(_ZTV8G31x13y1[23]),  23,28},
  {&(_ZTV8G31x13y1[27]),  27,28},
  {&(_tg__ZTV6E31x13__8G31x13y1[5]),  5,6},
  {&(_tg__ZTV3C31__6E31x13__8G31x13y1[5]),  5,6},
  {&(_tg__ZTV2A1__6E31x13__8G31x13y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x13__8G31x13y1[3]),  3,4},
  {&(_tg__ZTV3C31__8G31x13y1[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__8G31x13y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__8G31x13y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x13y1[];
extern  VTBL_ENTRY _ZTV8G31x13y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x13y1[];
static VTBL_ENTRY alt_thunk_names379[] = {
  (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,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn28_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn20_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn28_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn20_N6E31x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x133fooEv,_ZThn12_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x133fooEv,_ZThn12_N6E31x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x13y1 = {  "G31x13y1", // class name
  bases_G31x13y1, 6,
  &(vtc_G31x13y1[0]), // expected_vtbl_contents
  &(vtt_G31x13y1[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G31x13y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x13y1),28, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x13y1),12, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names379,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x13y2  : E31x13 , virtual F1 {
  int ff;
  ~G31x13y2(); // tgen
  G31x13y2(); // tgen
};
//SIG(1 G31x13y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G31x13y2 ::~G31x13y2(){ note_dtor("G31x13y2", this);} // tgen
G31x13y2 ::G31x13y2(){ note_ctor("G31x13y2", this);} // tgen

static void Test_G31x13y2()
{
  extern Class_Descriptor cd_G31x13y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G31x13y2, buf);
    G31x13y2 *dp, &lv = *(dp=new (buf) G31x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G31x13y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x13y2)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(40,24), "G31x13y2");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(56,32), "G31x13y2");
    check_base_class_offset(lv, (C31*)(E31x13*), ABISELECT(24,16), "G31x13y2");
    check_base_class_offset(lv, (D0*)(E31x13*), ABISELECT(8,4), "G31x13y2");
    check_base_class_offset(lv, (E31x13*), 0, "G31x13y2");
    check_base_class_offset(lv, (F1*), ABISELECT(72,40), "G31x13y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G31x13y2.ff");
    test_class_info(&lv, &cd_G31x13y2);
    dp->~G31x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x13y2(Test_G31x13y2, "G31x13y2", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN8G31x13y2C1Ev();
extern void _ZN8G31x13y2D1Ev();
Name_Map name_map_G31x13y2[] = {
  NSPAIR(_ZN8G31x13y2C1Ev),
  NSPAIR(_ZN8G31x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x13;
extern VTBL_ENTRY _ZTI6E31x13[];
extern  VTBL_ENTRY _ZTV6E31x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x13y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //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(56,32), //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(24,16), //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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E31x13,    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
    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 _ZTI8G31x13y2[];
extern void _ZN6E31x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv)();
extern void ABISELECT(_ZThn24_N6E31x133fooEv,_ZThn16_N6E31x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn40_N6E31x133fooEv,_ZThn24_N6E31x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn56_N6E31x133fooEv,_ZThn32_N6E31x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G31x13y2[] = {
  ABISELECT(72,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x13y2[0]),
  (VTBL_ENTRY)&_ZN6E31x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G31x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G31x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
  ABISELECT(-56,-32),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI8G31x13y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
  0,
  ABISELECT(-72,-40),
  (VTBL_ENTRY)&(_ZTI8G31x13y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G31x13y2[];
extern void _ZN6E31x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x13__8G31x13y2[] = {
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&_ZN6E31x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv)();
extern void ABISELECT(_ZThn24_N6E31x133fooEv,_ZThn16_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C31__6E31x13__8G31x13y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn40_N6E31x133fooEv,_ZThn24_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x13__8G31x13y2[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn56_N6E31x133fooEv,_ZThn32_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x13__8G31x13y2[] = {
  ABISELECT(-56,-32),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__8G31x13y2[] = {
  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__8G31x13y2[] = {
  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__8G31x13y2[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x13y2[] = {
  {&(_ZTV8G31x13y2[6]),  6,25},
  {&(_tg__ZTV6E31x13__8G31x13y2[5]),  5,6},
  {&(_tg__ZTV3C31__6E31x13__8G31x13y2[5]),  5,6},
  {&(_tg__ZTV2A1__6E31x13__8G31x13y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x13__8G31x13y2[3]),  3,4},
  {&(_ZTV8G31x13y2[12]),  12,25},
  {&(_ZTV8G31x13y2[16]),  16,25},
  {&(_ZTV8G31x13y2[20]),  20,25},
  {&(_ZTV8G31x13y2[24]),  24,25},
  {&(_tg__ZTV3C31__8G31x13y2[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__8G31x13y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__8G31x13y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x13y2[];
extern  VTBL_ENTRY _ZTV8G31x13y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x13y2[];
static VTBL_ENTRY alt_thunk_names380[] = {
  (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,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E31x133fooEv,_ZThn32_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x133fooEv,_ZThn24_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E31x133fooEv,_ZThn32_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x133fooEv,_ZThn24_N6E31x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x133fooEv,_ZThn16_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x133fooEv,_ZThn16_N6E31x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x13y2 = {  "G31x13y2", // class name
  bases_G31x13y2, 6,
  &(vtc_G31x13y2[0]), // expected_vtbl_contents
  &(vtt_G31x13y2[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI8G31x13y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x13y2),25, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x13y2),12, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names380,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x13y3  : virtual E31x13 , virtual F1 {
  int ff;
  ~G31x13y3(); // tgen
  G31x13y3(); // tgen
};
//SIG(1 G31x13y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G31x13y3 ::~G31x13y3(){ note_dtor("G31x13y3", this);} // tgen
G31x13y3 ::G31x13y3(){ note_ctor("G31x13y3", this);} // tgen

static void Test_G31x13y3()
{
  extern Class_Descriptor cd_G31x13y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(13,14)];
    init_test(&cd_G31x13y3, buf);
    G31x13y3 *dp, &lv = *(dp=new (buf) G31x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(96,52), "sizeof(G31x13y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x13y3)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,28), "G31x13y3");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,36), "G31x13y3");
    check_base_class_offset(lv, (C31*)(E31x13*), ABISELECT(32,20), "G31x13y3");
    check_base_class_offset(lv, (D0*)(E31x13*), ABISELECT(24,12), "G31x13y3");
    check_base_class_offset(lv, (E31x13*), ABISELECT(16,8), "G31x13y3");
    check_base_class_offset(lv, (F1*), ABISELECT(80,44), "G31x13y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G31x13y3.ff");
    test_class_info(&lv, &cd_G31x13y3);
    dp->~G31x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x13y3(Test_G31x13y3, "G31x13y3", ABISELECT(96,52));

#else // __cplusplus

extern void _ZN8G31x13y3C1Ev();
extern void _ZN8G31x13y3D1Ev();
Name_Map name_map_G31x13y3[] = {
  NSPAIR(_ZN8G31x13y3C1Ev),
  NSPAIR(_ZN8G31x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x13;
extern VTBL_ENTRY _ZTI6E31x13[];
extern  VTBL_ENTRY _ZTV6E31x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x13[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x13y3[] = {
  // 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
    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_E31x13,    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
    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 _ZTI8G31x13y3[];
extern void _ZN6E31x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv)();
extern void ABISELECT(_ZThn16_N6E31x133fooEv,_ZThn12_N6E31x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn20_N6E31x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn28_N6E31x133fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G31x13y3[] = {
  ABISELECT(80,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x13y3[0]),
  0,
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G31x13y3[0]),
  (VTBL_ENTRY)&_ZN6E31x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G31x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G31x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
  ABISELECT(-48,-28),
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI8G31x13y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
  0,
  ABISELECT(-80,-44),
  (VTBL_ENTRY)&(_ZTI8G31x13y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G31x13y3[];
extern void _ZN6E31x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x13__8G31x13y3[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&_ZN6E31x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv)();
extern void ABISELECT(_ZThn16_N6E31x133fooEv,_ZThn12_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C31__6E31x13__8G31x13y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn20_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x13__8G31x13y3[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn28_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x13__8G31x13y3[] = {
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__8G31x13y3[] = {
  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__8G31x13y3[] = {
  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__8G31x13y3[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x13y3[] = {
  {&(_ZTV8G31x13y3[7]),  7,32},
  {&(_ZTV8G31x13y3[13]),  13,32},
  {&(_ZTV8G31x13y3[19]),  19,32},
  {&(_ZTV8G31x13y3[23]),  23,32},
  {&(_ZTV8G31x13y3[27]),  27,32},
  {&(_ZTV8G31x13y3[31]),  31,32},
  {&(_tg__ZTV6E31x13__8G31x13y3[5]),  5,6},
  {&(_tg__ZTV3C31__6E31x13__8G31x13y3[5]),  5,6},
  {&(_tg__ZTV2A1__6E31x13__8G31x13y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x13__8G31x13y3[3]),  3,4},
  {&(_tg__ZTV3C31__8G31x13y3[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__8G31x13y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__8G31x13y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x13y3[];
extern  VTBL_ENTRY _ZTV8G31x13y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x13y3[];
static VTBL_ENTRY alt_thunk_names381[] = {
  (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,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn28_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn20_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn28_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn20_N6E31x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x133fooEv,_ZThn12_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x133fooEv,_ZThn12_N6E31x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x13y3 = {  "G31x13y3", // class name
  bases_G31x13y3, 6,
  &(vtc_G31x13y3[0]), // expected_vtbl_contents
  &(vtt_G31x13y3[0]), // expected_vtt_contents
  ABISELECT(96,52), // object size
  NSPAIRA(_ZTI8G31x13y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x13y3),32, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x13y3),13, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names381,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x13y4  : E31x13 , F0 {
  int ff;
  ~G31x13y4(); // tgen
  G31x13y4(); // tgen
};
//SIG(1 G31x13y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G31x13y4 ::~G31x13y4(){ note_dtor("G31x13y4", this);} // tgen
G31x13y4 ::G31x13y4(){ note_ctor("G31x13y4", this);} // tgen

static void Test_G31x13y4()
{
  extern Class_Descriptor cd_G31x13y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x13y4, buf);
    G31x13y4 *dp, &lv = *(dp=new (buf) G31x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x13y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x13y4)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(40,28), "G31x13y4");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(56,36), "G31x13y4");
    check_base_class_offset(lv, (C31*)(E31x13*), ABISELECT(24,20), "G31x13y4");
    check_base_class_offset(lv, (D0*)(E31x13*), ABISELECT(8,4), "G31x13y4");
    check_base_class_offset(lv, (E31x13*), 0, "G31x13y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G31x13y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G31x13y4.ff");
    test_class_info(&lv, &cd_G31x13y4);
    dp->~G31x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x13y4(Test_G31x13y4, "G31x13y4", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G31x13y4C1Ev();
extern void _ZN8G31x13y4D1Ev();
Name_Map name_map_G31x13y4[] = {
  NSPAIR(_ZN8G31x13y4C1Ev),
  NSPAIR(_ZN8G31x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x13;
extern VTBL_ENTRY _ZTI6E31x13[];
extern  VTBL_ENTRY _ZTV6E31x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x13y4[] = {
  // 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)
    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
    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,20), //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_E31x13,    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 _ZTI8G31x13y4[];
extern void _ZN6E31x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv)();
extern void ABISELECT(_ZThn24_N6E31x133fooEv,_ZThn20_N6E31x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn40_N6E31x133fooEv,_ZThn28_N6E31x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn56_N6E31x133fooEv,_ZThn36_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x13y4[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x13y4[0]),
  (VTBL_ENTRY)&_ZN6E31x133fooEv,
  ABISELECT(-24,-20),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G31x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G31x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
  ABISELECT(-56,-36),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G31x13y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern VTBL_ENTRY _ZTV8G31x13y4[];
extern void _ZN6E31x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x13__8G31x13y4[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&_ZN6E31x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv)();
extern void ABISELECT(_ZThn24_N6E31x133fooEv,_ZThn20_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C31__6E31x13__8G31x13y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn40_N6E31x133fooEv,_ZThn28_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x13__8G31x13y4[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn56_N6E31x133fooEv,_ZThn36_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x13__8G31x13y4[] = {
  ABISELECT(-56,-36),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__8G31x13y4[] = {
  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__8G31x13y4[] = {
  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__8G31x13y4[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x13y4[] = {
  {&(_ZTV8G31x13y4[5]),  5,20},
  {&(_tg__ZTV6E31x13__8G31x13y4[5]),  5,6},
  {&(_tg__ZTV3C31__6E31x13__8G31x13y4[5]),  5,6},
  {&(_tg__ZTV2A1__6E31x13__8G31x13y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x13__8G31x13y4[3]),  3,4},
  {&(_ZTV8G31x13y4[11]),  11,20},
  {&(_ZTV8G31x13y4[15]),  15,20},
  {&(_ZTV8G31x13y4[19]),  19,20},
  {&(_tg__ZTV3C31__8G31x13y4[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__8G31x13y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__8G31x13y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x13y4[];
extern  VTBL_ENTRY _ZTV8G31x13y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x13y4[];
static VTBL_ENTRY alt_thunk_names382[] = {
  (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,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E31x133fooEv,_ZThn36_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x133fooEv,_ZThn28_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E31x133fooEv,_ZThn36_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x133fooEv,_ZThn28_N6E31x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x133fooEv,_ZThn20_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x133fooEv,_ZThn20_N6E31x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x13y4 = {  "G31x13y4", // class name
  bases_G31x13y4, 6,
  &(vtc_G31x13y4[0]), // expected_vtbl_contents
  &(vtt_G31x13y4[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G31x13y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x13y4),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x13y4),11, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names382,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x13y5  : virtual E31x13 , F0 {
  int ff;
  ~G31x13y5(); // tgen
  G31x13y5(); // tgen
};
//SIG(1 G31x13y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G31x13y5 ::~G31x13y5(){ note_dtor("G31x13y5", this);} // tgen
G31x13y5 ::G31x13y5(){ note_ctor("G31x13y5", this);} // tgen

static void Test_G31x13y5()
{
  extern Class_Descriptor cd_G31x13y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G31x13y5, buf);
    G31x13y5 *dp, &lv = *(dp=new (buf) G31x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G31x13y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x13y5)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,32), "G31x13y5");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,40), "G31x13y5");
    check_base_class_offset(lv, (C31*)(E31x13*), ABISELECT(32,24), "G31x13y5");
    check_base_class_offset(lv, (D0*)(E31x13*), ABISELECT(24,16), "G31x13y5");
    check_base_class_offset(lv, (E31x13*), ABISELECT(16,12), "G31x13y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G31x13y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x13y5.ff");
    test_class_info(&lv, &cd_G31x13y5);
    dp->~G31x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x13y5(Test_G31x13y5, "G31x13y5", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G31x13y5C1Ev();
extern void _ZN8G31x13y5D1Ev();
Name_Map name_map_G31x13y5[] = {
  NSPAIR(_ZN8G31x13y5C1Ev),
  NSPAIR(_ZN8G31x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x13;
extern VTBL_ENTRY _ZTI6E31x13[];
extern  VTBL_ENTRY _ZTV6E31x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x13y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    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_B1,    ABISELECT(64,40), //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,24), //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(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_E31x13,    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
    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 _ZTI8G31x13y5[];
extern void _ZN6E31x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv)();
extern void ABISELECT(_ZThn16_N6E31x133fooEv,_ZThn12_N6E31x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn20_N6E31x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn28_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x13y5[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x13y5[0]),
  0,
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G31x13y5[0]),
  (VTBL_ENTRY)&_ZN6E31x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G31x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G31x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
  ABISELECT(-48,-28),
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G31x13y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern VTBL_ENTRY _ZTV8G31x13y5[];
extern void _ZN6E31x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x13__8G31x13y5[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&_ZN6E31x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv)();
extern void ABISELECT(_ZThn16_N6E31x133fooEv,_ZThn12_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C31__6E31x13__8G31x13y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn20_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x13__8G31x13y5[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn28_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x13__8G31x13y5[] = {
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__8G31x13y5[] = {
  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__8G31x13y5[] = {
  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__8G31x13y5[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x13y5[] = {
  {&(_ZTV8G31x13y5[6]),  6,27},
  {&(_ZTV8G31x13y5[12]),  12,27},
  {&(_ZTV8G31x13y5[18]),  18,27},
  {&(_ZTV8G31x13y5[22]),  22,27},
  {&(_ZTV8G31x13y5[26]),  26,27},
  {&(_tg__ZTV6E31x13__8G31x13y5[5]),  5,6},
  {&(_tg__ZTV3C31__6E31x13__8G31x13y5[5]),  5,6},
  {&(_tg__ZTV2A1__6E31x13__8G31x13y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x13__8G31x13y5[3]),  3,4},
  {&(_tg__ZTV3C31__8G31x13y5[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__8G31x13y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__8G31x13y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x13y5[];
extern  VTBL_ENTRY _ZTV8G31x13y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x13y5[];
static VTBL_ENTRY alt_thunk_names383[] = {
  (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,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn28_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn20_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn28_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn20_N6E31x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x133fooEv,_ZThn12_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x133fooEv,_ZThn12_N6E31x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x13y5 = {  "G31x13y5", // class name
  bases_G31x13y5, 6,
  &(vtc_G31x13y5[0]), // expected_vtbl_contents
  &(vtt_G31x13y5[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G31x13y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x13y5),27, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x13y5),12, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names383,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x13y6  : E31x13 , virtual F0 {
  int ff;
  ~G31x13y6(); // tgen
  G31x13y6(); // tgen
};
//SIG(1 G31x13y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G31x13y6 ::~G31x13y6(){ note_dtor("G31x13y6", this);} // tgen
G31x13y6 ::G31x13y6(){ note_ctor("G31x13y6", this);} // tgen

static void Test_G31x13y6()
{
  extern Class_Descriptor cd_G31x13y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x13y6, buf);
    G31x13y6 *dp, &lv = *(dp=new (buf) G31x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x13y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x13y6)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(40,24), "G31x13y6");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(56,32), "G31x13y6");
    check_base_class_offset(lv, (C31*)(E31x13*), ABISELECT(24,16), "G31x13y6");
    check_base_class_offset(lv, (D0*)(E31x13*), ABISELECT(8,4), "G31x13y6");
    check_base_class_offset(lv, (E31x13*), 0, "G31x13y6");
    check_base_class_offset(lv, (F0*), ABISELECT(68,40), "G31x13y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G31x13y6.ff");
    test_class_info(&lv, &cd_G31x13y6);
    dp->~G31x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x13y6(Test_G31x13y6, "G31x13y6", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G31x13y6C1Ev();
extern void _ZN8G31x13y6D1Ev();
Name_Map name_map_G31x13y6[] = {
  NSPAIR(_ZN8G31x13y6C1Ev),
  NSPAIR(_ZN8G31x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x13;
extern VTBL_ENTRY _ZTI6E31x13[];
extern  VTBL_ENTRY _ZTV6E31x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x13y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //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(56,32), //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(24,16), //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(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E31x13,    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 _ZTI8G31x13y6[];
extern void _ZN6E31x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv)();
extern void ABISELECT(_ZThn24_N6E31x133fooEv,_ZThn16_N6E31x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn40_N6E31x133fooEv,_ZThn24_N6E31x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn56_N6E31x133fooEv,_ZThn32_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x13y6[] = {
  ABISELECT(68,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x13y6[0]),
  (VTBL_ENTRY)&_ZN6E31x133fooEv,
  ABISELECT(-24,-16),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G31x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G31x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
  ABISELECT(-56,-32),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI8G31x13y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern VTBL_ENTRY _ZTV8G31x13y6[];
extern void _ZN6E31x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x13__8G31x13y6[] = {
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&_ZN6E31x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv)();
extern void ABISELECT(_ZThn24_N6E31x133fooEv,_ZThn16_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C31__6E31x13__8G31x13y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn40_N6E31x133fooEv,_ZThn24_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x13__8G31x13y6[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn56_N6E31x133fooEv,_ZThn32_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x13__8G31x13y6[] = {
  ABISELECT(-56,-32),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__8G31x13y6[] = {
  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__8G31x13y6[] = {
  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__8G31x13y6[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x13y6[] = {
  {&(_ZTV8G31x13y6[6]),  6,21},
  {&(_tg__ZTV6E31x13__8G31x13y6[5]),  5,6},
  {&(_tg__ZTV3C31__6E31x13__8G31x13y6[5]),  5,6},
  {&(_tg__ZTV2A1__6E31x13__8G31x13y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x13__8G31x13y6[3]),  3,4},
  {&(_ZTV8G31x13y6[12]),  12,21},
  {&(_ZTV8G31x13y6[16]),  16,21},
  {&(_ZTV8G31x13y6[20]),  20,21},
  {&(_tg__ZTV3C31__8G31x13y6[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__8G31x13y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__8G31x13y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x13y6[];
extern  VTBL_ENTRY _ZTV8G31x13y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x13y6[];
static VTBL_ENTRY alt_thunk_names384[] = {
  (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,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E31x133fooEv,_ZThn32_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x133fooEv,_ZThn24_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E31x133fooEv,_ZThn32_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x133fooEv,_ZThn24_N6E31x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x133fooEv,_ZThn16_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x133fooEv,_ZThn16_N6E31x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x13y6 = {  "G31x13y6", // class name
  bases_G31x13y6, 6,
  &(vtc_G31x13y6[0]), // expected_vtbl_contents
  &(vtt_G31x13y6[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G31x13y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x13y6),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x13y6),11, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names384,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x13y7  : virtual E31x13 , virtual F0 {
  int ff;
  ~G31x13y7(); // tgen
  G31x13y7(); // tgen
};
//SIG(1 G31x13y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G31x13y7 ::~G31x13y7(){ note_dtor("G31x13y7", this);} // tgen
G31x13y7 ::G31x13y7(){ note_ctor("G31x13y7", this);} // tgen

static void Test_G31x13y7()
{
  extern Class_Descriptor cd_G31x13y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G31x13y7, buf);
    G31x13y7 *dp, &lv = *(dp=new (buf) G31x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G31x13y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x13y7)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,28), "G31x13y7");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,36), "G31x13y7");
    check_base_class_offset(lv, (C31*)(E31x13*), ABISELECT(32,20), "G31x13y7");
    check_base_class_offset(lv, (D0*)(E31x13*), ABISELECT(24,12), "G31x13y7");
    check_base_class_offset(lv, (E31x13*), ABISELECT(16,8), "G31x13y7");
    check_base_class_offset(lv, (F0*), ABISELECT(76,44), "G31x13y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G31x13y7.ff");
    test_class_info(&lv, &cd_G31x13y7);
    dp->~G31x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x13y7(Test_G31x13y7, "G31x13y7", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G31x13y7C1Ev();
extern void _ZN8G31x13y7D1Ev();
Name_Map name_map_G31x13y7[] = {
  NSPAIR(_ZN8G31x13y7C1Ev),
  NSPAIR(_ZN8G31x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x13;
extern VTBL_ENTRY _ZTI6E31x13[];
extern  VTBL_ENTRY _ZTV6E31x13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x13[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x13y7[] = {
  // 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(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_E31x13,    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_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 _ZTI8G31x13y7[];
extern void _ZN6E31x133fooEv();
extern void ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv)();
extern void ABISELECT(_ZThn16_N6E31x133fooEv,_ZThn12_N6E31x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn20_N6E31x133fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn28_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x13y7[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x13y7[0]),
  0,
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G31x13y7[0]),
  (VTBL_ENTRY)&_ZN6E31x133fooEv,
  ABISELECT(-16,-12),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G31x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G31x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
  ABISELECT(-48,-28),
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI8G31x13y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern VTBL_ENTRY _ZTV8G31x13y7[];
extern void _ZN6E31x133fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x13__8G31x13y7[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&_ZN6E31x133fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv)();
extern void ABISELECT(_ZThn16_N6E31x133fooEv,_ZThn12_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C31__6E31x13__8G31x13y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn20_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x13__8G31x13y7[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv)();
extern void ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn28_N6E31x133fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x13__8G31x13y7[] = {
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6E31x13[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__8G31x13y7[] = {
  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__8G31x13y7[] = {
  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__8G31x13y7[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x13y7[] = {
  {&(_ZTV8G31x13y7[7]),  7,28},
  {&(_ZTV8G31x13y7[13]),  13,28},
  {&(_ZTV8G31x13y7[19]),  19,28},
  {&(_ZTV8G31x13y7[23]),  23,28},
  {&(_ZTV8G31x13y7[27]),  27,28},
  {&(_tg__ZTV6E31x13__8G31x13y7[5]),  5,6},
  {&(_tg__ZTV3C31__6E31x13__8G31x13y7[5]),  5,6},
  {&(_tg__ZTV2A1__6E31x13__8G31x13y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x13__8G31x13y7[3]),  3,4},
  {&(_tg__ZTV3C31__8G31x13y7[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__8G31x13y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__8G31x13y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x13y7[];
extern  VTBL_ENTRY _ZTV8G31x13y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x13y7[];
static VTBL_ENTRY alt_thunk_names385[] = {
  (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,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x133fooEv,_ZTv0_n12_N6E31x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn28_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn20_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x133fooEv,_ZThn28_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x133fooEv,_ZThn20_N6E31x133fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E31x133fooEv,_ZTv0_n20_N6E31x133fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x133fooEv,_ZThn12_N6E31x133fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x133fooEv,_ZThn12_N6E31x133fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x13y7 = {  "G31x13y7", // class name
  bases_G31x13y7, 6,
  &(vtc_G31x13y7[0]), // expected_vtbl_contents
  &(vtt_G31x13y7[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G31x13y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x13y7),28, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x13y7),12, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names385,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E0x14  : C0 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E0x143fooEv
  ~E0x14(); // tgen
  E0x14(); // tgen
};
//SIG(-1 E0x14) C1{ BC2{ BC3{ Fi} BC4{ Fi} Fi} VBC5{ Fi} v1 Fi}


void  E0x14 ::foo(){vfunc_called(this, "_ZN5E0x143fooEv");}
E0x14 ::~E0x14(){ note_dtor("E0x14", this);} // tgen
E0x14 ::E0x14(){ note_ctor("E0x14", this);} // tgen

static void Test_E0x14()
{
  extern Class_Descriptor cd_E0x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E0x14, buf);
    E0x14 *dp, &lv = *(dp=new (buf) E0x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E0x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E0x14)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(8,4), "E0x14");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(12,8), "E0x14");
    check_base_class_offset(lv, (C0*), ABISELECT(8,4), "E0x14");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E0x14");
    check_field_offset(lv, fd, ABISELECT(20,16), "E0x14.fd");
    test_class_info(&lv, &cd_E0x14);
    dp->~E0x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE0x14(Test_E0x14, "E0x14", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E0x14C1Ev();
extern void _ZN5E0x14D1Ev();
Name_Map name_map_E0x14[] = {
  NSPAIR(_ZN5E0x14C1Ev),
  NSPAIR(_ZN5E0x14D1Ev),
  {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_E0x14[] = {
  // 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 _ZTI5E0x14[];
extern void _ZN5E0x143fooEv();
static  VTBL_ENTRY vtc_E0x14[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x14[0]),
  (VTBL_ENTRY)&_ZN5E0x143fooEv,
};
extern VTBL_ENTRY _ZTV5E0x14[];
static  VTT_ENTRY vtt_E0x14[] = {
  {&(_ZTV5E0x14[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E0x14[];
extern  VTBL_ENTRY _ZTV5E0x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x14[];
Class_Descriptor cd_E0x14 = {  "E0x14", // class name
  bases_E0x14, 4,
  &(vtc_E0x14[0]), // expected_vtbl_contents
  &(vtt_E0x14[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E0x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E0x14),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E0x14),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  G0x14y0  : E0x14 , F1 {
  int ff;
  ~G0x14y0(); // tgen
  G0x14y0(); // tgen
};
//SIG(1 G0x14y0) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G0x14y0 ::~G0x14y0(){ note_dtor("G0x14y0", this);} // tgen
G0x14y0 ::G0x14y0(){ note_ctor("G0x14y0", this);} // tgen

static void Test_G0x14y0()
{
  extern Class_Descriptor cd_G0x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x14y0, buf);
    G0x14y0 *dp, &lv = *(dp=new (buf) G0x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x14y0)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x14*), ABISELECT(8,4), "G0x14y0");
    check_base_class_offset(lv, (B0*)(C0*)(E0x14*), ABISELECT(12,8), "G0x14y0");
    check_base_class_offset(lv, (C0*)(E0x14*), ABISELECT(8,4), "G0x14y0");
    check_base_class_offset(lv, (D0*)(E0x14*), ABISELECT(40,32), "G0x14y0");
    check_base_class_offset(lv, (E0x14*), 0, "G0x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G0x14y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G0x14y0.ff");
    test_class_info(&lv, &cd_G0x14y0);
    dp->~G0x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x14y0(Test_G0x14y0, "G0x14y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x14y0C1Ev();
extern void _ZN7G0x14y0D1Ev();
Name_Map name_map_G0x14y0[] = {
  NSPAIR(_ZN7G0x14y0C1Ev),
  NSPAIR(_ZN7G0x14y0D1Ev),
  {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_E0x14;
extern VTBL_ENTRY _ZTI5E0x14[];
extern  VTBL_ENTRY _ZTV5E0x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x14y0[] = {
  // 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_E0x14,    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
    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 _ZTI7G0x14y0[];
extern void _ZN5E0x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x14y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x14y0[0]),
  (VTBL_ENTRY)&_ZN5E0x143fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G0x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G0x14y0[];
extern void _ZN5E0x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x14__7G0x14y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x14[0]),
  (VTBL_ENTRY)&_ZN5E0x143fooEv,
};
static  VTT_ENTRY vtt_G0x14y0[] = {
  {&(_ZTV7G0x14y0[3]),  3,7},
  {&(_tg__ZTV5E0x14__7G0x14y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G0x14y0[];
extern  VTBL_ENTRY _ZTV7G0x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x14y0[];
Class_Descriptor cd_G0x14y0 = {  "G0x14y0", // class name
  bases_G0x14y0, 6,
  &(vtc_G0x14y0[0]), // expected_vtbl_contents
  &(vtt_G0x14y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x14y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x14y0),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  G0x14y1  : virtual E0x14 , F1 {
  int ff;
  ~G0x14y1(); // tgen
  G0x14y1(); // tgen
};
//SIG(1 G0x14y1) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G0x14y1 ::~G0x14y1(){ note_dtor("G0x14y1", this);} // tgen
G0x14y1 ::G0x14y1(){ note_ctor("G0x14y1", this);} // tgen

static void Test_G0x14y1()
{
  extern Class_Descriptor cd_G0x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x14y1, buf);
    G0x14y1 *dp, &lv = *(dp=new (buf) G0x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x14y1)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x14*), ABISELECT(24,16), "G0x14y1");
    check_base_class_offset(lv, (B0*)(C0*)(E0x14*), ABISELECT(28,20), "G0x14y1");
    check_base_class_offset(lv, (C0*)(E0x14*), ABISELECT(24,16), "G0x14y1");
    check_base_class_offset(lv, (D0*)(E0x14*), ABISELECT(40,32), "G0x14y1");
    check_base_class_offset(lv, (E0x14*), ABISELECT(16,12), "G0x14y1");
    check_base_class_offset(lv, (F1*), 0, "G0x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x14y1.ff");
    test_class_info(&lv, &cd_G0x14y1);
    dp->~G0x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x14y1(Test_G0x14y1, "G0x14y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x14y1C1Ev();
extern void _ZN7G0x14y1D1Ev();
Name_Map name_map_G0x14y1[] = {
  NSPAIR(_ZN7G0x14y1C1Ev),
  NSPAIR(_ZN7G0x14y1D1Ev),
  {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_E0x14;
extern VTBL_ENTRY _ZTI5E0x14[];
extern  VTBL_ENTRY _ZTV5E0x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x14y1[] = {
  // 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_E0x14,    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_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 _ZTI7G0x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E0x143fooEv();
static  VTBL_ENTRY vtc_G0x14y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G0x14y1[0]),
  (VTBL_ENTRY)&_ZN5E0x143fooEv,
};
extern VTBL_ENTRY _ZTV7G0x14y1[];
extern void _ZN5E0x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x14__7G0x14y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x14[0]),
  (VTBL_ENTRY)&_ZN5E0x143fooEv,
};
static  VTT_ENTRY vtt_G0x14y1[] = {
  {&(_ZTV7G0x14y1[4]),  4,10},
  {&(_ZTV7G0x14y1[9]),  9,10},
  {&(_tg__ZTV5E0x14__7G0x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G0x14y1[];
extern  VTBL_ENTRY _ZTV7G0x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x14y1[];
Class_Descriptor cd_G0x14y1 = {  "G0x14y1", // class name
  bases_G0x14y1, 6,
  &(vtc_G0x14y1[0]), // expected_vtbl_contents
  &(vtt_G0x14y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x14y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x14y1),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  G0x14y2  : E0x14 , virtual F1 {
  int ff;
  ~G0x14y2(); // tgen
  G0x14y2(); // tgen
};
//SIG(1 G0x14y2) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G0x14y2 ::~G0x14y2(){ note_dtor("G0x14y2", this);} // tgen
G0x14y2 ::G0x14y2(){ note_ctor("G0x14y2", this);} // tgen

static void Test_G0x14y2()
{
  extern Class_Descriptor cd_G0x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x14y2, buf);
    G0x14y2 *dp, &lv = *(dp=new (buf) G0x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x14y2)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x14*), ABISELECT(8,4), "G0x14y2");
    check_base_class_offset(lv, (B0*)(C0*)(E0x14*), ABISELECT(12,8), "G0x14y2");
    check_base_class_offset(lv, (C0*)(E0x14*), ABISELECT(8,4), "G0x14y2");
    check_base_class_offset(lv, (D0*)(E0x14*), ABISELECT(28,24), "G0x14y2");
    check_base_class_offset(lv, (E0x14*), 0, "G0x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G0x14y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G0x14y2.ff");
    test_class_info(&lv, &cd_G0x14y2);
    dp->~G0x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x14y2(Test_G0x14y2, "G0x14y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x14y2C1Ev();
extern void _ZN7G0x14y2D1Ev();
Name_Map name_map_G0x14y2[] = {
  NSPAIR(_ZN7G0x14y2C1Ev),
  NSPAIR(_ZN7G0x14y2D1Ev),
  {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_E0x14;
extern VTBL_ENTRY _ZTI5E0x14[];
extern  VTBL_ENTRY _ZTV5E0x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x14y2[] = {
  // 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_E0x14,    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
    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 _ZTI7G0x14y2[];
extern void _ZN5E0x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x14y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x14y2[0]),
  (VTBL_ENTRY)&_ZN5E0x143fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G0x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G0x14y2[];
extern void _ZN5E0x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x14__7G0x14y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x14[0]),
  (VTBL_ENTRY)&_ZN5E0x143fooEv,
};
static  VTT_ENTRY vtt_G0x14y2[] = {
  {&(_ZTV7G0x14y2[4]),  4,9},
  {&(_tg__ZTV5E0x14__7G0x14y2[3]),  3,4},
  {&(_ZTV7G0x14y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G0x14y2[];
extern  VTBL_ENTRY _ZTV7G0x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x14y2[];
Class_Descriptor cd_G0x14y2 = {  "G0x14y2", // class name
  bases_G0x14y2, 6,
  &(vtc_G0x14y2[0]), // expected_vtbl_contents
  &(vtt_G0x14y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x14y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x14y2),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  G0x14y3  : virtual E0x14 , virtual F1 {
  int ff;
  ~G0x14y3(); // tgen
  G0x14y3(); // tgen
};
//SIG(1 G0x14y3) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G0x14y3 ::~G0x14y3(){ note_dtor("G0x14y3", this);} // tgen
G0x14y3 ::G0x14y3(){ note_ctor("G0x14y3", this);} // tgen

static void Test_G0x14y3()
{
  extern Class_Descriptor cd_G0x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G0x14y3, buf);
    G0x14y3 *dp, &lv = *(dp=new (buf) G0x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G0x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x14y3)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x14*), ABISELECT(24,12), "G0x14y3");
    check_base_class_offset(lv, (B0*)(C0*)(E0x14*), ABISELECT(28,16), "G0x14y3");
    check_base_class_offset(lv, (C0*)(E0x14*), ABISELECT(24,12), "G0x14y3");
    check_base_class_offset(lv, (D0*)(E0x14*), ABISELECT(40,28), "G0x14y3");
    check_base_class_offset(lv, (E0x14*), ABISELECT(16,8), "G0x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G0x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G0x14y3.ff");
    test_class_info(&lv, &cd_G0x14y3);
    dp->~G0x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x14y3(Test_G0x14y3, "G0x14y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G0x14y3C1Ev();
extern void _ZN7G0x14y3D1Ev();
Name_Map name_map_G0x14y3[] = {
  NSPAIR(_ZN7G0x14y3C1Ev),
  NSPAIR(_ZN7G0x14y3D1Ev),
  {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_E0x14;
extern VTBL_ENTRY _ZTI5E0x14[];
extern  VTBL_ENTRY _ZTV5E0x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x14y3[] = {
  // 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_E0x14,    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
    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 _ZTI7G0x14y3[];
extern void _ZN5E0x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x14y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x14y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G0x14y3[0]),
  (VTBL_ENTRY)&_ZN5E0x143fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G0x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G0x14y3[];
extern void _ZN5E0x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x14__7G0x14y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x14[0]),
  (VTBL_ENTRY)&_ZN5E0x143fooEv,
};
static  VTT_ENTRY vtt_G0x14y3[] = {
  {&(_ZTV7G0x14y3[5]),  5,14},
  {&(_ZTV7G0x14y3[9]),  9,14},
  {&(_ZTV7G0x14y3[13]),  13,14},
  {&(_tg__ZTV5E0x14__7G0x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G0x14y3[];
extern  VTBL_ENTRY _ZTV7G0x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x14y3[];
Class_Descriptor cd_G0x14y3 = {  "G0x14y3", // class name
  bases_G0x14y3, 6,
  &(vtc_G0x14y3[0]), // expected_vtbl_contents
  &(vtt_G0x14y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G0x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x14y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x14y3),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  G0x14y4  : E0x14 , F0 {
  int ff;
  ~G0x14y4(); // tgen
  G0x14y4(); // tgen
};
//SIG(1 G0x14y4) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G0x14y4 ::~G0x14y4(){ note_dtor("G0x14y4", this);} // tgen
G0x14y4 ::G0x14y4(){ note_ctor("G0x14y4", this);} // tgen

static void Test_G0x14y4()
{
  extern Class_Descriptor cd_G0x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G0x14y4, buf);
    G0x14y4 *dp, &lv = *(dp=new (buf) G0x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G0x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x14y4)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x14*), ABISELECT(8,4), "G0x14y4");
    check_base_class_offset(lv, (B0*)(C0*)(E0x14*), ABISELECT(12,8), "G0x14y4");
    check_base_class_offset(lv, (C0*)(E0x14*), ABISELECT(8,4), "G0x14y4");
    check_base_class_offset(lv, (D0*)(E0x14*), ABISELECT(32,28), "G0x14y4");
    check_base_class_offset(lv, (E0x14*), 0, "G0x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G0x14y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G0x14y4.ff");
    test_class_info(&lv, &cd_G0x14y4);
    dp->~G0x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x14y4(Test_G0x14y4, "G0x14y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G0x14y4C1Ev();
extern void _ZN7G0x14y4D1Ev();
Name_Map name_map_G0x14y4[] = {
  NSPAIR(_ZN7G0x14y4C1Ev),
  NSPAIR(_ZN7G0x14y4D1Ev),
  {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_E0x14;
extern VTBL_ENTRY _ZTI5E0x14[];
extern  VTBL_ENTRY _ZTV5E0x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x14y4[] = {
  // 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_E0x14,    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 _ZTI7G0x14y4[];
extern void _ZN5E0x143fooEv();
static  VTBL_ENTRY vtc_G0x14y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x14y4[0]),
  (VTBL_ENTRY)&_ZN5E0x143fooEv,
};
extern VTBL_ENTRY _ZTV7G0x14y4[];
extern void _ZN5E0x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x14__7G0x14y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x14[0]),
  (VTBL_ENTRY)&_ZN5E0x143fooEv,
};
static  VTT_ENTRY vtt_G0x14y4[] = {
  {&(_ZTV7G0x14y4[3]),  3,4},
  {&(_tg__ZTV5E0x14__7G0x14y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G0x14y4[];
extern  VTBL_ENTRY _ZTV7G0x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x14y4[];
Class_Descriptor cd_G0x14y4 = {  "G0x14y4", // class name
  bases_G0x14y4, 6,
  &(vtc_G0x14y4[0]), // expected_vtbl_contents
  &(vtt_G0x14y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G0x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x14y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x14y4),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  G0x14y5  : virtual E0x14 , F0 {
  int ff;
  ~G0x14y5(); // tgen
  G0x14y5(); // tgen
};
//SIG(1 G0x14y5) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G0x14y5 ::~G0x14y5(){ note_dtor("G0x14y5", this);} // tgen
G0x14y5 ::G0x14y5(){ note_ctor("G0x14y5", this);} // tgen

static void Test_G0x14y5()
{
  extern Class_Descriptor cd_G0x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x14y5, buf);
    G0x14y5 *dp, &lv = *(dp=new (buf) G0x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x14y5)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x14*), ABISELECT(24,16), "G0x14y5");
    check_base_class_offset(lv, (B0*)(C0*)(E0x14*), ABISELECT(28,20), "G0x14y5");
    check_base_class_offset(lv, (C0*)(E0x14*), ABISELECT(24,16), "G0x14y5");
    check_base_class_offset(lv, (D0*)(E0x14*), ABISELECT(40,32), "G0x14y5");
    check_base_class_offset(lv, (E0x14*), ABISELECT(16,12), "G0x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G0x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x14y5.ff");
    test_class_info(&lv, &cd_G0x14y5);
    dp->~G0x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x14y5(Test_G0x14y5, "G0x14y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x14y5C1Ev();
extern void _ZN7G0x14y5D1Ev();
Name_Map name_map_G0x14y5[] = {
  NSPAIR(_ZN7G0x14y5C1Ev),
  NSPAIR(_ZN7G0x14y5D1Ev),
  {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_E0x14;
extern VTBL_ENTRY _ZTI5E0x14[];
extern  VTBL_ENTRY _ZTV5E0x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x14y5[] = {
  // 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_E0x14,    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_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 _ZTI7G0x14y5[];
extern void _ZN5E0x143fooEv();
static  VTBL_ENTRY vtc_G0x14y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x14y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G0x14y5[0]),
  (VTBL_ENTRY)&_ZN5E0x143fooEv,
};
extern VTBL_ENTRY _ZTV7G0x14y5[];
extern void _ZN5E0x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x14__7G0x14y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x14[0]),
  (VTBL_ENTRY)&_ZN5E0x143fooEv,
};
static  VTT_ENTRY vtt_G0x14y5[] = {
  {&(_ZTV7G0x14y5[4]),  4,9},
  {&(_ZTV7G0x14y5[8]),  8,9},
  {&(_tg__ZTV5E0x14__7G0x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G0x14y5[];
extern  VTBL_ENTRY _ZTV7G0x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x14y5[];
Class_Descriptor cd_G0x14y5 = {  "G0x14y5", // class name
  bases_G0x14y5, 6,
  &(vtc_G0x14y5[0]), // expected_vtbl_contents
  &(vtt_G0x14y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x14y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x14y5),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  G0x14y6  : E0x14 , virtual F0 {
  int ff;
  ~G0x14y6(); // tgen
  G0x14y6(); // tgen
};
//SIG(1 G0x14y6) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G0x14y6 ::~G0x14y6(){ note_dtor("G0x14y6", this);} // tgen
G0x14y6 ::G0x14y6(){ note_ctor("G0x14y6", this);} // tgen

static void Test_G0x14y6()
{
  extern Class_Descriptor cd_G0x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G0x14y6, buf);
    G0x14y6 *dp, &lv = *(dp=new (buf) G0x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G0x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x14y6)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x14*), ABISELECT(8,4), "G0x14y6");
    check_base_class_offset(lv, (B0*)(C0*)(E0x14*), ABISELECT(12,8), "G0x14y6");
    check_base_class_offset(lv, (C0*)(E0x14*), ABISELECT(8,4), "G0x14y6");
    check_base_class_offset(lv, (D0*)(E0x14*), ABISELECT(28,24), "G0x14y6");
    check_base_class_offset(lv, (E0x14*), 0, "G0x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G0x14y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G0x14y6.ff");
    test_class_info(&lv, &cd_G0x14y6);
    dp->~G0x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x14y6(Test_G0x14y6, "G0x14y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G0x14y6C1Ev();
extern void _ZN7G0x14y6D1Ev();
Name_Map name_map_G0x14y6[] = {
  NSPAIR(_ZN7G0x14y6C1Ev),
  NSPAIR(_ZN7G0x14y6D1Ev),
  {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_E0x14;
extern VTBL_ENTRY _ZTI5E0x14[];
extern  VTBL_ENTRY _ZTV5E0x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x14y6[] = {
  // 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_E0x14,    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 _ZTI7G0x14y6[];
extern void _ZN5E0x143fooEv();
static  VTBL_ENTRY vtc_G0x14y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x14y6[0]),
  (VTBL_ENTRY)&_ZN5E0x143fooEv,
};
extern VTBL_ENTRY _ZTV7G0x14y6[];
extern void _ZN5E0x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x14__7G0x14y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x14[0]),
  (VTBL_ENTRY)&_ZN5E0x143fooEv,
};
static  VTT_ENTRY vtt_G0x14y6[] = {
  {&(_ZTV7G0x14y6[4]),  4,5},
  {&(_tg__ZTV5E0x14__7G0x14y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G0x14y6[];
extern  VTBL_ENTRY _ZTV7G0x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x14y6[];
Class_Descriptor cd_G0x14y6 = {  "G0x14y6", // class name
  bases_G0x14y6, 6,
  &(vtc_G0x14y6[0]), // expected_vtbl_contents
  &(vtt_G0x14y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G0x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x14y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x14y6),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  G0x14y7  : virtual E0x14 , virtual F0 {
  int ff;
  ~G0x14y7(); // tgen
  G0x14y7(); // tgen
};
//SIG(1 G0x14y7) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G0x14y7 ::~G0x14y7(){ note_dtor("G0x14y7", this);} // tgen
G0x14y7 ::G0x14y7(){ note_ctor("G0x14y7", this);} // tgen

static void Test_G0x14y7()
{
  extern Class_Descriptor cd_G0x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x14y7, buf);
    G0x14y7 *dp, &lv = *(dp=new (buf) G0x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x14y7)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x14*), ABISELECT(24,12), "G0x14y7");
    check_base_class_offset(lv, (B0*)(C0*)(E0x14*), ABISELECT(28,16), "G0x14y7");
    check_base_class_offset(lv, (C0*)(E0x14*), ABISELECT(24,12), "G0x14y7");
    check_base_class_offset(lv, (D0*)(E0x14*), ABISELECT(40,28), "G0x14y7");
    check_base_class_offset(lv, (E0x14*), ABISELECT(16,8), "G0x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G0x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G0x14y7.ff");
    test_class_info(&lv, &cd_G0x14y7);
    dp->~G0x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x14y7(Test_G0x14y7, "G0x14y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x14y7C1Ev();
extern void _ZN7G0x14y7D1Ev();
Name_Map name_map_G0x14y7[] = {
  NSPAIR(_ZN7G0x14y7C1Ev),
  NSPAIR(_ZN7G0x14y7D1Ev),
  {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_E0x14;
extern VTBL_ENTRY _ZTI5E0x14[];
extern  VTBL_ENTRY _ZTV5E0x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x14y7[] = {
  // 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_E0x14,    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_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 _ZTI7G0x14y7[];
extern void _ZN5E0x143fooEv();
static  VTBL_ENTRY vtc_G0x14y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x14y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G0x14y7[0]),
  (VTBL_ENTRY)&_ZN5E0x143fooEv,
};
extern VTBL_ENTRY _ZTV7G0x14y7[];
extern void _ZN5E0x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x14__7G0x14y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x14[0]),
  (VTBL_ENTRY)&_ZN5E0x143fooEv,
};
static  VTT_ENTRY vtt_G0x14y7[] = {
  {&(_ZTV7G0x14y7[5]),  5,10},
  {&(_ZTV7G0x14y7[9]),  9,10},
  {&(_tg__ZTV5E0x14__7G0x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G0x14y7[];
extern  VTBL_ENTRY _ZTV7G0x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x14y7[];
Class_Descriptor cd_G0x14y7 = {  "G0x14y7", // class name
  bases_G0x14y7, 6,
  &(vtc_G0x14y7[0]), // expected_vtbl_contents
  &(vtt_G0x14y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x14y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x14y7),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  E1x14  : C1 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E1x143fooEv
  ~E1x14(); // tgen
  E1x14(); // tgen
};
//SIG(-1 E1x14) C1{ BC2{ BC3{ v1 Fi} BC4{ Fi} Fi} VBC5{ Fi} v1 Fi}


void  E1x14 ::foo(){vfunc_called(this, "_ZN5E1x143fooEv");}
E1x14 ::~E1x14(){ note_dtor("E1x14", this);} // tgen
E1x14 ::E1x14(){ note_ctor("E1x14", this);} // tgen

static void Test_E1x14()
{
  extern Class_Descriptor cd_E1x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E1x14, buf);
    E1x14 *dp, &lv = *(dp=new (buf) E1x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E1x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E1x14)");
    check_base_class_offset(lv, (A1*)(C1*), 0, "E1x14");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(12,8), "E1x14");
    check_base_class_offset(lv, (C1*), 0, "E1x14");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E1x14");
    check_field_offset(lv, fd, ABISELECT(20,16), "E1x14.fd");
    test_class_info(&lv, &cd_E1x14);
    dp->~E1x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE1x14(Test_E1x14, "E1x14", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E1x14C1Ev();
extern void _ZN5E1x14D1Ev();
Name_Map name_map_E1x14[] = {
  NSPAIR(_ZN5E1x14C1Ev),
  NSPAIR(_ZN5E1x14D1Ev),
  {0,0}
};
extern Class_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_E1x14[] = {
  // 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 _ZTI5E1x14[];
extern void _ZN5E1x143fooEv();
static  VTBL_ENTRY vtc_E1x14[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x14[0]),
  (VTBL_ENTRY)&_ZN5E1x143fooEv,
};
extern VTBL_ENTRY _ZTV5E1x14[];
static  VTT_ENTRY vtt_E1x14[] = {
  {&(_ZTV5E1x14[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E1x14[];
extern  VTBL_ENTRY _ZTV5E1x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x14[];
Class_Descriptor cd_E1x14 = {  "E1x14", // class name
  bases_E1x14, 4,
  &(vtc_E1x14[0]), // expected_vtbl_contents
  &(vtt_E1x14[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E1x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E1x14),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E1x14),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  G1x14y0  : E1x14 , F1 {
  int ff;
  ~G1x14y0(); // tgen
  G1x14y0(); // tgen
};
//SIG(1 G1x14y0) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G1x14y0 ::~G1x14y0(){ note_dtor("G1x14y0", this);} // tgen
G1x14y0 ::G1x14y0(){ note_ctor("G1x14y0", this);} // tgen

static void Test_G1x14y0()
{
  extern Class_Descriptor cd_G1x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x14y0, buf);
    G1x14y0 *dp, &lv = *(dp=new (buf) G1x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x14y0)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x14*), 0, "G1x14y0");
    check_base_class_offset(lv, (B0*)(C1*)(E1x14*), ABISELECT(12,8), "G1x14y0");
    check_base_class_offset(lv, (C1*)(E1x14*), 0, "G1x14y0");
    check_base_class_offset(lv, (D0*)(E1x14*), ABISELECT(40,32), "G1x14y0");
    check_base_class_offset(lv, (E1x14*), 0, "G1x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G1x14y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G1x14y0.ff");
    test_class_info(&lv, &cd_G1x14y0);
    dp->~G1x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x14y0(Test_G1x14y0, "G1x14y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G1x14y0C1Ev();
extern void _ZN7G1x14y0D1Ev();
Name_Map name_map_G1x14y0[] = {
  NSPAIR(_ZN7G1x14y0C1Ev),
  NSPAIR(_ZN7G1x14y0D1Ev),
  {0,0}
};
extern Class_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_E1x14;
extern VTBL_ENTRY _ZTI5E1x14[];
extern  VTBL_ENTRY _ZTV5E1x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x14y0[] = {
  // 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_E1x14,    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 _ZTI7G1x14y0[];
extern void _ZN5E1x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x14y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x14y0[0]),
  (VTBL_ENTRY)&_ZN5E1x143fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G1x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G1x14y0[];
extern void _ZN5E1x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x14__7G1x14y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x14[0]),
  (VTBL_ENTRY)&_ZN5E1x143fooEv,
};
static  VTT_ENTRY vtt_G1x14y0[] = {
  {&(_ZTV7G1x14y0[3]),  3,7},
  {&(_tg__ZTV5E1x14__7G1x14y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G1x14y0[];
extern  VTBL_ENTRY _ZTV7G1x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x14y0[];
Class_Descriptor cd_G1x14y0 = {  "G1x14y0", // class name
  bases_G1x14y0, 6,
  &(vtc_G1x14y0[0]), // expected_vtbl_contents
  &(vtt_G1x14y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G1x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x14y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x14y0),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  G1x14y1  : virtual E1x14 , F1 {
  int ff;
  ~G1x14y1(); // tgen
  G1x14y1(); // tgen
};
//SIG(1 G1x14y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G1x14y1 ::~G1x14y1(){ note_dtor("G1x14y1", this);} // tgen
G1x14y1 ::G1x14y1(){ note_ctor("G1x14y1", this);} // tgen

static void Test_G1x14y1()
{
  extern Class_Descriptor cd_G1x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x14y1, buf);
    G1x14y1 *dp, &lv = *(dp=new (buf) G1x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x14y1)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x14*), ABISELECT(16,12), "G1x14y1");
    check_base_class_offset(lv, (B0*)(C1*)(E1x14*), ABISELECT(28,20), "G1x14y1");
    check_base_class_offset(lv, (C1*)(E1x14*), ABISELECT(16,12), "G1x14y1");
    check_base_class_offset(lv, (D0*)(E1x14*), ABISELECT(40,32), "G1x14y1");
    check_base_class_offset(lv, (E1x14*), ABISELECT(16,12), "G1x14y1");
    check_base_class_offset(lv, (F1*), 0, "G1x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x14y1.ff");
    test_class_info(&lv, &cd_G1x14y1);
    dp->~G1x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x14y1(Test_G1x14y1, "G1x14y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G1x14y1C1Ev();
extern void _ZN7G1x14y1D1Ev();
Name_Map name_map_G1x14y1[] = {
  NSPAIR(_ZN7G1x14y1C1Ev),
  NSPAIR(_ZN7G1x14y1D1Ev),
  {0,0}
};
extern Class_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_E1x14;
extern VTBL_ENTRY _ZTI5E1x14[];
extern  VTBL_ENTRY _ZTV5E1x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x14y1[] = {
  // 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_E1x14,    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 _ZTI7G1x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E1x143fooEv();
static  VTBL_ENTRY vtc_G1x14y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G1x14y1[0]),
  (VTBL_ENTRY)&_ZN5E1x143fooEv,
};
extern VTBL_ENTRY _ZTV7G1x14y1[];
extern void _ZN5E1x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x14__7G1x14y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x14[0]),
  (VTBL_ENTRY)&_ZN5E1x143fooEv,
};
static  VTT_ENTRY vtt_G1x14y1[] = {
  {&(_ZTV7G1x14y1[4]),  4,10},
  {&(_ZTV7G1x14y1[9]),  9,10},
  {&(_tg__ZTV5E1x14__7G1x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G1x14y1[];
extern  VTBL_ENTRY _ZTV7G1x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x14y1[];
Class_Descriptor cd_G1x14y1 = {  "G1x14y1", // class name
  bases_G1x14y1, 6,
  &(vtc_G1x14y1[0]), // expected_vtbl_contents
  &(vtt_G1x14y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G1x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x14y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x14y1),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  G1x14y2  : E1x14 , virtual F1 {
  int ff;
  ~G1x14y2(); // tgen
  G1x14y2(); // tgen
};
//SIG(1 G1x14y2) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G1x14y2 ::~G1x14y2(){ note_dtor("G1x14y2", this);} // tgen
G1x14y2 ::G1x14y2(){ note_ctor("G1x14y2", this);} // tgen

static void Test_G1x14y2()
{
  extern Class_Descriptor cd_G1x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x14y2, buf);
    G1x14y2 *dp, &lv = *(dp=new (buf) G1x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x14y2)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x14*), 0, "G1x14y2");
    check_base_class_offset(lv, (B0*)(C1*)(E1x14*), ABISELECT(12,8), "G1x14y2");
    check_base_class_offset(lv, (C1*)(E1x14*), 0, "G1x14y2");
    check_base_class_offset(lv, (D0*)(E1x14*), ABISELECT(28,24), "G1x14y2");
    check_base_class_offset(lv, (E1x14*), 0, "G1x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G1x14y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G1x14y2.ff");
    test_class_info(&lv, &cd_G1x14y2);
    dp->~G1x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x14y2(Test_G1x14y2, "G1x14y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G1x14y2C1Ev();
extern void _ZN7G1x14y2D1Ev();
Name_Map name_map_G1x14y2[] = {
  NSPAIR(_ZN7G1x14y2C1Ev),
  NSPAIR(_ZN7G1x14y2D1Ev),
  {0,0}
};
extern Class_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_E1x14;
extern VTBL_ENTRY _ZTI5E1x14[];
extern  VTBL_ENTRY _ZTV5E1x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x14y2[] = {
  // 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_E1x14,    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 _ZTI7G1x14y2[];
extern void _ZN5E1x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x14y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x14y2[0]),
  (VTBL_ENTRY)&_ZN5E1x143fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G1x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G1x14y2[];
extern void _ZN5E1x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x14__7G1x14y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x14[0]),
  (VTBL_ENTRY)&_ZN5E1x143fooEv,
};
static  VTT_ENTRY vtt_G1x14y2[] = {
  {&(_ZTV7G1x14y2[4]),  4,9},
  {&(_tg__ZTV5E1x14__7G1x14y2[3]),  3,4},
  {&(_ZTV7G1x14y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G1x14y2[];
extern  VTBL_ENTRY _ZTV7G1x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x14y2[];
Class_Descriptor cd_G1x14y2 = {  "G1x14y2", // class name
  bases_G1x14y2, 6,
  &(vtc_G1x14y2[0]), // expected_vtbl_contents
  &(vtt_G1x14y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G1x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x14y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x14y2),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  G1x14y3  : virtual E1x14 , virtual F1 {
  int ff;
  ~G1x14y3(); // tgen
  G1x14y3(); // tgen
};
//SIG(1 G1x14y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G1x14y3 ::~G1x14y3(){ note_dtor("G1x14y3", this);} // tgen
G1x14y3 ::G1x14y3(){ note_ctor("G1x14y3", this);} // tgen

static void Test_G1x14y3()
{
  extern Class_Descriptor cd_G1x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G1x14y3, buf);
    G1x14y3 *dp, &lv = *(dp=new (buf) G1x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G1x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x14y3)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x14*), ABISELECT(16,8), "G1x14y3");
    check_base_class_offset(lv, (B0*)(C1*)(E1x14*), ABISELECT(28,16), "G1x14y3");
    check_base_class_offset(lv, (C1*)(E1x14*), ABISELECT(16,8), "G1x14y3");
    check_base_class_offset(lv, (D0*)(E1x14*), ABISELECT(40,28), "G1x14y3");
    check_base_class_offset(lv, (E1x14*), ABISELECT(16,8), "G1x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G1x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G1x14y3.ff");
    test_class_info(&lv, &cd_G1x14y3);
    dp->~G1x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x14y3(Test_G1x14y3, "G1x14y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G1x14y3C1Ev();
extern void _ZN7G1x14y3D1Ev();
Name_Map name_map_G1x14y3[] = {
  NSPAIR(_ZN7G1x14y3C1Ev),
  NSPAIR(_ZN7G1x14y3D1Ev),
  {0,0}
};
extern Class_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_E1x14;
extern VTBL_ENTRY _ZTI5E1x14[];
extern  VTBL_ENTRY _ZTV5E1x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x14y3[] = {
  // 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_E1x14,    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 _ZTI7G1x14y3[];
extern void _ZN5E1x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x14y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x14y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G1x14y3[0]),
  (VTBL_ENTRY)&_ZN5E1x143fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G1x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G1x14y3[];
extern void _ZN5E1x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x14__7G1x14y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x14[0]),
  (VTBL_ENTRY)&_ZN5E1x143fooEv,
};
static  VTT_ENTRY vtt_G1x14y3[] = {
  {&(_ZTV7G1x14y3[5]),  5,14},
  {&(_ZTV7G1x14y3[9]),  9,14},
  {&(_ZTV7G1x14y3[13]),  13,14},
  {&(_tg__ZTV5E1x14__7G1x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G1x14y3[];
extern  VTBL_ENTRY _ZTV7G1x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x14y3[];
Class_Descriptor cd_G1x14y3 = {  "G1x14y3", // class name
  bases_G1x14y3, 6,
  &(vtc_G1x14y3[0]), // expected_vtbl_contents
  &(vtt_G1x14y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G1x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x14y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x14y3),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  G1x14y4  : E1x14 , F0 {
  int ff;
  ~G1x14y4(); // tgen
  G1x14y4(); // tgen
};
//SIG(1 G1x14y4) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G1x14y4 ::~G1x14y4(){ note_dtor("G1x14y4", this);} // tgen
G1x14y4 ::G1x14y4(){ note_ctor("G1x14y4", this);} // tgen

static void Test_G1x14y4()
{
  extern Class_Descriptor cd_G1x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G1x14y4, buf);
    G1x14y4 *dp, &lv = *(dp=new (buf) G1x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G1x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x14y4)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x14*), 0, "G1x14y4");
    check_base_class_offset(lv, (B0*)(C1*)(E1x14*), ABISELECT(12,8), "G1x14y4");
    check_base_class_offset(lv, (C1*)(E1x14*), 0, "G1x14y4");
    check_base_class_offset(lv, (D0*)(E1x14*), ABISELECT(32,28), "G1x14y4");
    check_base_class_offset(lv, (E1x14*), 0, "G1x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G1x14y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G1x14y4.ff");
    test_class_info(&lv, &cd_G1x14y4);
    dp->~G1x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x14y4(Test_G1x14y4, "G1x14y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G1x14y4C1Ev();
extern void _ZN7G1x14y4D1Ev();
Name_Map name_map_G1x14y4[] = {
  NSPAIR(_ZN7G1x14y4C1Ev),
  NSPAIR(_ZN7G1x14y4D1Ev),
  {0,0}
};
extern Class_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_E1x14;
extern VTBL_ENTRY _ZTI5E1x14[];
extern  VTBL_ENTRY _ZTV5E1x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x14y4[] = {
  // 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_E1x14,    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 _ZTI7G1x14y4[];
extern void _ZN5E1x143fooEv();
static  VTBL_ENTRY vtc_G1x14y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x14y4[0]),
  (VTBL_ENTRY)&_ZN5E1x143fooEv,
};
extern VTBL_ENTRY _ZTV7G1x14y4[];
extern void _ZN5E1x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x14__7G1x14y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x14[0]),
  (VTBL_ENTRY)&_ZN5E1x143fooEv,
};
static  VTT_ENTRY vtt_G1x14y4[] = {
  {&(_ZTV7G1x14y4[3]),  3,4},
  {&(_tg__ZTV5E1x14__7G1x14y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G1x14y4[];
extern  VTBL_ENTRY _ZTV7G1x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x14y4[];
Class_Descriptor cd_G1x14y4 = {  "G1x14y4", // class name
  bases_G1x14y4, 6,
  &(vtc_G1x14y4[0]), // expected_vtbl_contents
  &(vtt_G1x14y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G1x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x14y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x14y4),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  G1x14y5  : virtual E1x14 , F0 {
  int ff;
  ~G1x14y5(); // tgen
  G1x14y5(); // tgen
};
//SIG(1 G1x14y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G1x14y5 ::~G1x14y5(){ note_dtor("G1x14y5", this);} // tgen
G1x14y5 ::G1x14y5(){ note_ctor("G1x14y5", this);} // tgen

static void Test_G1x14y5()
{
  extern Class_Descriptor cd_G1x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x14y5, buf);
    G1x14y5 *dp, &lv = *(dp=new (buf) G1x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x14y5)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x14*), ABISELECT(16,12), "G1x14y5");
    check_base_class_offset(lv, (B0*)(C1*)(E1x14*), ABISELECT(28,20), "G1x14y5");
    check_base_class_offset(lv, (C1*)(E1x14*), ABISELECT(16,12), "G1x14y5");
    check_base_class_offset(lv, (D0*)(E1x14*), ABISELECT(40,32), "G1x14y5");
    check_base_class_offset(lv, (E1x14*), ABISELECT(16,12), "G1x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G1x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x14y5.ff");
    test_class_info(&lv, &cd_G1x14y5);
    dp->~G1x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x14y5(Test_G1x14y5, "G1x14y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G1x14y5C1Ev();
extern void _ZN7G1x14y5D1Ev();
Name_Map name_map_G1x14y5[] = {
  NSPAIR(_ZN7G1x14y5C1Ev),
  NSPAIR(_ZN7G1x14y5D1Ev),
  {0,0}
};
extern Class_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_E1x14;
extern VTBL_ENTRY _ZTI5E1x14[];
extern  VTBL_ENTRY _ZTV5E1x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x14y5[] = {
  // 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_E1x14,    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 _ZTI7G1x14y5[];
extern void _ZN5E1x143fooEv();
static  VTBL_ENTRY vtc_G1x14y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x14y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G1x14y5[0]),
  (VTBL_ENTRY)&_ZN5E1x143fooEv,
};
extern VTBL_ENTRY _ZTV7G1x14y5[];
extern void _ZN5E1x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x14__7G1x14y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x14[0]),
  (VTBL_ENTRY)&_ZN5E1x143fooEv,
};
static  VTT_ENTRY vtt_G1x14y5[] = {
  {&(_ZTV7G1x14y5[4]),  4,9},
  {&(_ZTV7G1x14y5[8]),  8,9},
  {&(_tg__ZTV5E1x14__7G1x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G1x14y5[];
extern  VTBL_ENTRY _ZTV7G1x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x14y5[];
Class_Descriptor cd_G1x14y5 = {  "G1x14y5", // class name
  bases_G1x14y5, 6,
  &(vtc_G1x14y5[0]), // expected_vtbl_contents
  &(vtt_G1x14y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G1x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x14y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x14y5),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  G1x14y6  : E1x14 , virtual F0 {
  int ff;
  ~G1x14y6(); // tgen
  G1x14y6(); // tgen
};
//SIG(1 G1x14y6) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G1x14y6 ::~G1x14y6(){ note_dtor("G1x14y6", this);} // tgen
G1x14y6 ::G1x14y6(){ note_ctor("G1x14y6", this);} // tgen

static void Test_G1x14y6()
{
  extern Class_Descriptor cd_G1x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G1x14y6, buf);
    G1x14y6 *dp, &lv = *(dp=new (buf) G1x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G1x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x14y6)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x14*), 0, "G1x14y6");
    check_base_class_offset(lv, (B0*)(C1*)(E1x14*), ABISELECT(12,8), "G1x14y6");
    check_base_class_offset(lv, (C1*)(E1x14*), 0, "G1x14y6");
    check_base_class_offset(lv, (D0*)(E1x14*), ABISELECT(28,24), "G1x14y6");
    check_base_class_offset(lv, (E1x14*), 0, "G1x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G1x14y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G1x14y6.ff");
    test_class_info(&lv, &cd_G1x14y6);
    dp->~G1x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x14y6(Test_G1x14y6, "G1x14y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G1x14y6C1Ev();
extern void _ZN7G1x14y6D1Ev();
Name_Map name_map_G1x14y6[] = {
  NSPAIR(_ZN7G1x14y6C1Ev),
  NSPAIR(_ZN7G1x14y6D1Ev),
  {0,0}
};
extern Class_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_E1x14;
extern VTBL_ENTRY _ZTI5E1x14[];
extern  VTBL_ENTRY _ZTV5E1x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x14y6[] = {
  // 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_E1x14,    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 _ZTI7G1x14y6[];
extern void _ZN5E1x143fooEv();
static  VTBL_ENTRY vtc_G1x14y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x14y6[0]),
  (VTBL_ENTRY)&_ZN5E1x143fooEv,
};
extern VTBL_ENTRY _ZTV7G1x14y6[];
extern void _ZN5E1x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x14__7G1x14y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x14[0]),
  (VTBL_ENTRY)&_ZN5E1x143fooEv,
};
static  VTT_ENTRY vtt_G1x14y6[] = {
  {&(_ZTV7G1x14y6[4]),  4,5},
  {&(_tg__ZTV5E1x14__7G1x14y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G1x14y6[];
extern  VTBL_ENTRY _ZTV7G1x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x14y6[];
Class_Descriptor cd_G1x14y6 = {  "G1x14y6", // class name
  bases_G1x14y6, 6,
  &(vtc_G1x14y6[0]), // expected_vtbl_contents
  &(vtt_G1x14y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G1x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x14y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x14y6),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  G1x14y7  : virtual E1x14 , virtual F0 {
  int ff;
  ~G1x14y7(); // tgen
  G1x14y7(); // tgen
};
//SIG(1 G1x14y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G1x14y7 ::~G1x14y7(){ note_dtor("G1x14y7", this);} // tgen
G1x14y7 ::G1x14y7(){ note_ctor("G1x14y7", this);} // tgen

static void Test_G1x14y7()
{
  extern Class_Descriptor cd_G1x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x14y7, buf);
    G1x14y7 *dp, &lv = *(dp=new (buf) G1x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x14y7)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x14*), ABISELECT(16,8), "G1x14y7");
    check_base_class_offset(lv, (B0*)(C1*)(E1x14*), ABISELECT(28,16), "G1x14y7");
    check_base_class_offset(lv, (C1*)(E1x14*), ABISELECT(16,8), "G1x14y7");
    check_base_class_offset(lv, (D0*)(E1x14*), ABISELECT(40,28), "G1x14y7");
    check_base_class_offset(lv, (E1x14*), ABISELECT(16,8), "G1x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G1x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G1x14y7.ff");
    test_class_info(&lv, &cd_G1x14y7);
    dp->~G1x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x14y7(Test_G1x14y7, "G1x14y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G1x14y7C1Ev();
extern void _ZN7G1x14y7D1Ev();
Name_Map name_map_G1x14y7[] = {
  NSPAIR(_ZN7G1x14y7C1Ev),
  NSPAIR(_ZN7G1x14y7D1Ev),
  {0,0}
};
extern Class_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_E1x14;
extern VTBL_ENTRY _ZTI5E1x14[];
extern  VTBL_ENTRY _ZTV5E1x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x14y7[] = {
  // 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_E1x14,    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 _ZTI7G1x14y7[];
extern void _ZN5E1x143fooEv();
static  VTBL_ENTRY vtc_G1x14y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x14y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G1x14y7[0]),
  (VTBL_ENTRY)&_ZN5E1x143fooEv,
};
extern VTBL_ENTRY _ZTV7G1x14y7[];
extern void _ZN5E1x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x14__7G1x14y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x14[0]),
  (VTBL_ENTRY)&_ZN5E1x143fooEv,
};
static  VTT_ENTRY vtt_G1x14y7[] = {
  {&(_ZTV7G1x14y7[5]),  5,10},
  {&(_ZTV7G1x14y7[9]),  9,10},
  {&(_tg__ZTV5E1x14__7G1x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G1x14y7[];
extern  VTBL_ENTRY _ZTV7G1x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x14y7[];
Class_Descriptor cd_G1x14y7 = {  "G1x14y7", // class name
  bases_G1x14y7, 6,
  &(vtc_G1x14y7[0]), // expected_vtbl_contents
  &(vtt_G1x14y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G1x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x14y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x14y7),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  E2x14  : C2 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E2x143fooEv
  ~E2x14(); // tgen
  E2x14(); // tgen
};
//SIG(-1 E2x14) C1{ BC2{ VBC3{ Fi} BC4{ Fi} Fi} VBC5{ Fi} v1 Fi}


void  E2x14 ::foo(){vfunc_called(this, "_ZN5E2x143fooEv");}
E2x14 ::~E2x14(){ note_dtor("E2x14", this);} // tgen
E2x14 ::E2x14(){ note_ctor("E2x14", this);} // tgen

static void Test_E2x14()
{
  extern Class_Descriptor cd_E2x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E2x14, buf);
    E2x14 *dp, &lv = *(dp=new (buf) E2x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E2x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E2x14)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(20,16), "E2x14");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(8,4), "E2x14");
    check_base_class_offset(lv, (C2*), 0, "E2x14");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E2x14");
    check_field_offset(lv, fd, ABISELECT(16,12), "E2x14.fd");
    test_class_info(&lv, &cd_E2x14);
    dp->~E2x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE2x14(Test_E2x14, "E2x14", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E2x14C1Ev();
extern void _ZN5E2x14D1Ev();
Name_Map name_map_E2x14[] = {
  NSPAIR(_ZN5E2x14C1Ev),
  NSPAIR(_ZN5E2x14D1Ev),
  {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_E2x14[] = {
  // 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 _ZTI5E2x14[];
extern void _ZN5E2x143fooEv();
static  VTBL_ENTRY vtc_E2x14[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x14[0]),
  (VTBL_ENTRY)&_ZN5E2x143fooEv,
};
extern VTBL_ENTRY _ZTV5E2x14[];
static  VTBL_ENTRY _tg__ZTV2C2__5E2x14[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_E2x14[] = {
  {&(_ZTV5E2x14[4]),  4,5},
  {&(_tg__ZTV2C2__5E2x14[3]),  3,3},
};
extern VTBL_ENTRY _ZTI5E2x14[];
extern  VTBL_ENTRY _ZTV5E2x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x14[];
Class_Descriptor cd_E2x14 = {  "E2x14", // class name
  bases_E2x14, 4,
  &(vtc_E2x14[0]), // expected_vtbl_contents
  &(vtt_E2x14[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E2x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E2x14),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E2x14),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  G2x14y0  : E2x14 , F1 {
  int ff;
  ~G2x14y0(); // tgen
  G2x14y0(); // tgen
};
//SIG(1 G2x14y0) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G2x14y0 ::~G2x14y0(){ note_dtor("G2x14y0", this);} // tgen
G2x14y0 ::G2x14y0(){ note_ctor("G2x14y0", this);} // tgen

static void Test_G2x14y0()
{
  extern Class_Descriptor cd_G2x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x14y0, buf);
    G2x14y0 *dp, &lv = *(dp=new (buf) G2x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x14y0)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x14*), ABISELECT(40,28), "G2x14y0");
    check_base_class_offset(lv, (B0*)(C2*)(E2x14*), ABISELECT(8,4), "G2x14y0");
    check_base_class_offset(lv, (C2*)(E2x14*), 0, "G2x14y0");
    check_base_class_offset(lv, (D0*)(E2x14*), ABISELECT(44,32), "G2x14y0");
    check_base_class_offset(lv, (E2x14*), 0, "G2x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G2x14y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G2x14y0.ff");
    test_class_info(&lv, &cd_G2x14y0);
    dp->~G2x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x14y0(Test_G2x14y0, "G2x14y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G2x14y0C1Ev();
extern void _ZN7G2x14y0D1Ev();
Name_Map name_map_G2x14y0[] = {
  NSPAIR(_ZN7G2x14y0C1Ev),
  NSPAIR(_ZN7G2x14y0D1Ev),
  {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_E2x14;
extern VTBL_ENTRY _ZTI5E2x14[];
extern  VTBL_ENTRY _ZTV5E2x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x14y0[] = {
  // 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_E2x14,    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 _ZTI7G2x14y0[];
extern void _ZN5E2x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x14y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x14y0[0]),
  (VTBL_ENTRY)&_ZN5E2x143fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G2x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G2x14y0[];
extern void _ZN5E2x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x14__7G2x14y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x14[0]),
  (VTBL_ENTRY)&_ZN5E2x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C25E2x14__7G2x14y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x14y0[] = {
  {&(_ZTV7G2x14y0[4]),  4,8},
  {&(_tg__ZTV5E2x14__7G2x14y0[4]),  4,5},
  {&(_tg__ZTV2C25E2x14__7G2x14y0[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x14y0[];
extern  VTBL_ENTRY _ZTV7G2x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x14y0[];
Class_Descriptor cd_G2x14y0 = {  "G2x14y0", // class name
  bases_G2x14y0, 6,
  &(vtc_G2x14y0[0]), // expected_vtbl_contents
  &(vtt_G2x14y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G2x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x14y0),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x14y0),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  G2x14y1  : virtual E2x14 , F1 {
  int ff;
  ~G2x14y1(); // tgen
  G2x14y1(); // tgen
};
//SIG(1 G2x14y1) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G2x14y1 ::~G2x14y1(){ note_dtor("G2x14y1", this);} // tgen
G2x14y1 ::G2x14y1(){ note_ctor("G2x14y1", this);} // tgen

static void Test_G2x14y1()
{
  extern Class_Descriptor cd_G2x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x14y1, buf);
    G2x14y1 *dp, &lv = *(dp=new (buf) G2x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x14y1)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x14*), ABISELECT(36,28), "G2x14y1");
    check_base_class_offset(lv, (B0*)(C2*)(E2x14*), ABISELECT(24,16), "G2x14y1");
    check_base_class_offset(lv, (C2*)(E2x14*), ABISELECT(16,12), "G2x14y1");
    check_base_class_offset(lv, (D0*)(E2x14*), ABISELECT(40,32), "G2x14y1");
    check_base_class_offset(lv, (E2x14*), ABISELECT(16,12), "G2x14y1");
    check_base_class_offset(lv, (F1*), 0, "G2x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x14y1.ff");
    test_class_info(&lv, &cd_G2x14y1);
    dp->~G2x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x14y1(Test_G2x14y1, "G2x14y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G2x14y1C1Ev();
extern void _ZN7G2x14y1D1Ev();
Name_Map name_map_G2x14y1[] = {
  NSPAIR(_ZN7G2x14y1C1Ev),
  NSPAIR(_ZN7G2x14y1D1Ev),
  {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_E2x14;
extern VTBL_ENTRY _ZTI5E2x14[];
extern  VTBL_ENTRY _ZTV5E2x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x14y1[] = {
  // 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_E2x14,    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 _ZTI7G2x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E2x143fooEv();
static  VTBL_ENTRY vtc_G2x14y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G2x14y1[0]),
  (VTBL_ENTRY)&_ZN5E2x143fooEv,
};
extern VTBL_ENTRY _ZTV7G2x14y1[];
extern void _ZN5E2x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x14__7G2x14y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x14[0]),
  (VTBL_ENTRY)&_ZN5E2x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C25E2x14__7G2x14y1[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x14y1[] = {
  {&(_ZTV7G2x14y1[5]),  5,12},
  {&(_ZTV7G2x14y1[11]),  11,12},
  {&(_tg__ZTV5E2x14__7G2x14y1[4]),  4,5},
  {&(_tg__ZTV2C25E2x14__7G2x14y1[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x14y1[];
extern  VTBL_ENTRY _ZTV7G2x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x14y1[];
Class_Descriptor cd_G2x14y1 = {  "G2x14y1", // class name
  bases_G2x14y1, 6,
  &(vtc_G2x14y1[0]), // expected_vtbl_contents
  &(vtt_G2x14y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G2x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x14y1),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x14y1),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  G2x14y2  : E2x14 , virtual F1 {
  int ff;
  ~G2x14y2(); // tgen
  G2x14y2(); // tgen
};
//SIG(1 G2x14y2) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G2x14y2 ::~G2x14y2(){ note_dtor("G2x14y2", this);} // tgen
G2x14y2 ::G2x14y2(){ note_ctor("G2x14y2", this);} // tgen

static void Test_G2x14y2()
{
  extern Class_Descriptor cd_G2x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x14y2, buf);
    G2x14y2 *dp, &lv = *(dp=new (buf) G2x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x14y2)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x14*), ABISELECT(24,20), "G2x14y2");
    check_base_class_offset(lv, (B0*)(C2*)(E2x14*), ABISELECT(8,4), "G2x14y2");
    check_base_class_offset(lv, (C2*)(E2x14*), 0, "G2x14y2");
    check_base_class_offset(lv, (D0*)(E2x14*), ABISELECT(28,24), "G2x14y2");
    check_base_class_offset(lv, (E2x14*), 0, "G2x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G2x14y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G2x14y2.ff");
    test_class_info(&lv, &cd_G2x14y2);
    dp->~G2x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x14y2(Test_G2x14y2, "G2x14y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G2x14y2C1Ev();
extern void _ZN7G2x14y2D1Ev();
Name_Map name_map_G2x14y2[] = {
  NSPAIR(_ZN7G2x14y2C1Ev),
  NSPAIR(_ZN7G2x14y2D1Ev),
  {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_E2x14;
extern VTBL_ENTRY _ZTI5E2x14[];
extern  VTBL_ENTRY _ZTV5E2x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x14y2[] = {
  // 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_E2x14,    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 _ZTI7G2x14y2[];
extern void _ZN5E2x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x14y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x14y2[0]),
  (VTBL_ENTRY)&_ZN5E2x143fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G2x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G2x14y2[];
extern void _ZN5E2x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x14__7G2x14y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x14[0]),
  (VTBL_ENTRY)&_ZN5E2x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C25E2x14__7G2x14y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x14y2[] = {
  {&(_ZTV7G2x14y2[5]),  5,10},
  {&(_tg__ZTV5E2x14__7G2x14y2[4]),  4,5},
  {&(_tg__ZTV2C25E2x14__7G2x14y2[3]),  3,3},
  {&(_ZTV7G2x14y2[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G2x14y2[];
extern  VTBL_ENTRY _ZTV7G2x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x14y2[];
Class_Descriptor cd_G2x14y2 = {  "G2x14y2", // class name
  bases_G2x14y2, 6,
  &(vtc_G2x14y2[0]), // expected_vtbl_contents
  &(vtt_G2x14y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G2x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x14y2),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x14y2),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  G2x14y3  : virtual E2x14 , virtual F1 {
  int ff;
  ~G2x14y3(); // tgen
  G2x14y3(); // tgen
};
//SIG(1 G2x14y3) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G2x14y3 ::~G2x14y3(){ note_dtor("G2x14y3", this);} // tgen
G2x14y3 ::G2x14y3(){ note_ctor("G2x14y3", this);} // tgen

static void Test_G2x14y3()
{
  extern Class_Descriptor cd_G2x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G2x14y3, buf);
    G2x14y3 *dp, &lv = *(dp=new (buf) G2x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G2x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x14y3)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x14*), ABISELECT(36,24), "G2x14y3");
    check_base_class_offset(lv, (B0*)(C2*)(E2x14*), ABISELECT(24,12), "G2x14y3");
    check_base_class_offset(lv, (C2*)(E2x14*), ABISELECT(16,8), "G2x14y3");
    check_base_class_offset(lv, (D0*)(E2x14*), ABISELECT(40,28), "G2x14y3");
    check_base_class_offset(lv, (E2x14*), ABISELECT(16,8), "G2x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G2x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G2x14y3.ff");
    test_class_info(&lv, &cd_G2x14y3);
    dp->~G2x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x14y3(Test_G2x14y3, "G2x14y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G2x14y3C1Ev();
extern void _ZN7G2x14y3D1Ev();
Name_Map name_map_G2x14y3[] = {
  NSPAIR(_ZN7G2x14y3C1Ev),
  NSPAIR(_ZN7G2x14y3D1Ev),
  {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_E2x14;
extern VTBL_ENTRY _ZTI5E2x14[];
extern  VTBL_ENTRY _ZTV5E2x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x14y3[] = {
  // 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_E2x14,    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 _ZTI7G2x14y3[];
extern void _ZN5E2x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x14y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x14y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G2x14y3[0]),
  (VTBL_ENTRY)&_ZN5E2x143fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G2x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G2x14y3[];
extern void _ZN5E2x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x14__7G2x14y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x14[0]),
  (VTBL_ENTRY)&_ZN5E2x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C25E2x14__7G2x14y3[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x14y3[] = {
  {&(_ZTV7G2x14y3[6]),  6,16},
  {&(_ZTV7G2x14y3[11]),  11,16},
  {&(_ZTV7G2x14y3[15]),  15,16},
  {&(_tg__ZTV5E2x14__7G2x14y3[4]),  4,5},
  {&(_tg__ZTV2C25E2x14__7G2x14y3[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x14y3[];
extern  VTBL_ENTRY _ZTV7G2x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x14y3[];
Class_Descriptor cd_G2x14y3 = {  "G2x14y3", // class name
  bases_G2x14y3, 6,
  &(vtc_G2x14y3[0]), // expected_vtbl_contents
  &(vtt_G2x14y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G2x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x14y3),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x14y3),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  G2x14y4  : E2x14 , F0 {
  int ff;
  ~G2x14y4(); // tgen
  G2x14y4(); // tgen
};
//SIG(1 G2x14y4) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G2x14y4 ::~G2x14y4(){ note_dtor("G2x14y4", this);} // tgen
G2x14y4 ::G2x14y4(){ note_ctor("G2x14y4", this);} // tgen

static void Test_G2x14y4()
{
  extern Class_Descriptor cd_G2x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G2x14y4, buf);
    G2x14y4 *dp, &lv = *(dp=new (buf) G2x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G2x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x14y4)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x14*), ABISELECT(28,24), "G2x14y4");
    check_base_class_offset(lv, (B0*)(C2*)(E2x14*), ABISELECT(8,4), "G2x14y4");
    check_base_class_offset(lv, (C2*)(E2x14*), 0, "G2x14y4");
    check_base_class_offset(lv, (D0*)(E2x14*), ABISELECT(32,28), "G2x14y4");
    check_base_class_offset(lv, (E2x14*), 0, "G2x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G2x14y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G2x14y4.ff");
    test_class_info(&lv, &cd_G2x14y4);
    dp->~G2x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x14y4(Test_G2x14y4, "G2x14y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G2x14y4C1Ev();
extern void _ZN7G2x14y4D1Ev();
Name_Map name_map_G2x14y4[] = {
  NSPAIR(_ZN7G2x14y4C1Ev),
  NSPAIR(_ZN7G2x14y4D1Ev),
  {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_E2x14;
extern VTBL_ENTRY _ZTI5E2x14[];
extern  VTBL_ENTRY _ZTV5E2x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x14y4[] = {
  // 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_E2x14,    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 _ZTI7G2x14y4[];
extern void _ZN5E2x143fooEv();
static  VTBL_ENTRY vtc_G2x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x14y4[0]),
  (VTBL_ENTRY)&_ZN5E2x143fooEv,
};
extern VTBL_ENTRY _ZTV7G2x14y4[];
extern void _ZN5E2x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x14__7G2x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x14[0]),
  (VTBL_ENTRY)&_ZN5E2x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C25E2x14__7G2x14y4[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x14y4[] = {
  {&(_ZTV7G2x14y4[4]),  4,5},
  {&(_tg__ZTV5E2x14__7G2x14y4[4]),  4,5},
  {&(_tg__ZTV2C25E2x14__7G2x14y4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x14y4[];
extern  VTBL_ENTRY _ZTV7G2x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x14y4[];
Class_Descriptor cd_G2x14y4 = {  "G2x14y4", // class name
  bases_G2x14y4, 6,
  &(vtc_G2x14y4[0]), // expected_vtbl_contents
  &(vtt_G2x14y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G2x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x14y4),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x14y4),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  G2x14y5  : virtual E2x14 , F0 {
  int ff;
  ~G2x14y5(); // tgen
  G2x14y5(); // tgen
};
//SIG(1 G2x14y5) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G2x14y5 ::~G2x14y5(){ note_dtor("G2x14y5", this);} // tgen
G2x14y5 ::G2x14y5(){ note_ctor("G2x14y5", this);} // tgen

static void Test_G2x14y5()
{
  extern Class_Descriptor cd_G2x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x14y5, buf);
    G2x14y5 *dp, &lv = *(dp=new (buf) G2x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x14y5)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x14*), ABISELECT(36,28), "G2x14y5");
    check_base_class_offset(lv, (B0*)(C2*)(E2x14*), ABISELECT(24,16), "G2x14y5");
    check_base_class_offset(lv, (C2*)(E2x14*), ABISELECT(16,12), "G2x14y5");
    check_base_class_offset(lv, (D0*)(E2x14*), ABISELECT(40,32), "G2x14y5");
    check_base_class_offset(lv, (E2x14*), ABISELECT(16,12), "G2x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G2x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x14y5.ff");
    test_class_info(&lv, &cd_G2x14y5);
    dp->~G2x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x14y5(Test_G2x14y5, "G2x14y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G2x14y5C1Ev();
extern void _ZN7G2x14y5D1Ev();
Name_Map name_map_G2x14y5[] = {
  NSPAIR(_ZN7G2x14y5C1Ev),
  NSPAIR(_ZN7G2x14y5D1Ev),
  {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_E2x14;
extern VTBL_ENTRY _ZTI5E2x14[];
extern  VTBL_ENTRY _ZTV5E2x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x14y5[] = {
  // 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_E2x14,    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 _ZTI7G2x14y5[];
extern void _ZN5E2x143fooEv();
static  VTBL_ENTRY vtc_G2x14y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x14y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G2x14y5[0]),
  (VTBL_ENTRY)&_ZN5E2x143fooEv,
};
extern VTBL_ENTRY _ZTV7G2x14y5[];
extern void _ZN5E2x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x14__7G2x14y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x14[0]),
  (VTBL_ENTRY)&_ZN5E2x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C25E2x14__7G2x14y5[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x14y5[] = {
  {&(_ZTV7G2x14y5[5]),  5,11},
  {&(_ZTV7G2x14y5[10]),  10,11},
  {&(_tg__ZTV5E2x14__7G2x14y5[4]),  4,5},
  {&(_tg__ZTV2C25E2x14__7G2x14y5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x14y5[];
extern  VTBL_ENTRY _ZTV7G2x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x14y5[];
Class_Descriptor cd_G2x14y5 = {  "G2x14y5", // class name
  bases_G2x14y5, 6,
  &(vtc_G2x14y5[0]), // expected_vtbl_contents
  &(vtt_G2x14y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G2x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x14y5),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x14y5),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  G2x14y6  : E2x14 , virtual F0 {
  int ff;
  ~G2x14y6(); // tgen
  G2x14y6(); // tgen
};
//SIG(1 G2x14y6) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G2x14y6 ::~G2x14y6(){ note_dtor("G2x14y6", this);} // tgen
G2x14y6 ::G2x14y6(){ note_ctor("G2x14y6", this);} // tgen

static void Test_G2x14y6()
{
  extern Class_Descriptor cd_G2x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G2x14y6, buf);
    G2x14y6 *dp, &lv = *(dp=new (buf) G2x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G2x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x14y6)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x14*), ABISELECT(24,20), "G2x14y6");
    check_base_class_offset(lv, (B0*)(C2*)(E2x14*), ABISELECT(8,4), "G2x14y6");
    check_base_class_offset(lv, (C2*)(E2x14*), 0, "G2x14y6");
    check_base_class_offset(lv, (D0*)(E2x14*), ABISELECT(28,24), "G2x14y6");
    check_base_class_offset(lv, (E2x14*), 0, "G2x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G2x14y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G2x14y6.ff");
    test_class_info(&lv, &cd_G2x14y6);
    dp->~G2x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x14y6(Test_G2x14y6, "G2x14y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G2x14y6C1Ev();
extern void _ZN7G2x14y6D1Ev();
Name_Map name_map_G2x14y6[] = {
  NSPAIR(_ZN7G2x14y6C1Ev),
  NSPAIR(_ZN7G2x14y6D1Ev),
  {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_E2x14;
extern VTBL_ENTRY _ZTI5E2x14[];
extern  VTBL_ENTRY _ZTV5E2x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x14y6[] = {
  // 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_E2x14,    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 _ZTI7G2x14y6[];
extern void _ZN5E2x143fooEv();
static  VTBL_ENTRY vtc_G2x14y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x14y6[0]),
  (VTBL_ENTRY)&_ZN5E2x143fooEv,
};
extern VTBL_ENTRY _ZTV7G2x14y6[];
extern void _ZN5E2x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x14__7G2x14y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x14[0]),
  (VTBL_ENTRY)&_ZN5E2x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C25E2x14__7G2x14y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x14y6[] = {
  {&(_ZTV7G2x14y6[5]),  5,6},
  {&(_tg__ZTV5E2x14__7G2x14y6[4]),  4,5},
  {&(_tg__ZTV2C25E2x14__7G2x14y6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x14y6[];
extern  VTBL_ENTRY _ZTV7G2x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x14y6[];
Class_Descriptor cd_G2x14y6 = {  "G2x14y6", // class name
  bases_G2x14y6, 6,
  &(vtc_G2x14y6[0]), // expected_vtbl_contents
  &(vtt_G2x14y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G2x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x14y6),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x14y6),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  G2x14y7  : virtual E2x14 , virtual F0 {
  int ff;
  ~G2x14y7(); // tgen
  G2x14y7(); // tgen
};
//SIG(1 G2x14y7) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G2x14y7 ::~G2x14y7(){ note_dtor("G2x14y7", this);} // tgen
G2x14y7 ::G2x14y7(){ note_ctor("G2x14y7", this);} // tgen

static void Test_G2x14y7()
{
  extern Class_Descriptor cd_G2x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x14y7, buf);
    G2x14y7 *dp, &lv = *(dp=new (buf) G2x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x14y7)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x14*), ABISELECT(36,24), "G2x14y7");
    check_base_class_offset(lv, (B0*)(C2*)(E2x14*), ABISELECT(24,12), "G2x14y7");
    check_base_class_offset(lv, (C2*)(E2x14*), ABISELECT(16,8), "G2x14y7");
    check_base_class_offset(lv, (D0*)(E2x14*), ABISELECT(40,28), "G2x14y7");
    check_base_class_offset(lv, (E2x14*), ABISELECT(16,8), "G2x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G2x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G2x14y7.ff");
    test_class_info(&lv, &cd_G2x14y7);
    dp->~G2x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x14y7(Test_G2x14y7, "G2x14y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G2x14y7C1Ev();
extern void _ZN7G2x14y7D1Ev();
Name_Map name_map_G2x14y7[] = {
  NSPAIR(_ZN7G2x14y7C1Ev),
  NSPAIR(_ZN7G2x14y7D1Ev),
  {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_E2x14;
extern VTBL_ENTRY _ZTI5E2x14[];
extern  VTBL_ENTRY _ZTV5E2x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x14y7[] = {
  // 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_E2x14,    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 _ZTI7G2x14y7[];
extern void _ZN5E2x143fooEv();
static  VTBL_ENTRY vtc_G2x14y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x14y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G2x14y7[0]),
  (VTBL_ENTRY)&_ZN5E2x143fooEv,
};
extern VTBL_ENTRY _ZTV7G2x14y7[];
extern void _ZN5E2x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x14__7G2x14y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x14[0]),
  (VTBL_ENTRY)&_ZN5E2x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C25E2x14__7G2x14y7[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x14y7[] = {
  {&(_ZTV7G2x14y7[6]),  6,12},
  {&(_ZTV7G2x14y7[11]),  11,12},
  {&(_tg__ZTV5E2x14__7G2x14y7[4]),  4,5},
  {&(_tg__ZTV2C25E2x14__7G2x14y7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x14y7[];
extern  VTBL_ENTRY _ZTV7G2x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x14y7[];
Class_Descriptor cd_G2x14y7 = {  "G2x14y7", // class name
  bases_G2x14y7, 6,
  &(vtc_G2x14y7[0]), // expected_vtbl_contents
  &(vtt_G2x14y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G2x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x14y7),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x14y7),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  E3x14  : C3 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E3x143fooEv
  ~E3x14(); // tgen
  E3x14(); // tgen
};
//SIG(-1 E3x14) C1{ BC2{ VBC3{ v1 Fi} BC4{ Fi} Fi} VBC5{ Fi} v1 Fi}


void  E3x14 ::foo(){vfunc_called(this, "_ZN5E3x143fooEv");}
E3x14 ::~E3x14(){ note_dtor("E3x14", this);} // tgen
E3x14 ::E3x14(){ note_ctor("E3x14", this);} // tgen

static void Test_E3x14()
{
  extern Class_Descriptor cd_E3x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E3x14, buf);
    E3x14 *dp, &lv = *(dp=new (buf) E3x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E3x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E3x14)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(24,16), "E3x14");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(8,4), "E3x14");
    check_base_class_offset(lv, (C3*), 0, "E3x14");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E3x14");
    check_field_offset(lv, fd, ABISELECT(16,12), "E3x14.fd");
    test_class_info(&lv, &cd_E3x14);
    dp->~E3x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE3x14(Test_E3x14, "E3x14", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E3x14C1Ev();
extern void _ZN5E3x14D1Ev();
Name_Map name_map_E3x14[] = {
  NSPAIR(_ZN5E3x14C1Ev),
  NSPAIR(_ZN5E3x14D1Ev),
  {0,0}
};
extern Class_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_E3x14[] = {
  // 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_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 _ZTI5E3x14[];
extern void _ZN5E3x143fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv)();
extern void ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn16_N5E3x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E3x14[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x14[0]),
  (VTBL_ENTRY)&_ZN5E3x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E3x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv),
};
extern VTBL_ENTRY _ZTV5E3x14[];
static  VTBL_ENTRY _tg__ZTV2C3__5E3x14[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__5E3x14[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E3x14[] = {
  {&(_ZTV5E3x14[4]),  4,9},
  {&(_tg__ZTV2C3__5E3x14[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__5E3x14[3]),  3,4},
  {&(_ZTV5E3x14[8]),  8,9},
};
extern VTBL_ENTRY _ZTI5E3x14[];
extern  VTBL_ENTRY _ZTV5E3x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x14[];
static VTBL_ENTRY alt_thunk_names386[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn16_N5E3x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E3x14 = {  "E3x14", // class name
  bases_E3x14, 4,
  &(vtc_E3x14[0]), // expected_vtbl_contents
  &(vtt_E3x14[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E3x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E3x14),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E3x14),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names386,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x14y0  : E3x14 , F1 {
  int ff;
  ~G3x14y0(); // tgen
  G3x14y0(); // tgen
};
//SIG(1 G3x14y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G3x14y0 ::~G3x14y0(){ note_dtor("G3x14y0", this);} // tgen
G3x14y0 ::G3x14y0(){ note_ctor("G3x14y0", this);} // tgen

static void Test_G3x14y0()
{
  extern Class_Descriptor cd_G3x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x14y0, buf);
    G3x14y0 *dp, &lv = *(dp=new (buf) G3x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x14y0)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x14*), ABISELECT(40,28), "G3x14y0");
    check_base_class_offset(lv, (B0*)(C3*)(E3x14*), ABISELECT(8,4), "G3x14y0");
    check_base_class_offset(lv, (C3*)(E3x14*), 0, "G3x14y0");
    check_base_class_offset(lv, (D0*)(E3x14*), ABISELECT(52,36), "G3x14y0");
    check_base_class_offset(lv, (E3x14*), 0, "G3x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G3x14y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G3x14y0.ff");
    test_class_info(&lv, &cd_G3x14y0);
    dp->~G3x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x14y0(Test_G3x14y0, "G3x14y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G3x14y0C1Ev();
extern void _ZN7G3x14y0D1Ev();
Name_Map name_map_G3x14y0[] = {
  NSPAIR(_ZN7G3x14y0C1Ev),
  NSPAIR(_ZN7G3x14y0D1Ev),
  {0,0}
};
extern Class_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_E3x14;
extern VTBL_ENTRY _ZTI5E3x14[];
extern  VTBL_ENTRY _ZTV5E3x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x14y0[] = {
  // 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_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_E3x14,    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 _ZTI7G3x14y0[];
extern void _ZN5E3x143fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv)();
extern void ABISELECT(_ZThn40_N5E3x143fooEv,_ZThn28_N5E3x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x14y0[0]),
  (VTBL_ENTRY)&_ZN5E3x143fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G3x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G3x14y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv),
};
extern VTBL_ENTRY _ZTV7G3x14y0[];
extern void _ZN5E3x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x14__7G3x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x14[0]),
  (VTBL_ENTRY)&_ZN5E3x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C35E3x14__7G3x14y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C35E3x14__7G3x14y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv)();
extern void ABISELECT(_ZThn40_N5E3x143fooEv,_ZThn28_N5E3x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x14__7G3x14y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E3x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv),
};
static  VTT_ENTRY vtt_G3x14y0[] = {
  {&(_ZTV7G3x14y0[4]),  4,12},
  {&(_tg__ZTV5E3x14__7G3x14y0[4]),  4,5},
  {&(_tg__ZTV2C35E3x14__7G3x14y0[3]),  3,3},
  {&(_tg__ZTV2A1__2C35E3x14__7G3x14y0[3]),  3,4},
  {&(_tg__ZTV2A1__5E3x14__7G3x14y0[3]),  3,4},
  {&(_ZTV7G3x14y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G3x14y0[];
extern  VTBL_ENTRY _ZTV7G3x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x14y0[];
static VTBL_ENTRY alt_thunk_names387[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E3x143fooEv,_ZThn28_N5E3x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E3x143fooEv,_ZThn28_N5E3x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x14y0 = {  "G3x14y0", // class name
  bases_G3x14y0, 6,
  &(vtc_G3x14y0[0]), // expected_vtbl_contents
  &(vtt_G3x14y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G3x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x14y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x14y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names387,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x14y1  : virtual E3x14 , F1 {
  int ff;
  ~G3x14y1(); // tgen
  G3x14y1(); // tgen
};
//SIG(1 G3x14y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G3x14y1 ::~G3x14y1(){ note_dtor("G3x14y1", this);} // tgen
G3x14y1 ::G3x14y1(){ note_ctor("G3x14y1", this);} // tgen

static void Test_G3x14y1()
{
  extern Class_Descriptor cd_G3x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x14y1, buf);
    G3x14y1 *dp, &lv = *(dp=new (buf) G3x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x14y1)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x14*), ABISELECT(40,28), "G3x14y1");
    check_base_class_offset(lv, (B0*)(C3*)(E3x14*), ABISELECT(24,16), "G3x14y1");
    check_base_class_offset(lv, (C3*)(E3x14*), ABISELECT(16,12), "G3x14y1");
    check_base_class_offset(lv, (D0*)(E3x14*), ABISELECT(52,36), "G3x14y1");
    check_base_class_offset(lv, (E3x14*), ABISELECT(16,12), "G3x14y1");
    check_base_class_offset(lv, (F1*), 0, "G3x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x14y1.ff");
    test_class_info(&lv, &cd_G3x14y1);
    dp->~G3x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x14y1(Test_G3x14y1, "G3x14y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G3x14y1C1Ev();
extern void _ZN7G3x14y1D1Ev();
Name_Map name_map_G3x14y1[] = {
  NSPAIR(_ZN7G3x14y1C1Ev),
  NSPAIR(_ZN7G3x14y1D1Ev),
  {0,0}
};
extern Class_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_E3x14;
extern VTBL_ENTRY _ZTI5E3x14[];
extern  VTBL_ENTRY _ZTV5E3x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x14y1[] = {
  // 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_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_E3x14,    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 _ZTI7G3x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E3x143fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv)();
extern void ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn16_N5E3x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x14y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G3x14y1[0]),
  (VTBL_ENTRY)&_ZN5E3x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G3x14y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv),
};
extern VTBL_ENTRY _ZTV7G3x14y1[];
extern void _ZN5E3x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x14__7G3x14y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x14[0]),
  (VTBL_ENTRY)&_ZN5E3x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C35E3x14__7G3x14y1[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C35E3x14__7G3x14y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv)();
extern void ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn16_N5E3x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x14__7G3x14y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E3x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv),
};
static  VTT_ENTRY vtt_G3x14y1[] = {
  {&(_ZTV7G3x14y1[5]),  5,16},
  {&(_ZTV7G3x14y1[11]),  11,16},
  {&(_ZTV7G3x14y1[15]),  15,16},
  {&(_tg__ZTV5E3x14__7G3x14y1[4]),  4,5},
  {&(_tg__ZTV2C35E3x14__7G3x14y1[3]),  3,3},
  {&(_tg__ZTV2A1__2C35E3x14__7G3x14y1[3]),  3,4},
  {&(_tg__ZTV2A1__5E3x14__7G3x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x14y1[];
extern  VTBL_ENTRY _ZTV7G3x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x14y1[];
static VTBL_ENTRY alt_thunk_names388[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn16_N5E3x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn16_N5E3x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x14y1 = {  "G3x14y1", // class name
  bases_G3x14y1, 6,
  &(vtc_G3x14y1[0]), // expected_vtbl_contents
  &(vtt_G3x14y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G3x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x14y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x14y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names388,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x14y2  : E3x14 , virtual F1 {
  int ff;
  ~G3x14y2(); // tgen
  G3x14y2(); // tgen
};
//SIG(1 G3x14y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G3x14y2 ::~G3x14y2(){ note_dtor("G3x14y2", this);} // tgen
G3x14y2 ::G3x14y2(){ note_ctor("G3x14y2", this);} // tgen

static void Test_G3x14y2()
{
  extern Class_Descriptor cd_G3x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x14y2, buf);
    G3x14y2 *dp, &lv = *(dp=new (buf) G3x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x14y2)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x14*), ABISELECT(24,20), "G3x14y2");
    check_base_class_offset(lv, (B0*)(C3*)(E3x14*), ABISELECT(8,4), "G3x14y2");
    check_base_class_offset(lv, (C3*)(E3x14*), 0, "G3x14y2");
    check_base_class_offset(lv, (D0*)(E3x14*), ABISELECT(36,28), "G3x14y2");
    check_base_class_offset(lv, (E3x14*), 0, "G3x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G3x14y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G3x14y2.ff");
    test_class_info(&lv, &cd_G3x14y2);
    dp->~G3x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x14y2(Test_G3x14y2, "G3x14y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G3x14y2C1Ev();
extern void _ZN7G3x14y2D1Ev();
Name_Map name_map_G3x14y2[] = {
  NSPAIR(_ZN7G3x14y2C1Ev),
  NSPAIR(_ZN7G3x14y2D1Ev),
  {0,0}
};
extern Class_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_E3x14;
extern VTBL_ENTRY _ZTI5E3x14[];
extern  VTBL_ENTRY _ZTV5E3x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x14y2[] = {
  // 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_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_E3x14,    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 _ZTI7G3x14y2[];
extern void _ZN5E3x143fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv)();
extern void ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn20_N5E3x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G3x14y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x14y2[0]),
  (VTBL_ENTRY)&_ZN5E3x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G3x14y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G3x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G3x14y2[];
extern void _ZN5E3x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x14__7G3x14y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x14[0]),
  (VTBL_ENTRY)&_ZN5E3x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C35E3x14__7G3x14y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C35E3x14__7G3x14y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv)();
extern void ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn20_N5E3x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x14__7G3x14y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E3x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv),
};
static  VTT_ENTRY vtt_G3x14y2[] = {
  {&(_ZTV7G3x14y2[5]),  5,14},
  {&(_tg__ZTV5E3x14__7G3x14y2[4]),  4,5},
  {&(_tg__ZTV2C35E3x14__7G3x14y2[3]),  3,3},
  {&(_tg__ZTV2A1__2C35E3x14__7G3x14y2[3]),  3,4},
  {&(_tg__ZTV2A1__5E3x14__7G3x14y2[3]),  3,4},
  {&(_ZTV7G3x14y2[9]),  9,14},
  {&(_ZTV7G3x14y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI7G3x14y2[];
extern  VTBL_ENTRY _ZTV7G3x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x14y2[];
static VTBL_ENTRY alt_thunk_names389[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn20_N5E3x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn20_N5E3x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x14y2 = {  "G3x14y2", // class name
  bases_G3x14y2, 6,
  &(vtc_G3x14y2[0]), // expected_vtbl_contents
  &(vtt_G3x14y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G3x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x14y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x14y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names389,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x14y3  : virtual E3x14 , virtual F1 {
  int ff;
  ~G3x14y3(); // tgen
  G3x14y3(); // tgen
};
//SIG(1 G3x14y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G3x14y3 ::~G3x14y3(){ note_dtor("G3x14y3", this);} // tgen
G3x14y3 ::G3x14y3(){ note_ctor("G3x14y3", this);} // tgen

static void Test_G3x14y3()
{
  extern Class_Descriptor cd_G3x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G3x14y3, buf);
    G3x14y3 *dp, &lv = *(dp=new (buf) G3x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G3x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x14y3)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x14*), ABISELECT(40,24), "G3x14y3");
    check_base_class_offset(lv, (B0*)(C3*)(E3x14*), ABISELECT(24,12), "G3x14y3");
    check_base_class_offset(lv, (C3*)(E3x14*), ABISELECT(16,8), "G3x14y3");
    check_base_class_offset(lv, (D0*)(E3x14*), ABISELECT(52,32), "G3x14y3");
    check_base_class_offset(lv, (E3x14*), ABISELECT(16,8), "G3x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G3x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G3x14y3.ff");
    test_class_info(&lv, &cd_G3x14y3);
    dp->~G3x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x14y3(Test_G3x14y3, "G3x14y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G3x14y3C1Ev();
extern void _ZN7G3x14y3D1Ev();
Name_Map name_map_G3x14y3[] = {
  NSPAIR(_ZN7G3x14y3C1Ev),
  NSPAIR(_ZN7G3x14y3D1Ev),
  {0,0}
};
extern Class_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_E3x14;
extern VTBL_ENTRY _ZTI5E3x14[];
extern  VTBL_ENTRY _ZTV5E3x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x14y3[] = {
  // 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_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_E3x14,    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 _ZTI7G3x14y3[];
extern void _ZN5E3x143fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv)();
extern void ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn16_N5E3x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G3x14y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x14y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G3x14y3[0]),
  (VTBL_ENTRY)&_ZN5E3x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G3x14y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G3x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G3x14y3[];
extern void _ZN5E3x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x14__7G3x14y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x14[0]),
  (VTBL_ENTRY)&_ZN5E3x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C35E3x14__7G3x14y3[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C35E3x14__7G3x14y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv)();
extern void ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn16_N5E3x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x14__7G3x14y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E3x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv),
};
static  VTT_ENTRY vtt_G3x14y3[] = {
  {&(_ZTV7G3x14y3[6]),  6,20},
  {&(_ZTV7G3x14y3[11]),  11,20},
  {&(_ZTV7G3x14y3[15]),  15,20},
  {&(_ZTV7G3x14y3[19]),  19,20},
  {&(_tg__ZTV5E3x14__7G3x14y3[4]),  4,5},
  {&(_tg__ZTV2C35E3x14__7G3x14y3[3]),  3,3},
  {&(_tg__ZTV2A1__2C35E3x14__7G3x14y3[3]),  3,4},
  {&(_tg__ZTV2A1__5E3x14__7G3x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x14y3[];
extern  VTBL_ENTRY _ZTV7G3x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x14y3[];
static VTBL_ENTRY alt_thunk_names390[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn16_N5E3x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn16_N5E3x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x14y3 = {  "G3x14y3", // class name
  bases_G3x14y3, 6,
  &(vtc_G3x14y3[0]), // expected_vtbl_contents
  &(vtt_G3x14y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G3x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x14y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x14y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names390,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x14y4  : E3x14 , F0 {
  int ff;
  ~G3x14y4(); // tgen
  G3x14y4(); // tgen
};
//SIG(1 G3x14y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G3x14y4 ::~G3x14y4(){ note_dtor("G3x14y4", this);} // tgen
G3x14y4 ::G3x14y4(){ note_ctor("G3x14y4", this);} // tgen

static void Test_G3x14y4()
{
  extern Class_Descriptor cd_G3x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G3x14y4, buf);
    G3x14y4 *dp, &lv = *(dp=new (buf) G3x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G3x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x14y4)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x14*), ABISELECT(32,24), "G3x14y4");
    check_base_class_offset(lv, (B0*)(C3*)(E3x14*), ABISELECT(8,4), "G3x14y4");
    check_base_class_offset(lv, (C3*)(E3x14*), 0, "G3x14y4");
    check_base_class_offset(lv, (D0*)(E3x14*), ABISELECT(44,32), "G3x14y4");
    check_base_class_offset(lv, (E3x14*), 0, "G3x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G3x14y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G3x14y4.ff");
    test_class_info(&lv, &cd_G3x14y4);
    dp->~G3x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x14y4(Test_G3x14y4, "G3x14y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G3x14y4C1Ev();
extern void _ZN7G3x14y4D1Ev();
Name_Map name_map_G3x14y4[] = {
  NSPAIR(_ZN7G3x14y4C1Ev),
  NSPAIR(_ZN7G3x14y4D1Ev),
  {0,0}
};
extern Class_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_E3x14;
extern VTBL_ENTRY _ZTI5E3x14[];
extern  VTBL_ENTRY _ZTV5E3x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x14y4[] = {
  // 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_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_E3x14,    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 _ZTI7G3x14y4[];
extern void _ZN5E3x143fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv)();
extern void ABISELECT(_ZThn32_N5E3x143fooEv,_ZThn24_N5E3x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x14y4[0]),
  (VTBL_ENTRY)&_ZN5E3x143fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G3x14y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv),
};
extern VTBL_ENTRY _ZTV7G3x14y4[];
extern void _ZN5E3x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x14__7G3x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x14[0]),
  (VTBL_ENTRY)&_ZN5E3x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C35E3x14__7G3x14y4[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C35E3x14__7G3x14y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv)();
extern void ABISELECT(_ZThn32_N5E3x143fooEv,_ZThn24_N5E3x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x14__7G3x14y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E3x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv),
};
static  VTT_ENTRY vtt_G3x14y4[] = {
  {&(_ZTV7G3x14y4[4]),  4,9},
  {&(_tg__ZTV5E3x14__7G3x14y4[4]),  4,5},
  {&(_tg__ZTV2C35E3x14__7G3x14y4[3]),  3,3},
  {&(_tg__ZTV2A1__2C35E3x14__7G3x14y4[3]),  3,4},
  {&(_tg__ZTV2A1__5E3x14__7G3x14y4[3]),  3,4},
  {&(_ZTV7G3x14y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G3x14y4[];
extern  VTBL_ENTRY _ZTV7G3x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x14y4[];
static VTBL_ENTRY alt_thunk_names391[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x143fooEv,_ZThn24_N5E3x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x143fooEv,_ZThn24_N5E3x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x14y4 = {  "G3x14y4", // class name
  bases_G3x14y4, 6,
  &(vtc_G3x14y4[0]), // expected_vtbl_contents
  &(vtt_G3x14y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G3x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x14y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x14y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names391,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x14y5  : virtual E3x14 , F0 {
  int ff;
  ~G3x14y5(); // tgen
  G3x14y5(); // tgen
};
//SIG(1 G3x14y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G3x14y5 ::~G3x14y5(){ note_dtor("G3x14y5", this);} // tgen
G3x14y5 ::G3x14y5(){ note_ctor("G3x14y5", this);} // tgen

static void Test_G3x14y5()
{
  extern Class_Descriptor cd_G3x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x14y5, buf);
    G3x14y5 *dp, &lv = *(dp=new (buf) G3x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x14y5)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x14*), ABISELECT(40,28), "G3x14y5");
    check_base_class_offset(lv, (B0*)(C3*)(E3x14*), ABISELECT(24,16), "G3x14y5");
    check_base_class_offset(lv, (C3*)(E3x14*), ABISELECT(16,12), "G3x14y5");
    check_base_class_offset(lv, (D0*)(E3x14*), ABISELECT(52,36), "G3x14y5");
    check_base_class_offset(lv, (E3x14*), ABISELECT(16,12), "G3x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G3x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x14y5.ff");
    test_class_info(&lv, &cd_G3x14y5);
    dp->~G3x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x14y5(Test_G3x14y5, "G3x14y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G3x14y5C1Ev();
extern void _ZN7G3x14y5D1Ev();
Name_Map name_map_G3x14y5[] = {
  NSPAIR(_ZN7G3x14y5C1Ev),
  NSPAIR(_ZN7G3x14y5D1Ev),
  {0,0}
};
extern Class_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_E3x14;
extern VTBL_ENTRY _ZTI5E3x14[];
extern  VTBL_ENTRY _ZTV5E3x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x14y5[] = {
  // 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_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_E3x14,    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 _ZTI7G3x14y5[];
extern void _ZN5E3x143fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv)();
extern void ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn16_N5E3x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x14y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x14y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G3x14y5[0]),
  (VTBL_ENTRY)&_ZN5E3x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G3x14y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv),
};
extern VTBL_ENTRY _ZTV7G3x14y5[];
extern void _ZN5E3x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x14__7G3x14y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x14[0]),
  (VTBL_ENTRY)&_ZN5E3x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C35E3x14__7G3x14y5[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C35E3x14__7G3x14y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv)();
extern void ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn16_N5E3x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x14__7G3x14y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E3x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv),
};
static  VTT_ENTRY vtt_G3x14y5[] = {
  {&(_ZTV7G3x14y5[5]),  5,15},
  {&(_ZTV7G3x14y5[10]),  10,15},
  {&(_ZTV7G3x14y5[14]),  14,15},
  {&(_tg__ZTV5E3x14__7G3x14y5[4]),  4,5},
  {&(_tg__ZTV2C35E3x14__7G3x14y5[3]),  3,3},
  {&(_tg__ZTV2A1__2C35E3x14__7G3x14y5[3]),  3,4},
  {&(_tg__ZTV2A1__5E3x14__7G3x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x14y5[];
extern  VTBL_ENTRY _ZTV7G3x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x14y5[];
static VTBL_ENTRY alt_thunk_names392[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn16_N5E3x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn16_N5E3x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x14y5 = {  "G3x14y5", // class name
  bases_G3x14y5, 6,
  &(vtc_G3x14y5[0]), // expected_vtbl_contents
  &(vtt_G3x14y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G3x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x14y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x14y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names392,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x14y6  : E3x14 , virtual F0 {
  int ff;
  ~G3x14y6(); // tgen
  G3x14y6(); // tgen
};
//SIG(1 G3x14y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G3x14y6 ::~G3x14y6(){ note_dtor("G3x14y6", this);} // tgen
G3x14y6 ::G3x14y6(){ note_ctor("G3x14y6", this);} // tgen

static void Test_G3x14y6()
{
  extern Class_Descriptor cd_G3x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G3x14y6, buf);
    G3x14y6 *dp, &lv = *(dp=new (buf) G3x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G3x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x14y6)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x14*), ABISELECT(24,20), "G3x14y6");
    check_base_class_offset(lv, (B0*)(C3*)(E3x14*), ABISELECT(8,4), "G3x14y6");
    check_base_class_offset(lv, (C3*)(E3x14*), 0, "G3x14y6");
    check_base_class_offset(lv, (D0*)(E3x14*), ABISELECT(36,28), "G3x14y6");
    check_base_class_offset(lv, (E3x14*), 0, "G3x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G3x14y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G3x14y6.ff");
    test_class_info(&lv, &cd_G3x14y6);
    dp->~G3x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x14y6(Test_G3x14y6, "G3x14y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G3x14y6C1Ev();
extern void _ZN7G3x14y6D1Ev();
Name_Map name_map_G3x14y6[] = {
  NSPAIR(_ZN7G3x14y6C1Ev),
  NSPAIR(_ZN7G3x14y6D1Ev),
  {0,0}
};
extern Class_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_E3x14;
extern VTBL_ENTRY _ZTI5E3x14[];
extern  VTBL_ENTRY _ZTV5E3x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x14y6[] = {
  // 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_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_E3x14,    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 _ZTI7G3x14y6[];
extern void _ZN5E3x143fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv)();
extern void ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn20_N5E3x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x14y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x14y6[0]),
  (VTBL_ENTRY)&_ZN5E3x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G3x14y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv),
};
extern VTBL_ENTRY _ZTV7G3x14y6[];
extern void _ZN5E3x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x14__7G3x14y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x14[0]),
  (VTBL_ENTRY)&_ZN5E3x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C35E3x14__7G3x14y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C35E3x14__7G3x14y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv)();
extern void ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn20_N5E3x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x14__7G3x14y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E3x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv),
};
static  VTT_ENTRY vtt_G3x14y6[] = {
  {&(_ZTV7G3x14y6[5]),  5,10},
  {&(_tg__ZTV5E3x14__7G3x14y6[4]),  4,5},
  {&(_tg__ZTV2C35E3x14__7G3x14y6[3]),  3,3},
  {&(_tg__ZTV2A1__2C35E3x14__7G3x14y6[3]),  3,4},
  {&(_tg__ZTV2A1__5E3x14__7G3x14y6[3]),  3,4},
  {&(_ZTV7G3x14y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G3x14y6[];
extern  VTBL_ENTRY _ZTV7G3x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x14y6[];
static VTBL_ENTRY alt_thunk_names393[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn20_N5E3x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn20_N5E3x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x14y6 = {  "G3x14y6", // class name
  bases_G3x14y6, 6,
  &(vtc_G3x14y6[0]), // expected_vtbl_contents
  &(vtt_G3x14y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G3x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x14y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x14y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names393,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x14y7  : virtual E3x14 , virtual F0 {
  int ff;
  ~G3x14y7(); // tgen
  G3x14y7(); // tgen
};
//SIG(1 G3x14y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G3x14y7 ::~G3x14y7(){ note_dtor("G3x14y7", this);} // tgen
G3x14y7 ::G3x14y7(){ note_ctor("G3x14y7", this);} // tgen

static void Test_G3x14y7()
{
  extern Class_Descriptor cd_G3x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G3x14y7, buf);
    G3x14y7 *dp, &lv = *(dp=new (buf) G3x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G3x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x14y7)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x14*), ABISELECT(40,24), "G3x14y7");
    check_base_class_offset(lv, (B0*)(C3*)(E3x14*), ABISELECT(24,12), "G3x14y7");
    check_base_class_offset(lv, (C3*)(E3x14*), ABISELECT(16,8), "G3x14y7");
    check_base_class_offset(lv, (D0*)(E3x14*), ABISELECT(52,32), "G3x14y7");
    check_base_class_offset(lv, (E3x14*), ABISELECT(16,8), "G3x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G3x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G3x14y7.ff");
    test_class_info(&lv, &cd_G3x14y7);
    dp->~G3x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x14y7(Test_G3x14y7, "G3x14y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G3x14y7C1Ev();
extern void _ZN7G3x14y7D1Ev();
Name_Map name_map_G3x14y7[] = {
  NSPAIR(_ZN7G3x14y7C1Ev),
  NSPAIR(_ZN7G3x14y7D1Ev),
  {0,0}
};
extern Class_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_E3x14;
extern VTBL_ENTRY _ZTI5E3x14[];
extern  VTBL_ENTRY _ZTV5E3x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x14y7[] = {
  // 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_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_E3x14,    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 _ZTI7G3x14y7[];
extern void _ZN5E3x143fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv)();
extern void ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn16_N5E3x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x14y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x14y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G3x14y7[0]),
  (VTBL_ENTRY)&_ZN5E3x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G3x14y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv),
};
extern VTBL_ENTRY _ZTV7G3x14y7[];
extern void _ZN5E3x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x14__7G3x14y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x14[0]),
  (VTBL_ENTRY)&_ZN5E3x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C35E3x14__7G3x14y7[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C35E3x14__7G3x14y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv)();
extern void ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn16_N5E3x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x14__7G3x14y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E3x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv),
};
static  VTT_ENTRY vtt_G3x14y7[] = {
  {&(_ZTV7G3x14y7[6]),  6,16},
  {&(_ZTV7G3x14y7[11]),  11,16},
  {&(_ZTV7G3x14y7[15]),  15,16},
  {&(_tg__ZTV5E3x14__7G3x14y7[4]),  4,5},
  {&(_tg__ZTV2C35E3x14__7G3x14y7[3]),  3,3},
  {&(_tg__ZTV2A1__2C35E3x14__7G3x14y7[3]),  3,4},
  {&(_tg__ZTV2A1__5E3x14__7G3x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x14y7[];
extern  VTBL_ENTRY _ZTV7G3x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x14y7[];
static VTBL_ENTRY alt_thunk_names394[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x143fooEv,_ZTv0_n12_N5E3x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn16_N5E3x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E3x143fooEv,_ZThn16_N5E3x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x14y7 = {  "G3x14y7", // class name
  bases_G3x14y7, 6,
  &(vtc_G3x14y7[0]), // expected_vtbl_contents
  &(vtt_G3x14y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G3x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x14y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x14y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names394,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E4x14  : C4 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E4x143fooEv
  ~E4x14(); // tgen
  E4x14(); // tgen
};
//SIG(-1 E4x14) C1{ BC2{ BC3{ Fi} BC4{ v1 Fi} Fi} VBC5{ Fi} v1 Fi}


void  E4x14 ::foo(){vfunc_called(this, "_ZN5E4x143fooEv");}
E4x14 ::~E4x14(){ note_dtor("E4x14", this);} // tgen
E4x14 ::E4x14(){ note_ctor("E4x14", this);} // tgen

static void Test_E4x14()
{
  extern Class_Descriptor cd_E4x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E4x14, buf);
    E4x14 *dp, &lv = *(dp=new (buf) E4x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E4x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E4x14)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(12,8), "E4x14");
    check_base_class_offset(lv, (B1*)(C4*), 0, "E4x14");
    check_base_class_offset(lv, (C4*), 0, "E4x14");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E4x14");
    check_field_offset(lv, fd, ABISELECT(20,16), "E4x14.fd");
    test_class_info(&lv, &cd_E4x14);
    dp->~E4x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE4x14(Test_E4x14, "E4x14", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E4x14C1Ev();
extern void _ZN5E4x14D1Ev();
Name_Map name_map_E4x14[] = {
  NSPAIR(_ZN5E4x14C1Ev),
  NSPAIR(_ZN5E4x14D1Ev),
  {0,0}
};
extern Class_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_E4x14[] = {
  // 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 _ZTI5E4x14[];
extern void _ZN5E4x143fooEv();
static  VTBL_ENTRY vtc_E4x14[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x14[0]),
  (VTBL_ENTRY)&_ZN5E4x143fooEv,
};
extern VTBL_ENTRY _ZTV5E4x14[];
static  VTT_ENTRY vtt_E4x14[] = {
  {&(_ZTV5E4x14[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E4x14[];
extern  VTBL_ENTRY _ZTV5E4x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x14[];
Class_Descriptor cd_E4x14 = {  "E4x14", // class name
  bases_E4x14, 4,
  &(vtc_E4x14[0]), // expected_vtbl_contents
  &(vtt_E4x14[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E4x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E4x14),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E4x14),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  G4x14y0  : E4x14 , F1 {
  int ff;
  ~G4x14y0(); // tgen
  G4x14y0(); // tgen
};
//SIG(1 G4x14y0) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G4x14y0 ::~G4x14y0(){ note_dtor("G4x14y0", this);} // tgen
G4x14y0 ::G4x14y0(){ note_ctor("G4x14y0", this);} // tgen

static void Test_G4x14y0()
{
  extern Class_Descriptor cd_G4x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x14y0, buf);
    G4x14y0 *dp, &lv = *(dp=new (buf) G4x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x14y0)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x14*), ABISELECT(12,8), "G4x14y0");
    check_base_class_offset(lv, (B1*)(C4*)(E4x14*), 0, "G4x14y0");
    check_base_class_offset(lv, (C4*)(E4x14*), 0, "G4x14y0");
    check_base_class_offset(lv, (D0*)(E4x14*), ABISELECT(40,32), "G4x14y0");
    check_base_class_offset(lv, (E4x14*), 0, "G4x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G4x14y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G4x14y0.ff");
    test_class_info(&lv, &cd_G4x14y0);
    dp->~G4x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x14y0(Test_G4x14y0, "G4x14y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G4x14y0C1Ev();
extern void _ZN7G4x14y0D1Ev();
Name_Map name_map_G4x14y0[] = {
  NSPAIR(_ZN7G4x14y0C1Ev),
  NSPAIR(_ZN7G4x14y0D1Ev),
  {0,0}
};
extern Class_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_E4x14;
extern VTBL_ENTRY _ZTI5E4x14[];
extern  VTBL_ENTRY _ZTV5E4x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x14y0[] = {
  // 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_E4x14,    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 _ZTI7G4x14y0[];
extern void _ZN5E4x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x14y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x14y0[0]),
  (VTBL_ENTRY)&_ZN5E4x143fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G4x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G4x14y0[];
extern void _ZN5E4x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x14__7G4x14y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x14[0]),
  (VTBL_ENTRY)&_ZN5E4x143fooEv,
};
static  VTT_ENTRY vtt_G4x14y0[] = {
  {&(_ZTV7G4x14y0[3]),  3,7},
  {&(_tg__ZTV5E4x14__7G4x14y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G4x14y0[];
extern  VTBL_ENTRY _ZTV7G4x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x14y0[];
Class_Descriptor cd_G4x14y0 = {  "G4x14y0", // class name
  bases_G4x14y0, 6,
  &(vtc_G4x14y0[0]), // expected_vtbl_contents
  &(vtt_G4x14y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G4x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x14y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x14y0),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  G4x14y1  : virtual E4x14 , F1 {
  int ff;
  ~G4x14y1(); // tgen
  G4x14y1(); // tgen
};
//SIG(1 G4x14y1) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G4x14y1 ::~G4x14y1(){ note_dtor("G4x14y1", this);} // tgen
G4x14y1 ::G4x14y1(){ note_ctor("G4x14y1", this);} // tgen

static void Test_G4x14y1()
{
  extern Class_Descriptor cd_G4x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x14y1, buf);
    G4x14y1 *dp, &lv = *(dp=new (buf) G4x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x14y1)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x14*), ABISELECT(28,20), "G4x14y1");
    check_base_class_offset(lv, (B1*)(C4*)(E4x14*), ABISELECT(16,12), "G4x14y1");
    check_base_class_offset(lv, (C4*)(E4x14*), ABISELECT(16,12), "G4x14y1");
    check_base_class_offset(lv, (D0*)(E4x14*), ABISELECT(40,32), "G4x14y1");
    check_base_class_offset(lv, (E4x14*), ABISELECT(16,12), "G4x14y1");
    check_base_class_offset(lv, (F1*), 0, "G4x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x14y1.ff");
    test_class_info(&lv, &cd_G4x14y1);
    dp->~G4x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x14y1(Test_G4x14y1, "G4x14y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G4x14y1C1Ev();
extern void _ZN7G4x14y1D1Ev();
Name_Map name_map_G4x14y1[] = {
  NSPAIR(_ZN7G4x14y1C1Ev),
  NSPAIR(_ZN7G4x14y1D1Ev),
  {0,0}
};
extern Class_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_E4x14;
extern VTBL_ENTRY _ZTI5E4x14[];
extern  VTBL_ENTRY _ZTV5E4x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x14y1[] = {
  // 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_E4x14,    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 _ZTI7G4x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E4x143fooEv();
static  VTBL_ENTRY vtc_G4x14y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G4x14y1[0]),
  (VTBL_ENTRY)&_ZN5E4x143fooEv,
};
extern VTBL_ENTRY _ZTV7G4x14y1[];
extern void _ZN5E4x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x14__7G4x14y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x14[0]),
  (VTBL_ENTRY)&_ZN5E4x143fooEv,
};
static  VTT_ENTRY vtt_G4x14y1[] = {
  {&(_ZTV7G4x14y1[4]),  4,10},
  {&(_ZTV7G4x14y1[9]),  9,10},
  {&(_tg__ZTV5E4x14__7G4x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G4x14y1[];
extern  VTBL_ENTRY _ZTV7G4x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x14y1[];
Class_Descriptor cd_G4x14y1 = {  "G4x14y1", // class name
  bases_G4x14y1, 6,
  &(vtc_G4x14y1[0]), // expected_vtbl_contents
  &(vtt_G4x14y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G4x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x14y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x14y1),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  G4x14y2  : E4x14 , virtual F1 {
  int ff;
  ~G4x14y2(); // tgen
  G4x14y2(); // tgen
};
//SIG(1 G4x14y2) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G4x14y2 ::~G4x14y2(){ note_dtor("G4x14y2", this);} // tgen
G4x14y2 ::G4x14y2(){ note_ctor("G4x14y2", this);} // tgen

static void Test_G4x14y2()
{
  extern Class_Descriptor cd_G4x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x14y2, buf);
    G4x14y2 *dp, &lv = *(dp=new (buf) G4x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x14y2)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x14*), ABISELECT(12,8), "G4x14y2");
    check_base_class_offset(lv, (B1*)(C4*)(E4x14*), 0, "G4x14y2");
    check_base_class_offset(lv, (C4*)(E4x14*), 0, "G4x14y2");
    check_base_class_offset(lv, (D0*)(E4x14*), ABISELECT(28,24), "G4x14y2");
    check_base_class_offset(lv, (E4x14*), 0, "G4x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G4x14y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G4x14y2.ff");
    test_class_info(&lv, &cd_G4x14y2);
    dp->~G4x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x14y2(Test_G4x14y2, "G4x14y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G4x14y2C1Ev();
extern void _ZN7G4x14y2D1Ev();
Name_Map name_map_G4x14y2[] = {
  NSPAIR(_ZN7G4x14y2C1Ev),
  NSPAIR(_ZN7G4x14y2D1Ev),
  {0,0}
};
extern Class_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_E4x14;
extern VTBL_ENTRY _ZTI5E4x14[];
extern  VTBL_ENTRY _ZTV5E4x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x14y2[] = {
  // 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_E4x14,    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 _ZTI7G4x14y2[];
extern void _ZN5E4x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x14y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x14y2[0]),
  (VTBL_ENTRY)&_ZN5E4x143fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G4x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G4x14y2[];
extern void _ZN5E4x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x14__7G4x14y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x14[0]),
  (VTBL_ENTRY)&_ZN5E4x143fooEv,
};
static  VTT_ENTRY vtt_G4x14y2[] = {
  {&(_ZTV7G4x14y2[4]),  4,9},
  {&(_tg__ZTV5E4x14__7G4x14y2[3]),  3,4},
  {&(_ZTV7G4x14y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G4x14y2[];
extern  VTBL_ENTRY _ZTV7G4x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x14y2[];
Class_Descriptor cd_G4x14y2 = {  "G4x14y2", // class name
  bases_G4x14y2, 6,
  &(vtc_G4x14y2[0]), // expected_vtbl_contents
  &(vtt_G4x14y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G4x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x14y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x14y2),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  G4x14y3  : virtual E4x14 , virtual F1 {
  int ff;
  ~G4x14y3(); // tgen
  G4x14y3(); // tgen
};
//SIG(1 G4x14y3) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G4x14y3 ::~G4x14y3(){ note_dtor("G4x14y3", this);} // tgen
G4x14y3 ::G4x14y3(){ note_ctor("G4x14y3", this);} // tgen

static void Test_G4x14y3()
{
  extern Class_Descriptor cd_G4x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G4x14y3, buf);
    G4x14y3 *dp, &lv = *(dp=new (buf) G4x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G4x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x14y3)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x14*), ABISELECT(28,16), "G4x14y3");
    check_base_class_offset(lv, (B1*)(C4*)(E4x14*), ABISELECT(16,8), "G4x14y3");
    check_base_class_offset(lv, (C4*)(E4x14*), ABISELECT(16,8), "G4x14y3");
    check_base_class_offset(lv, (D0*)(E4x14*), ABISELECT(40,28), "G4x14y3");
    check_base_class_offset(lv, (E4x14*), ABISELECT(16,8), "G4x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G4x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G4x14y3.ff");
    test_class_info(&lv, &cd_G4x14y3);
    dp->~G4x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x14y3(Test_G4x14y3, "G4x14y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G4x14y3C1Ev();
extern void _ZN7G4x14y3D1Ev();
Name_Map name_map_G4x14y3[] = {
  NSPAIR(_ZN7G4x14y3C1Ev),
  NSPAIR(_ZN7G4x14y3D1Ev),
  {0,0}
};
extern Class_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_E4x14;
extern VTBL_ENTRY _ZTI5E4x14[];
extern  VTBL_ENTRY _ZTV5E4x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x14y3[] = {
  // 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_E4x14,    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 _ZTI7G4x14y3[];
extern void _ZN5E4x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x14y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x14y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G4x14y3[0]),
  (VTBL_ENTRY)&_ZN5E4x143fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G4x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G4x14y3[];
extern void _ZN5E4x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x14__7G4x14y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x14[0]),
  (VTBL_ENTRY)&_ZN5E4x143fooEv,
};
static  VTT_ENTRY vtt_G4x14y3[] = {
  {&(_ZTV7G4x14y3[5]),  5,14},
  {&(_ZTV7G4x14y3[9]),  9,14},
  {&(_ZTV7G4x14y3[13]),  13,14},
  {&(_tg__ZTV5E4x14__7G4x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G4x14y3[];
extern  VTBL_ENTRY _ZTV7G4x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x14y3[];
Class_Descriptor cd_G4x14y3 = {  "G4x14y3", // class name
  bases_G4x14y3, 6,
  &(vtc_G4x14y3[0]), // expected_vtbl_contents
  &(vtt_G4x14y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G4x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x14y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x14y3),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  G4x14y4  : E4x14 , F0 {
  int ff;
  ~G4x14y4(); // tgen
  G4x14y4(); // tgen
};
//SIG(1 G4x14y4) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G4x14y4 ::~G4x14y4(){ note_dtor("G4x14y4", this);} // tgen
G4x14y4 ::G4x14y4(){ note_ctor("G4x14y4", this);} // tgen

static void Test_G4x14y4()
{
  extern Class_Descriptor cd_G4x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G4x14y4, buf);
    G4x14y4 *dp, &lv = *(dp=new (buf) G4x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G4x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x14y4)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x14*), ABISELECT(12,8), "G4x14y4");
    check_base_class_offset(lv, (B1*)(C4*)(E4x14*), 0, "G4x14y4");
    check_base_class_offset(lv, (C4*)(E4x14*), 0, "G4x14y4");
    check_base_class_offset(lv, (D0*)(E4x14*), ABISELECT(32,28), "G4x14y4");
    check_base_class_offset(lv, (E4x14*), 0, "G4x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G4x14y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G4x14y4.ff");
    test_class_info(&lv, &cd_G4x14y4);
    dp->~G4x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x14y4(Test_G4x14y4, "G4x14y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G4x14y4C1Ev();
extern void _ZN7G4x14y4D1Ev();
Name_Map name_map_G4x14y4[] = {
  NSPAIR(_ZN7G4x14y4C1Ev),
  NSPAIR(_ZN7G4x14y4D1Ev),
  {0,0}
};
extern Class_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_E4x14;
extern VTBL_ENTRY _ZTI5E4x14[];
extern  VTBL_ENTRY _ZTV5E4x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x14y4[] = {
  // 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_E4x14,    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 _ZTI7G4x14y4[];
extern void _ZN5E4x143fooEv();
static  VTBL_ENTRY vtc_G4x14y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x14y4[0]),
  (VTBL_ENTRY)&_ZN5E4x143fooEv,
};
extern VTBL_ENTRY _ZTV7G4x14y4[];
extern void _ZN5E4x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x14__7G4x14y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x14[0]),
  (VTBL_ENTRY)&_ZN5E4x143fooEv,
};
static  VTT_ENTRY vtt_G4x14y4[] = {
  {&(_ZTV7G4x14y4[3]),  3,4},
  {&(_tg__ZTV5E4x14__7G4x14y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G4x14y4[];
extern  VTBL_ENTRY _ZTV7G4x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x14y4[];
Class_Descriptor cd_G4x14y4 = {  "G4x14y4", // class name
  bases_G4x14y4, 6,
  &(vtc_G4x14y4[0]), // expected_vtbl_contents
  &(vtt_G4x14y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G4x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x14y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x14y4),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  G4x14y5  : virtual E4x14 , F0 {
  int ff;
  ~G4x14y5(); // tgen
  G4x14y5(); // tgen
};
//SIG(1 G4x14y5) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G4x14y5 ::~G4x14y5(){ note_dtor("G4x14y5", this);} // tgen
G4x14y5 ::G4x14y5(){ note_ctor("G4x14y5", this);} // tgen

static void Test_G4x14y5()
{
  extern Class_Descriptor cd_G4x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x14y5, buf);
    G4x14y5 *dp, &lv = *(dp=new (buf) G4x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x14y5)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x14*), ABISELECT(28,20), "G4x14y5");
    check_base_class_offset(lv, (B1*)(C4*)(E4x14*), ABISELECT(16,12), "G4x14y5");
    check_base_class_offset(lv, (C4*)(E4x14*), ABISELECT(16,12), "G4x14y5");
    check_base_class_offset(lv, (D0*)(E4x14*), ABISELECT(40,32), "G4x14y5");
    check_base_class_offset(lv, (E4x14*), ABISELECT(16,12), "G4x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G4x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x14y5.ff");
    test_class_info(&lv, &cd_G4x14y5);
    dp->~G4x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x14y5(Test_G4x14y5, "G4x14y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G4x14y5C1Ev();
extern void _ZN7G4x14y5D1Ev();
Name_Map name_map_G4x14y5[] = {
  NSPAIR(_ZN7G4x14y5C1Ev),
  NSPAIR(_ZN7G4x14y5D1Ev),
  {0,0}
};
extern Class_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_E4x14;
extern VTBL_ENTRY _ZTI5E4x14[];
extern  VTBL_ENTRY _ZTV5E4x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x14y5[] = {
  // 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_E4x14,    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 _ZTI7G4x14y5[];
extern void _ZN5E4x143fooEv();
static  VTBL_ENTRY vtc_G4x14y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x14y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G4x14y5[0]),
  (VTBL_ENTRY)&_ZN5E4x143fooEv,
};
extern VTBL_ENTRY _ZTV7G4x14y5[];
extern void _ZN5E4x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x14__7G4x14y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x14[0]),
  (VTBL_ENTRY)&_ZN5E4x143fooEv,
};
static  VTT_ENTRY vtt_G4x14y5[] = {
  {&(_ZTV7G4x14y5[4]),  4,9},
  {&(_ZTV7G4x14y5[8]),  8,9},
  {&(_tg__ZTV5E4x14__7G4x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G4x14y5[];
extern  VTBL_ENTRY _ZTV7G4x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x14y5[];
Class_Descriptor cd_G4x14y5 = {  "G4x14y5", // class name
  bases_G4x14y5, 6,
  &(vtc_G4x14y5[0]), // expected_vtbl_contents
  &(vtt_G4x14y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G4x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x14y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x14y5),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  G4x14y6  : E4x14 , virtual F0 {
  int ff;
  ~G4x14y6(); // tgen
  G4x14y6(); // tgen
};
//SIG(1 G4x14y6) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G4x14y6 ::~G4x14y6(){ note_dtor("G4x14y6", this);} // tgen
G4x14y6 ::G4x14y6(){ note_ctor("G4x14y6", this);} // tgen

static void Test_G4x14y6()
{
  extern Class_Descriptor cd_G4x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G4x14y6, buf);
    G4x14y6 *dp, &lv = *(dp=new (buf) G4x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G4x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x14y6)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x14*), ABISELECT(12,8), "G4x14y6");
    check_base_class_offset(lv, (B1*)(C4*)(E4x14*), 0, "G4x14y6");
    check_base_class_offset(lv, (C4*)(E4x14*), 0, "G4x14y6");
    check_base_class_offset(lv, (D0*)(E4x14*), ABISELECT(28,24), "G4x14y6");
    check_base_class_offset(lv, (E4x14*), 0, "G4x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G4x14y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G4x14y6.ff");
    test_class_info(&lv, &cd_G4x14y6);
    dp->~G4x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x14y6(Test_G4x14y6, "G4x14y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G4x14y6C1Ev();
extern void _ZN7G4x14y6D1Ev();
Name_Map name_map_G4x14y6[] = {
  NSPAIR(_ZN7G4x14y6C1Ev),
  NSPAIR(_ZN7G4x14y6D1Ev),
  {0,0}
};
extern Class_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_E4x14;
extern VTBL_ENTRY _ZTI5E4x14[];
extern  VTBL_ENTRY _ZTV5E4x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x14y6[] = {
  // 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_E4x14,    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 _ZTI7G4x14y6[];
extern void _ZN5E4x143fooEv();
static  VTBL_ENTRY vtc_G4x14y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x14y6[0]),
  (VTBL_ENTRY)&_ZN5E4x143fooEv,
};
extern VTBL_ENTRY _ZTV7G4x14y6[];
extern void _ZN5E4x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x14__7G4x14y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x14[0]),
  (VTBL_ENTRY)&_ZN5E4x143fooEv,
};
static  VTT_ENTRY vtt_G4x14y6[] = {
  {&(_ZTV7G4x14y6[4]),  4,5},
  {&(_tg__ZTV5E4x14__7G4x14y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G4x14y6[];
extern  VTBL_ENTRY _ZTV7G4x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x14y6[];
Class_Descriptor cd_G4x14y6 = {  "G4x14y6", // class name
  bases_G4x14y6, 6,
  &(vtc_G4x14y6[0]), // expected_vtbl_contents
  &(vtt_G4x14y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G4x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x14y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x14y6),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  G4x14y7  : virtual E4x14 , virtual F0 {
  int ff;
  ~G4x14y7(); // tgen
  G4x14y7(); // tgen
};
//SIG(1 G4x14y7) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G4x14y7 ::~G4x14y7(){ note_dtor("G4x14y7", this);} // tgen
G4x14y7 ::G4x14y7(){ note_ctor("G4x14y7", this);} // tgen

static void Test_G4x14y7()
{
  extern Class_Descriptor cd_G4x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x14y7, buf);
    G4x14y7 *dp, &lv = *(dp=new (buf) G4x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x14y7)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x14*), ABISELECT(28,16), "G4x14y7");
    check_base_class_offset(lv, (B1*)(C4*)(E4x14*), ABISELECT(16,8), "G4x14y7");
    check_base_class_offset(lv, (C4*)(E4x14*), ABISELECT(16,8), "G4x14y7");
    check_base_class_offset(lv, (D0*)(E4x14*), ABISELECT(40,28), "G4x14y7");
    check_base_class_offset(lv, (E4x14*), ABISELECT(16,8), "G4x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G4x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G4x14y7.ff");
    test_class_info(&lv, &cd_G4x14y7);
    dp->~G4x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x14y7(Test_G4x14y7, "G4x14y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G4x14y7C1Ev();
extern void _ZN7G4x14y7D1Ev();
Name_Map name_map_G4x14y7[] = {
  NSPAIR(_ZN7G4x14y7C1Ev),
  NSPAIR(_ZN7G4x14y7D1Ev),
  {0,0}
};
extern Class_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_E4x14;
extern VTBL_ENTRY _ZTI5E4x14[];
extern  VTBL_ENTRY _ZTV5E4x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x14y7[] = {
  // 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_E4x14,    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 _ZTI7G4x14y7[];
extern void _ZN5E4x143fooEv();
static  VTBL_ENTRY vtc_G4x14y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x14y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G4x14y7[0]),
  (VTBL_ENTRY)&_ZN5E4x143fooEv,
};
extern VTBL_ENTRY _ZTV7G4x14y7[];
extern void _ZN5E4x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x14__7G4x14y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x14[0]),
  (VTBL_ENTRY)&_ZN5E4x143fooEv,
};
static  VTT_ENTRY vtt_G4x14y7[] = {
  {&(_ZTV7G4x14y7[5]),  5,10},
  {&(_ZTV7G4x14y7[9]),  9,10},
  {&(_tg__ZTV5E4x14__7G4x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G4x14y7[];
extern  VTBL_ENTRY _ZTV7G4x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x14y7[];
Class_Descriptor cd_G4x14y7 = {  "G4x14y7", // class name
  bases_G4x14y7, 6,
  &(vtc_G4x14y7[0]), // expected_vtbl_contents
  &(vtt_G4x14y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G4x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x14y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x14y7),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  E5x14  : C5 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E5x143fooEv
  ~E5x14(); // tgen
  E5x14(); // tgen
};
//SIG(-1 E5x14) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} Fi} VBC5{ Fi} v1 Fi}


void  E5x14 ::foo(){vfunc_called(this, "_ZN5E5x143fooEv");}
E5x14 ::~E5x14(){ note_dtor("E5x14", this);} // tgen
E5x14 ::E5x14(){ note_ctor("E5x14", this);} // tgen

static void Test_E5x14()
{
  extern Class_Descriptor cd_E5x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E5x14, buf);
    E5x14 *dp, &lv = *(dp=new (buf) E5x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E5x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E5x14)");
    check_base_class_offset(lv, (A1*)(C5*), 0, "E5x14");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(16,8), "E5x14");
    check_base_class_offset(lv, (C5*), 0, "E5x14");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E5x14");
    check_field_offset(lv, fd, ABISELECT(32,20), "E5x14.fd");
    test_class_info(&lv, &cd_E5x14);
    dp->~E5x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE5x14(Test_E5x14, "E5x14", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E5x14C1Ev();
extern void _ZN5E5x14D1Ev();
Name_Map name_map_E5x14[] = {
  NSPAIR(_ZN5E5x14C1Ev),
  NSPAIR(_ZN5E5x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x14[] = {
  // 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 _ZTI5E5x14[];
extern void _ZN5E5x143fooEv();
extern void ABISELECT(_ZThn16_N5E5x143fooEv,_ZThn8_N5E5x143fooEv)();
static  VTBL_ENTRY vtc_E5x14[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x14[0]),
  (VTBL_ENTRY)&_ZN5E5x143fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E5x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N5E5x143fooEv,_ZThn8_N5E5x143fooEv),
};
extern VTBL_ENTRY _ZTV5E5x14[];
static  VTT_ENTRY vtt_E5x14[] = {
  {&(_ZTV5E5x14[3]),  3,7},
};
extern VTBL_ENTRY _ZTI5E5x14[];
extern  VTBL_ENTRY _ZTV5E5x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x14[];
Class_Descriptor cd_E5x14 = {  "E5x14", // class name
  bases_E5x14, 4,
  &(vtc_E5x14[0]), // expected_vtbl_contents
  &(vtt_E5x14[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E5x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E5x14),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E5x14),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  G5x14y0  : E5x14 , F1 {
  int ff;
  ~G5x14y0(); // tgen
  G5x14y0(); // tgen
};
//SIG(1 G5x14y0) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G5x14y0 ::~G5x14y0(){ note_dtor("G5x14y0", this);} // tgen
G5x14y0 ::G5x14y0(){ note_ctor("G5x14y0", this);} // tgen

static void Test_G5x14y0()
{
  extern Class_Descriptor cd_G5x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G5x14y0, buf);
    G5x14y0 *dp, &lv = *(dp=new (buf) G5x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G5x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x14y0)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x14*), 0, "G5x14y0");
    check_base_class_offset(lv, (B1*)(C5*)(E5x14*), ABISELECT(16,8), "G5x14y0");
    check_base_class_offset(lv, (C5*)(E5x14*), 0, "G5x14y0");
    check_base_class_offset(lv, (D0*)(E5x14*), ABISELECT(56,36), "G5x14y0");
    check_base_class_offset(lv, (E5x14*), 0, "G5x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(40,24), "G5x14y0");
    check_field_offset(lv, ff, ABISELECT(52,32), "G5x14y0.ff");
    test_class_info(&lv, &cd_G5x14y0);
    dp->~G5x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x14y0(Test_G5x14y0, "G5x14y0", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G5x14y0C1Ev();
extern void _ZN7G5x14y0D1Ev();
Name_Map name_map_G5x14y0[] = {
  NSPAIR(_ZN7G5x14y0C1Ev),
  NSPAIR(_ZN7G5x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x14;
extern VTBL_ENTRY _ZTI5E5x14[];
extern  VTBL_ENTRY _ZTV5E5x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x14y0[] = {
  // 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_E5x14,    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 _ZTI7G5x14y0[];
extern void _ZN5E5x143fooEv();
extern void ABISELECT(_ZThn16_N5E5x143fooEv,_ZThn8_N5E5x143fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x14y0[] = {
  ABISELECT(56,36),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x14y0[0]),
  (VTBL_ENTRY)&_ZN5E5x143fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G5x14y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N5E5x143fooEv,_ZThn8_N5E5x143fooEv),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G5x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G5x14y0[];
extern void _ZN5E5x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x14__7G5x14y0[] = {
  ABISELECT(56,36),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x14[0]),
  (VTBL_ENTRY)&_ZN5E5x143fooEv,
};
static  VTT_ENTRY vtt_G5x14y0[] = {
  {&(_ZTV7G5x14y0[3]),  3,10},
  {&(_tg__ZTV5E5x14__7G5x14y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G5x14y0[];
extern  VTBL_ENTRY _ZTV7G5x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x14y0[];
Class_Descriptor cd_G5x14y0 = {  "G5x14y0", // class name
  bases_G5x14y0, 6,
  &(vtc_G5x14y0[0]), // expected_vtbl_contents
  &(vtt_G5x14y0[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G5x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x14y0),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x14y0),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  G5x14y1  : virtual E5x14 , F1 {
  int ff;
  ~G5x14y1(); // tgen
  G5x14y1(); // tgen
};
//SIG(1 G5x14y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G5x14y1 ::~G5x14y1(){ note_dtor("G5x14y1", this);} // tgen
G5x14y1 ::G5x14y1(){ note_ctor("G5x14y1", this);} // tgen

static void Test_G5x14y1()
{
  extern Class_Descriptor cd_G5x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G5x14y1, buf);
    G5x14y1 *dp, &lv = *(dp=new (buf) G5x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G5x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x14y1)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x14*), ABISELECT(16,12), "G5x14y1");
    check_base_class_offset(lv, (B1*)(C5*)(E5x14*), ABISELECT(32,20), "G5x14y1");
    check_base_class_offset(lv, (C5*)(E5x14*), ABISELECT(16,12), "G5x14y1");
    check_base_class_offset(lv, (D0*)(E5x14*), ABISELECT(52,36), "G5x14y1");
    check_base_class_offset(lv, (E5x14*), ABISELECT(16,12), "G5x14y1");
    check_base_class_offset(lv, (F1*), 0, "G5x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x14y1.ff");
    test_class_info(&lv, &cd_G5x14y1);
    dp->~G5x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x14y1(Test_G5x14y1, "G5x14y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G5x14y1C1Ev();
extern void _ZN7G5x14y1D1Ev();
Name_Map name_map_G5x14y1[] = {
  NSPAIR(_ZN7G5x14y1C1Ev),
  NSPAIR(_ZN7G5x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x14;
extern VTBL_ENTRY _ZTI5E5x14[];
extern  VTBL_ENTRY _ZTV5E5x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x14y1[] = {
  // 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_E5x14,    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 _ZTI7G5x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E5x143fooEv();
extern void ABISELECT(_ZThn16_N5E5x143fooEv,_ZThn8_N5E5x143fooEv)();
static  VTBL_ENTRY vtc_G5x14y1[] = {
  ABISELECT(52,36),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G5x14y1[0]),
  (VTBL_ENTRY)&_ZN5E5x143fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G5x14y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N5E5x143fooEv,_ZThn8_N5E5x143fooEv),
};
extern VTBL_ENTRY _ZTV7G5x14y1[];
extern void _ZN5E5x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x14__7G5x14y1[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x14[0]),
  (VTBL_ENTRY)&_ZN5E5x143fooEv,
};
static  VTT_ENTRY vtt_G5x14y1[] = {
  {&(_ZTV7G5x14y1[4]),  4,13},
  {&(_ZTV7G5x14y1[9]),  9,13},
  {&(_ZTV7G5x14y1[12]),  12,13},
  {&(_tg__ZTV5E5x14__7G5x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G5x14y1[];
extern  VTBL_ENTRY _ZTV7G5x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x14y1[];
Class_Descriptor cd_G5x14y1 = {  "G5x14y1", // class name
  bases_G5x14y1, 6,
  &(vtc_G5x14y1[0]), // expected_vtbl_contents
  &(vtt_G5x14y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G5x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x14y1),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x14y1),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  G5x14y2  : E5x14 , virtual F1 {
  int ff;
  ~G5x14y2(); // tgen
  G5x14y2(); // tgen
};
//SIG(1 G5x14y2) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G5x14y2 ::~G5x14y2(){ note_dtor("G5x14y2", this);} // tgen
G5x14y2 ::G5x14y2(){ note_ctor("G5x14y2", this);} // tgen

static void Test_G5x14y2()
{
  extern Class_Descriptor cd_G5x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G5x14y2, buf);
    G5x14y2 *dp, &lv = *(dp=new (buf) G5x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G5x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x14y2)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x14*), 0, "G5x14y2");
    check_base_class_offset(lv, (B1*)(C5*)(E5x14*), ABISELECT(16,8), "G5x14y2");
    check_base_class_offset(lv, (C5*)(E5x14*), 0, "G5x14y2");
    check_base_class_offset(lv, (D0*)(E5x14*), ABISELECT(40,28), "G5x14y2");
    check_base_class_offset(lv, (E5x14*), 0, "G5x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G5x14y2");
    check_field_offset(lv, ff, ABISELECT(36,24), "G5x14y2.ff");
    test_class_info(&lv, &cd_G5x14y2);
    dp->~G5x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x14y2(Test_G5x14y2, "G5x14y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G5x14y2C1Ev();
extern void _ZN7G5x14y2D1Ev();
Name_Map name_map_G5x14y2[] = {
  NSPAIR(_ZN7G5x14y2C1Ev),
  NSPAIR(_ZN7G5x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x14;
extern VTBL_ENTRY _ZTI5E5x14[];
extern  VTBL_ENTRY _ZTV5E5x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x14y2[] = {
  // 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_E5x14,    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 _ZTI7G5x14y2[];
extern void _ZN5E5x143fooEv();
extern void ABISELECT(_ZThn16_N5E5x143fooEv,_ZThn8_N5E5x143fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x14y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x14y2[0]),
  (VTBL_ENTRY)&_ZN5E5x143fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G5x14y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N5E5x143fooEv,_ZThn8_N5E5x143fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G5x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G5x14y2[];
extern void _ZN5E5x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x14__7G5x14y2[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x14[0]),
  (VTBL_ENTRY)&_ZN5E5x143fooEv,
};
static  VTT_ENTRY vtt_G5x14y2[] = {
  {&(_ZTV7G5x14y2[4]),  4,12},
  {&(_tg__ZTV5E5x14__7G5x14y2[3]),  3,4},
  {&(_ZTV7G5x14y2[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G5x14y2[];
extern  VTBL_ENTRY _ZTV7G5x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x14y2[];
Class_Descriptor cd_G5x14y2 = {  "G5x14y2", // class name
  bases_G5x14y2, 6,
  &(vtc_G5x14y2[0]), // expected_vtbl_contents
  &(vtt_G5x14y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G5x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x14y2),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x14y2),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  G5x14y3  : virtual E5x14 , virtual F1 {
  int ff;
  ~G5x14y3(); // tgen
  G5x14y3(); // tgen
};
//SIG(1 G5x14y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G5x14y3 ::~G5x14y3(){ note_dtor("G5x14y3", this);} // tgen
G5x14y3 ::G5x14y3(){ note_ctor("G5x14y3", this);} // tgen

static void Test_G5x14y3()
{
  extern Class_Descriptor cd_G5x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G5x14y3, buf);
    G5x14y3 *dp, &lv = *(dp=new (buf) G5x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G5x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x14y3)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x14*), ABISELECT(16,8), "G5x14y3");
    check_base_class_offset(lv, (B1*)(C5*)(E5x14*), ABISELECT(32,16), "G5x14y3");
    check_base_class_offset(lv, (C5*)(E5x14*), ABISELECT(16,8), "G5x14y3");
    check_base_class_offset(lv, (D0*)(E5x14*), ABISELECT(52,32), "G5x14y3");
    check_base_class_offset(lv, (E5x14*), ABISELECT(16,8), "G5x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G5x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G5x14y3.ff");
    test_class_info(&lv, &cd_G5x14y3);
    dp->~G5x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x14y3(Test_G5x14y3, "G5x14y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G5x14y3C1Ev();
extern void _ZN7G5x14y3D1Ev();
Name_Map name_map_G5x14y3[] = {
  NSPAIR(_ZN7G5x14y3C1Ev),
  NSPAIR(_ZN7G5x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x14;
extern VTBL_ENTRY _ZTI5E5x14[];
extern  VTBL_ENTRY _ZTV5E5x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x14y3[] = {
  // 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_E5x14,    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 _ZTI7G5x14y3[];
extern void _ZN5E5x143fooEv();
extern void ABISELECT(_ZThn16_N5E5x143fooEv,_ZThn8_N5E5x143fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x14y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x14y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G5x14y3[0]),
  (VTBL_ENTRY)&_ZN5E5x143fooEv,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G5x14y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N5E5x143fooEv,_ZThn8_N5E5x143fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G5x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G5x14y3[];
extern void _ZN5E5x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x14__7G5x14y3[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x14[0]),
  (VTBL_ENTRY)&_ZN5E5x143fooEv,
};
static  VTT_ENTRY vtt_G5x14y3[] = {
  {&(_ZTV7G5x14y3[5]),  5,17},
  {&(_ZTV7G5x14y3[9]),  9,17},
  {&(_ZTV7G5x14y3[12]),  12,17},
  {&(_ZTV7G5x14y3[16]),  16,17},
  {&(_tg__ZTV5E5x14__7G5x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G5x14y3[];
extern  VTBL_ENTRY _ZTV7G5x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x14y3[];
Class_Descriptor cd_G5x14y3 = {  "G5x14y3", // class name
  bases_G5x14y3, 6,
  &(vtc_G5x14y3[0]), // expected_vtbl_contents
  &(vtt_G5x14y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G5x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x14y3),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x14y3),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  G5x14y4  : E5x14 , F0 {
  int ff;
  ~G5x14y4(); // tgen
  G5x14y4(); // tgen
};
//SIG(1 G5x14y4) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G5x14y4 ::~G5x14y4(){ note_dtor("G5x14y4", this);} // tgen
G5x14y4 ::G5x14y4(){ note_ctor("G5x14y4", this);} // tgen

static void Test_G5x14y4()
{
  extern Class_Descriptor cd_G5x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G5x14y4, buf);
    G5x14y4 *dp, &lv = *(dp=new (buf) G5x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G5x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x14y4)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x14*), 0, "G5x14y4");
    check_base_class_offset(lv, (B1*)(C5*)(E5x14*), ABISELECT(16,8), "G5x14y4");
    check_base_class_offset(lv, (C5*)(E5x14*), 0, "G5x14y4");
    check_base_class_offset(lv, (D0*)(E5x14*), ABISELECT(44,32), "G5x14y4");
    check_base_class_offset(lv, (E5x14*), 0, "G5x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(36,24), "G5x14y4");
    check_field_offset(lv, ff, ABISELECT(40,28), "G5x14y4.ff");
    test_class_info(&lv, &cd_G5x14y4);
    dp->~G5x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x14y4(Test_G5x14y4, "G5x14y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G5x14y4C1Ev();
extern void _ZN7G5x14y4D1Ev();
Name_Map name_map_G5x14y4[] = {
  NSPAIR(_ZN7G5x14y4C1Ev),
  NSPAIR(_ZN7G5x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x14;
extern VTBL_ENTRY _ZTI5E5x14[];
extern  VTBL_ENTRY _ZTV5E5x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x14y4[] = {
  // 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_E5x14,    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 _ZTI7G5x14y4[];
extern void _ZN5E5x143fooEv();
extern void ABISELECT(_ZThn16_N5E5x143fooEv,_ZThn8_N5E5x143fooEv)();
static  VTBL_ENTRY vtc_G5x14y4[] = {
  ABISELECT(44,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x14y4[0]),
  (VTBL_ENTRY)&_ZN5E5x143fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G5x14y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N5E5x143fooEv,_ZThn8_N5E5x143fooEv),
};
extern VTBL_ENTRY _ZTV7G5x14y4[];
extern void _ZN5E5x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x14__7G5x14y4[] = {
  ABISELECT(44,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x14[0]),
  (VTBL_ENTRY)&_ZN5E5x143fooEv,
};
static  VTT_ENTRY vtt_G5x14y4[] = {
  {&(_ZTV7G5x14y4[3]),  3,7},
  {&(_tg__ZTV5E5x14__7G5x14y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G5x14y4[];
extern  VTBL_ENTRY _ZTV7G5x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x14y4[];
Class_Descriptor cd_G5x14y4 = {  "G5x14y4", // class name
  bases_G5x14y4, 6,
  &(vtc_G5x14y4[0]), // expected_vtbl_contents
  &(vtt_G5x14y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G5x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x14y4),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x14y4),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  G5x14y5  : virtual E5x14 , F0 {
  int ff;
  ~G5x14y5(); // tgen
  G5x14y5(); // tgen
};
//SIG(1 G5x14y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G5x14y5 ::~G5x14y5(){ note_dtor("G5x14y5", this);} // tgen
G5x14y5 ::G5x14y5(){ note_ctor("G5x14y5", this);} // tgen

static void Test_G5x14y5()
{
  extern Class_Descriptor cd_G5x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G5x14y5, buf);
    G5x14y5 *dp, &lv = *(dp=new (buf) G5x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G5x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x14y5)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x14*), ABISELECT(16,12), "G5x14y5");
    check_base_class_offset(lv, (B1*)(C5*)(E5x14*), ABISELECT(32,20), "G5x14y5");
    check_base_class_offset(lv, (C5*)(E5x14*), ABISELECT(16,12), "G5x14y5");
    check_base_class_offset(lv, (D0*)(E5x14*), ABISELECT(52,36), "G5x14y5");
    check_base_class_offset(lv, (E5x14*), ABISELECT(16,12), "G5x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G5x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x14y5.ff");
    test_class_info(&lv, &cd_G5x14y5);
    dp->~G5x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x14y5(Test_G5x14y5, "G5x14y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G5x14y5C1Ev();
extern void _ZN7G5x14y5D1Ev();
Name_Map name_map_G5x14y5[] = {
  NSPAIR(_ZN7G5x14y5C1Ev),
  NSPAIR(_ZN7G5x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x14;
extern VTBL_ENTRY _ZTI5E5x14[];
extern  VTBL_ENTRY _ZTV5E5x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x14y5[] = {
  // 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_E5x14,    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 _ZTI7G5x14y5[];
extern void _ZN5E5x143fooEv();
extern void ABISELECT(_ZThn16_N5E5x143fooEv,_ZThn8_N5E5x143fooEv)();
static  VTBL_ENTRY vtc_G5x14y5[] = {
  ABISELECT(52,36),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x14y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G5x14y5[0]),
  (VTBL_ENTRY)&_ZN5E5x143fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G5x14y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N5E5x143fooEv,_ZThn8_N5E5x143fooEv),
};
extern VTBL_ENTRY _ZTV7G5x14y5[];
extern void _ZN5E5x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x14__7G5x14y5[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x14[0]),
  (VTBL_ENTRY)&_ZN5E5x143fooEv,
};
static  VTT_ENTRY vtt_G5x14y5[] = {
  {&(_ZTV7G5x14y5[4]),  4,12},
  {&(_ZTV7G5x14y5[8]),  8,12},
  {&(_ZTV7G5x14y5[11]),  11,12},
  {&(_tg__ZTV5E5x14__7G5x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G5x14y5[];
extern  VTBL_ENTRY _ZTV7G5x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x14y5[];
Class_Descriptor cd_G5x14y5 = {  "G5x14y5", // class name
  bases_G5x14y5, 6,
  &(vtc_G5x14y5[0]), // expected_vtbl_contents
  &(vtt_G5x14y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G5x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x14y5),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x14y5),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  G5x14y6  : E5x14 , virtual F0 {
  int ff;
  ~G5x14y6(); // tgen
  G5x14y6(); // tgen
};
//SIG(1 G5x14y6) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G5x14y6 ::~G5x14y6(){ note_dtor("G5x14y6", this);} // tgen
G5x14y6 ::G5x14y6(){ note_ctor("G5x14y6", this);} // tgen

static void Test_G5x14y6()
{
  extern Class_Descriptor cd_G5x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G5x14y6, buf);
    G5x14y6 *dp, &lv = *(dp=new (buf) G5x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G5x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x14y6)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x14*), 0, "G5x14y6");
    check_base_class_offset(lv, (B1*)(C5*)(E5x14*), ABISELECT(16,8), "G5x14y6");
    check_base_class_offset(lv, (C5*)(E5x14*), 0, "G5x14y6");
    check_base_class_offset(lv, (D0*)(E5x14*), ABISELECT(40,28), "G5x14y6");
    check_base_class_offset(lv, (E5x14*), 0, "G5x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G5x14y6");
    check_field_offset(lv, ff, ABISELECT(36,24), "G5x14y6.ff");
    test_class_info(&lv, &cd_G5x14y6);
    dp->~G5x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x14y6(Test_G5x14y6, "G5x14y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G5x14y6C1Ev();
extern void _ZN7G5x14y6D1Ev();
Name_Map name_map_G5x14y6[] = {
  NSPAIR(_ZN7G5x14y6C1Ev),
  NSPAIR(_ZN7G5x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x14;
extern VTBL_ENTRY _ZTI5E5x14[];
extern  VTBL_ENTRY _ZTV5E5x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x14y6[] = {
  // 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_E5x14,    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 _ZTI7G5x14y6[];
extern void _ZN5E5x143fooEv();
extern void ABISELECT(_ZThn16_N5E5x143fooEv,_ZThn8_N5E5x143fooEv)();
static  VTBL_ENTRY vtc_G5x14y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x14y6[0]),
  (VTBL_ENTRY)&_ZN5E5x143fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G5x14y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N5E5x143fooEv,_ZThn8_N5E5x143fooEv),
};
extern VTBL_ENTRY _ZTV7G5x14y6[];
extern void _ZN5E5x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x14__7G5x14y6[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x14[0]),
  (VTBL_ENTRY)&_ZN5E5x143fooEv,
};
static  VTT_ENTRY vtt_G5x14y6[] = {
  {&(_ZTV7G5x14y6[4]),  4,8},
  {&(_tg__ZTV5E5x14__7G5x14y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G5x14y6[];
extern  VTBL_ENTRY _ZTV7G5x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x14y6[];
Class_Descriptor cd_G5x14y6 = {  "G5x14y6", // class name
  bases_G5x14y6, 6,
  &(vtc_G5x14y6[0]), // expected_vtbl_contents
  &(vtt_G5x14y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G5x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x14y6),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x14y6),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  G5x14y7  : virtual E5x14 , virtual F0 {
  int ff;
  ~G5x14y7(); // tgen
  G5x14y7(); // tgen
};
//SIG(1 G5x14y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G5x14y7 ::~G5x14y7(){ note_dtor("G5x14y7", this);} // tgen
G5x14y7 ::G5x14y7(){ note_ctor("G5x14y7", this);} // tgen

static void Test_G5x14y7()
{
  extern Class_Descriptor cd_G5x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G5x14y7, buf);
    G5x14y7 *dp, &lv = *(dp=new (buf) G5x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G5x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x14y7)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x14*), ABISELECT(16,8), "G5x14y7");
    check_base_class_offset(lv, (B1*)(C5*)(E5x14*), ABISELECT(32,16), "G5x14y7");
    check_base_class_offset(lv, (C5*)(E5x14*), ABISELECT(16,8), "G5x14y7");
    check_base_class_offset(lv, (D0*)(E5x14*), ABISELECT(52,32), "G5x14y7");
    check_base_class_offset(lv, (E5x14*), ABISELECT(16,8), "G5x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G5x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G5x14y7.ff");
    test_class_info(&lv, &cd_G5x14y7);
    dp->~G5x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x14y7(Test_G5x14y7, "G5x14y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G5x14y7C1Ev();
extern void _ZN7G5x14y7D1Ev();
Name_Map name_map_G5x14y7[] = {
  NSPAIR(_ZN7G5x14y7C1Ev),
  NSPAIR(_ZN7G5x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x14;
extern VTBL_ENTRY _ZTI5E5x14[];
extern  VTBL_ENTRY _ZTV5E5x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x14y7[] = {
  // 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_E5x14,    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 _ZTI7G5x14y7[];
extern void _ZN5E5x143fooEv();
extern void ABISELECT(_ZThn16_N5E5x143fooEv,_ZThn8_N5E5x143fooEv)();
static  VTBL_ENTRY vtc_G5x14y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x14y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G5x14y7[0]),
  (VTBL_ENTRY)&_ZN5E5x143fooEv,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G5x14y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N5E5x143fooEv,_ZThn8_N5E5x143fooEv),
};
extern VTBL_ENTRY _ZTV7G5x14y7[];
extern void _ZN5E5x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x14__7G5x14y7[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x14[0]),
  (VTBL_ENTRY)&_ZN5E5x143fooEv,
};
static  VTT_ENTRY vtt_G5x14y7[] = {
  {&(_ZTV7G5x14y7[5]),  5,13},
  {&(_ZTV7G5x14y7[9]),  9,13},
  {&(_ZTV7G5x14y7[12]),  12,13},
  {&(_tg__ZTV5E5x14__7G5x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G5x14y7[];
extern  VTBL_ENTRY _ZTV7G5x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x14y7[];
Class_Descriptor cd_G5x14y7 = {  "G5x14y7", // class name
  bases_G5x14y7, 6,
  &(vtc_G5x14y7[0]), // expected_vtbl_contents
  &(vtt_G5x14y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G5x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x14y7),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x14y7),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  E6x14  : C6 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E6x143fooEv
  ~E6x14(); // tgen
  E6x14(); // tgen
};
//SIG(-1 E6x14) C1{ BC2{ VBC3{ Fi} BC4{ v1 Fi} Fi} VBC5{ Fi} v1 Fi}


void  E6x14 ::foo(){vfunc_called(this, "_ZN5E6x143fooEv");}
E6x14 ::~E6x14(){ note_dtor("E6x14", this);} // tgen
E6x14 ::E6x14(){ note_ctor("E6x14", this);} // tgen

static void Test_E6x14()
{
  extern Class_Descriptor cd_E6x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E6x14, buf);
    E6x14 *dp, &lv = *(dp=new (buf) E6x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E6x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E6x14)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(20,16), "E6x14");
    check_base_class_offset(lv, (B1*)(C6*), 0, "E6x14");
    check_base_class_offset(lv, (C6*), 0, "E6x14");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E6x14");
    check_field_offset(lv, fd, ABISELECT(16,12), "E6x14.fd");
    test_class_info(&lv, &cd_E6x14);
    dp->~E6x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE6x14(Test_E6x14, "E6x14", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E6x14C1Ev();
extern void _ZN5E6x14D1Ev();
Name_Map name_map_E6x14[] = {
  NSPAIR(_ZN5E6x14C1Ev),
  NSPAIR(_ZN5E6x14D1Ev),
  {0,0}
};
extern Class_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_E6x14[] = {
  // 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 _ZTI5E6x14[];
extern void _ZN5E6x143fooEv();
static  VTBL_ENTRY vtc_E6x14[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x14[0]),
  (VTBL_ENTRY)&_ZN5E6x143fooEv,
};
extern VTBL_ENTRY _ZTV5E6x14[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__5E6x14[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E6x14[] = {
  {&(_ZTV5E6x14[4]),  4,5},
  {&(_tg__ZTV2C6__5E6x14[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E6x14[];
extern  VTBL_ENTRY _ZTV5E6x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x14[];
Class_Descriptor cd_E6x14 = {  "E6x14", // class name
  bases_E6x14, 4,
  &(vtc_E6x14[0]), // expected_vtbl_contents
  &(vtt_E6x14[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E6x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E6x14),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E6x14),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  G6x14y0  : E6x14 , F1 {
  int ff;
  ~G6x14y0(); // tgen
  G6x14y0(); // tgen
};
//SIG(1 G6x14y0) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G6x14y0 ::~G6x14y0(){ note_dtor("G6x14y0", this);} // tgen
G6x14y0 ::G6x14y0(){ note_ctor("G6x14y0", this);} // tgen

static void Test_G6x14y0()
{
  extern Class_Descriptor cd_G6x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x14y0, buf);
    G6x14y0 *dp, &lv = *(dp=new (buf) G6x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x14y0)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x14*), ABISELECT(40,28), "G6x14y0");
    check_base_class_offset(lv, (B1*)(C6*)(E6x14*), 0, "G6x14y0");
    check_base_class_offset(lv, (C6*)(E6x14*), 0, "G6x14y0");
    check_base_class_offset(lv, (D0*)(E6x14*), ABISELECT(44,32), "G6x14y0");
    check_base_class_offset(lv, (E6x14*), 0, "G6x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G6x14y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G6x14y0.ff");
    test_class_info(&lv, &cd_G6x14y0);
    dp->~G6x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x14y0(Test_G6x14y0, "G6x14y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G6x14y0C1Ev();
extern void _ZN7G6x14y0D1Ev();
Name_Map name_map_G6x14y0[] = {
  NSPAIR(_ZN7G6x14y0C1Ev),
  NSPAIR(_ZN7G6x14y0D1Ev),
  {0,0}
};
extern Class_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_E6x14;
extern VTBL_ENTRY _ZTI5E6x14[];
extern  VTBL_ENTRY _ZTV5E6x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x14y0[] = {
  // 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_E6x14,    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 _ZTI7G6x14y0[];
extern void _ZN5E6x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x14y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x14y0[0]),
  (VTBL_ENTRY)&_ZN5E6x143fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G6x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G6x14y0[];
extern void _ZN5E6x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x14__7G6x14y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x14[0]),
  (VTBL_ENTRY)&_ZN5E6x143fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C65E6x14__7G6x14y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x14y0[] = {
  {&(_ZTV7G6x14y0[4]),  4,8},
  {&(_tg__ZTV5E6x14__7G6x14y0[4]),  4,5},
  {&(_tg__ZTV2C65E6x14__7G6x14y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x14y0[];
extern  VTBL_ENTRY _ZTV7G6x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x14y0[];
Class_Descriptor cd_G6x14y0 = {  "G6x14y0", // class name
  bases_G6x14y0, 6,
  &(vtc_G6x14y0[0]), // expected_vtbl_contents
  &(vtt_G6x14y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G6x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x14y0),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x14y0),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  G6x14y1  : virtual E6x14 , F1 {
  int ff;
  ~G6x14y1(); // tgen
  G6x14y1(); // tgen
};
//SIG(1 G6x14y1) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G6x14y1 ::~G6x14y1(){ note_dtor("G6x14y1", this);} // tgen
G6x14y1 ::G6x14y1(){ note_ctor("G6x14y1", this);} // tgen

static void Test_G6x14y1()
{
  extern Class_Descriptor cd_G6x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x14y1, buf);
    G6x14y1 *dp, &lv = *(dp=new (buf) G6x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x14y1)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x14*), ABISELECT(36,28), "G6x14y1");
    check_base_class_offset(lv, (B1*)(C6*)(E6x14*), ABISELECT(16,12), "G6x14y1");
    check_base_class_offset(lv, (C6*)(E6x14*), ABISELECT(16,12), "G6x14y1");
    check_base_class_offset(lv, (D0*)(E6x14*), ABISELECT(40,32), "G6x14y1");
    check_base_class_offset(lv, (E6x14*), ABISELECT(16,12), "G6x14y1");
    check_base_class_offset(lv, (F1*), 0, "G6x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x14y1.ff");
    test_class_info(&lv, &cd_G6x14y1);
    dp->~G6x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x14y1(Test_G6x14y1, "G6x14y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G6x14y1C1Ev();
extern void _ZN7G6x14y1D1Ev();
Name_Map name_map_G6x14y1[] = {
  NSPAIR(_ZN7G6x14y1C1Ev),
  NSPAIR(_ZN7G6x14y1D1Ev),
  {0,0}
};
extern Class_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_E6x14;
extern VTBL_ENTRY _ZTI5E6x14[];
extern  VTBL_ENTRY _ZTV5E6x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x14y1[] = {
  // 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_E6x14,    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 _ZTI7G6x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E6x143fooEv();
static  VTBL_ENTRY vtc_G6x14y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G6x14y1[0]),
  (VTBL_ENTRY)&_ZN5E6x143fooEv,
};
extern VTBL_ENTRY _ZTV7G6x14y1[];
extern void _ZN5E6x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x14__7G6x14y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x14[0]),
  (VTBL_ENTRY)&_ZN5E6x143fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C65E6x14__7G6x14y1[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x14y1[] = {
  {&(_ZTV7G6x14y1[5]),  5,12},
  {&(_ZTV7G6x14y1[11]),  11,12},
  {&(_tg__ZTV5E6x14__7G6x14y1[4]),  4,5},
  {&(_tg__ZTV2C65E6x14__7G6x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x14y1[];
extern  VTBL_ENTRY _ZTV7G6x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x14y1[];
Class_Descriptor cd_G6x14y1 = {  "G6x14y1", // class name
  bases_G6x14y1, 6,
  &(vtc_G6x14y1[0]), // expected_vtbl_contents
  &(vtt_G6x14y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G6x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x14y1),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x14y1),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  G6x14y2  : E6x14 , virtual F1 {
  int ff;
  ~G6x14y2(); // tgen
  G6x14y2(); // tgen
};
//SIG(1 G6x14y2) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G6x14y2 ::~G6x14y2(){ note_dtor("G6x14y2", this);} // tgen
G6x14y2 ::G6x14y2(){ note_ctor("G6x14y2", this);} // tgen

static void Test_G6x14y2()
{
  extern Class_Descriptor cd_G6x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x14y2, buf);
    G6x14y2 *dp, &lv = *(dp=new (buf) G6x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x14y2)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x14*), ABISELECT(24,20), "G6x14y2");
    check_base_class_offset(lv, (B1*)(C6*)(E6x14*), 0, "G6x14y2");
    check_base_class_offset(lv, (C6*)(E6x14*), 0, "G6x14y2");
    check_base_class_offset(lv, (D0*)(E6x14*), ABISELECT(28,24), "G6x14y2");
    check_base_class_offset(lv, (E6x14*), 0, "G6x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G6x14y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G6x14y2.ff");
    test_class_info(&lv, &cd_G6x14y2);
    dp->~G6x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x14y2(Test_G6x14y2, "G6x14y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G6x14y2C1Ev();
extern void _ZN7G6x14y2D1Ev();
Name_Map name_map_G6x14y2[] = {
  NSPAIR(_ZN7G6x14y2C1Ev),
  NSPAIR(_ZN7G6x14y2D1Ev),
  {0,0}
};
extern Class_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_E6x14;
extern VTBL_ENTRY _ZTI5E6x14[];
extern  VTBL_ENTRY _ZTV5E6x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x14y2[] = {
  // 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_E6x14,    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 _ZTI7G6x14y2[];
extern void _ZN5E6x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x14y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x14y2[0]),
  (VTBL_ENTRY)&_ZN5E6x143fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G6x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G6x14y2[];
extern void _ZN5E6x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x14__7G6x14y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x14[0]),
  (VTBL_ENTRY)&_ZN5E6x143fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C65E6x14__7G6x14y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x14y2[] = {
  {&(_ZTV7G6x14y2[5]),  5,10},
  {&(_tg__ZTV5E6x14__7G6x14y2[4]),  4,5},
  {&(_tg__ZTV2C65E6x14__7G6x14y2[3]),  3,4},
  {&(_ZTV7G6x14y2[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G6x14y2[];
extern  VTBL_ENTRY _ZTV7G6x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x14y2[];
Class_Descriptor cd_G6x14y2 = {  "G6x14y2", // class name
  bases_G6x14y2, 6,
  &(vtc_G6x14y2[0]), // expected_vtbl_contents
  &(vtt_G6x14y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G6x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x14y2),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x14y2),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  G6x14y3  : virtual E6x14 , virtual F1 {
  int ff;
  ~G6x14y3(); // tgen
  G6x14y3(); // tgen
};
//SIG(1 G6x14y3) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G6x14y3 ::~G6x14y3(){ note_dtor("G6x14y3", this);} // tgen
G6x14y3 ::G6x14y3(){ note_ctor("G6x14y3", this);} // tgen

static void Test_G6x14y3()
{
  extern Class_Descriptor cd_G6x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G6x14y3, buf);
    G6x14y3 *dp, &lv = *(dp=new (buf) G6x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G6x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x14y3)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x14*), ABISELECT(36,24), "G6x14y3");
    check_base_class_offset(lv, (B1*)(C6*)(E6x14*), ABISELECT(16,8), "G6x14y3");
    check_base_class_offset(lv, (C6*)(E6x14*), ABISELECT(16,8), "G6x14y3");
    check_base_class_offset(lv, (D0*)(E6x14*), ABISELECT(40,28), "G6x14y3");
    check_base_class_offset(lv, (E6x14*), ABISELECT(16,8), "G6x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G6x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G6x14y3.ff");
    test_class_info(&lv, &cd_G6x14y3);
    dp->~G6x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x14y3(Test_G6x14y3, "G6x14y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G6x14y3C1Ev();
extern void _ZN7G6x14y3D1Ev();
Name_Map name_map_G6x14y3[] = {
  NSPAIR(_ZN7G6x14y3C1Ev),
  NSPAIR(_ZN7G6x14y3D1Ev),
  {0,0}
};
extern Class_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_E6x14;
extern VTBL_ENTRY _ZTI5E6x14[];
extern  VTBL_ENTRY _ZTV5E6x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x14y3[] = {
  // 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_E6x14,    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 _ZTI7G6x14y3[];
extern void _ZN5E6x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x14y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x14y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G6x14y3[0]),
  (VTBL_ENTRY)&_ZN5E6x143fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G6x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G6x14y3[];
extern void _ZN5E6x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x14__7G6x14y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x14[0]),
  (VTBL_ENTRY)&_ZN5E6x143fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C65E6x14__7G6x14y3[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x14y3[] = {
  {&(_ZTV7G6x14y3[6]),  6,16},
  {&(_ZTV7G6x14y3[11]),  11,16},
  {&(_ZTV7G6x14y3[15]),  15,16},
  {&(_tg__ZTV5E6x14__7G6x14y3[4]),  4,5},
  {&(_tg__ZTV2C65E6x14__7G6x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x14y3[];
extern  VTBL_ENTRY _ZTV7G6x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x14y3[];
Class_Descriptor cd_G6x14y3 = {  "G6x14y3", // class name
  bases_G6x14y3, 6,
  &(vtc_G6x14y3[0]), // expected_vtbl_contents
  &(vtt_G6x14y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G6x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x14y3),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x14y3),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  G6x14y4  : E6x14 , F0 {
  int ff;
  ~G6x14y4(); // tgen
  G6x14y4(); // tgen
};
//SIG(1 G6x14y4) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G6x14y4 ::~G6x14y4(){ note_dtor("G6x14y4", this);} // tgen
G6x14y4 ::G6x14y4(){ note_ctor("G6x14y4", this);} // tgen

static void Test_G6x14y4()
{
  extern Class_Descriptor cd_G6x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G6x14y4, buf);
    G6x14y4 *dp, &lv = *(dp=new (buf) G6x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G6x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x14y4)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x14*), ABISELECT(28,24), "G6x14y4");
    check_base_class_offset(lv, (B1*)(C6*)(E6x14*), 0, "G6x14y4");
    check_base_class_offset(lv, (C6*)(E6x14*), 0, "G6x14y4");
    check_base_class_offset(lv, (D0*)(E6x14*), ABISELECT(32,28), "G6x14y4");
    check_base_class_offset(lv, (E6x14*), 0, "G6x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G6x14y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G6x14y4.ff");
    test_class_info(&lv, &cd_G6x14y4);
    dp->~G6x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x14y4(Test_G6x14y4, "G6x14y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G6x14y4C1Ev();
extern void _ZN7G6x14y4D1Ev();
Name_Map name_map_G6x14y4[] = {
  NSPAIR(_ZN7G6x14y4C1Ev),
  NSPAIR(_ZN7G6x14y4D1Ev),
  {0,0}
};
extern Class_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_E6x14;
extern VTBL_ENTRY _ZTI5E6x14[];
extern  VTBL_ENTRY _ZTV5E6x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x14y4[] = {
  // 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_E6x14,    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 _ZTI7G6x14y4[];
extern void _ZN5E6x143fooEv();
static  VTBL_ENTRY vtc_G6x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x14y4[0]),
  (VTBL_ENTRY)&_ZN5E6x143fooEv,
};
extern VTBL_ENTRY _ZTV7G6x14y4[];
extern void _ZN5E6x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x14__7G6x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x14[0]),
  (VTBL_ENTRY)&_ZN5E6x143fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C65E6x14__7G6x14y4[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x14y4[] = {
  {&(_ZTV7G6x14y4[4]),  4,5},
  {&(_tg__ZTV5E6x14__7G6x14y4[4]),  4,5},
  {&(_tg__ZTV2C65E6x14__7G6x14y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x14y4[];
extern  VTBL_ENTRY _ZTV7G6x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x14y4[];
Class_Descriptor cd_G6x14y4 = {  "G6x14y4", // class name
  bases_G6x14y4, 6,
  &(vtc_G6x14y4[0]), // expected_vtbl_contents
  &(vtt_G6x14y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G6x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x14y4),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x14y4),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  G6x14y5  : virtual E6x14 , F0 {
  int ff;
  ~G6x14y5(); // tgen
  G6x14y5(); // tgen
};
//SIG(1 G6x14y5) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G6x14y5 ::~G6x14y5(){ note_dtor("G6x14y5", this);} // tgen
G6x14y5 ::G6x14y5(){ note_ctor("G6x14y5", this);} // tgen

static void Test_G6x14y5()
{
  extern Class_Descriptor cd_G6x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x14y5, buf);
    G6x14y5 *dp, &lv = *(dp=new (buf) G6x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x14y5)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x14*), ABISELECT(36,28), "G6x14y5");
    check_base_class_offset(lv, (B1*)(C6*)(E6x14*), ABISELECT(16,12), "G6x14y5");
    check_base_class_offset(lv, (C6*)(E6x14*), ABISELECT(16,12), "G6x14y5");
    check_base_class_offset(lv, (D0*)(E6x14*), ABISELECT(40,32), "G6x14y5");
    check_base_class_offset(lv, (E6x14*), ABISELECT(16,12), "G6x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G6x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x14y5.ff");
    test_class_info(&lv, &cd_G6x14y5);
    dp->~G6x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x14y5(Test_G6x14y5, "G6x14y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G6x14y5C1Ev();
extern void _ZN7G6x14y5D1Ev();
Name_Map name_map_G6x14y5[] = {
  NSPAIR(_ZN7G6x14y5C1Ev),
  NSPAIR(_ZN7G6x14y5D1Ev),
  {0,0}
};
extern Class_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_E6x14;
extern VTBL_ENTRY _ZTI5E6x14[];
extern  VTBL_ENTRY _ZTV5E6x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x14y5[] = {
  // 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_E6x14,    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 _ZTI7G6x14y5[];
extern void _ZN5E6x143fooEv();
static  VTBL_ENTRY vtc_G6x14y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x14y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G6x14y5[0]),
  (VTBL_ENTRY)&_ZN5E6x143fooEv,
};
extern VTBL_ENTRY _ZTV7G6x14y5[];
extern void _ZN5E6x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x14__7G6x14y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x14[0]),
  (VTBL_ENTRY)&_ZN5E6x143fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C65E6x14__7G6x14y5[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x14y5[] = {
  {&(_ZTV7G6x14y5[5]),  5,11},
  {&(_ZTV7G6x14y5[10]),  10,11},
  {&(_tg__ZTV5E6x14__7G6x14y5[4]),  4,5},
  {&(_tg__ZTV2C65E6x14__7G6x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x14y5[];
extern  VTBL_ENTRY _ZTV7G6x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x14y5[];
Class_Descriptor cd_G6x14y5 = {  "G6x14y5", // class name
  bases_G6x14y5, 6,
  &(vtc_G6x14y5[0]), // expected_vtbl_contents
  &(vtt_G6x14y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G6x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x14y5),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x14y5),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  G6x14y6  : E6x14 , virtual F0 {
  int ff;
  ~G6x14y6(); // tgen
  G6x14y6(); // tgen
};
//SIG(1 G6x14y6) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G6x14y6 ::~G6x14y6(){ note_dtor("G6x14y6", this);} // tgen
G6x14y6 ::G6x14y6(){ note_ctor("G6x14y6", this);} // tgen

static void Test_G6x14y6()
{
  extern Class_Descriptor cd_G6x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G6x14y6, buf);
    G6x14y6 *dp, &lv = *(dp=new (buf) G6x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G6x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x14y6)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x14*), ABISELECT(24,20), "G6x14y6");
    check_base_class_offset(lv, (B1*)(C6*)(E6x14*), 0, "G6x14y6");
    check_base_class_offset(lv, (C6*)(E6x14*), 0, "G6x14y6");
    check_base_class_offset(lv, (D0*)(E6x14*), ABISELECT(28,24), "G6x14y6");
    check_base_class_offset(lv, (E6x14*), 0, "G6x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G6x14y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G6x14y6.ff");
    test_class_info(&lv, &cd_G6x14y6);
    dp->~G6x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x14y6(Test_G6x14y6, "G6x14y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G6x14y6C1Ev();
extern void _ZN7G6x14y6D1Ev();
Name_Map name_map_G6x14y6[] = {
  NSPAIR(_ZN7G6x14y6C1Ev),
  NSPAIR(_ZN7G6x14y6D1Ev),
  {0,0}
};
extern Class_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_E6x14;
extern VTBL_ENTRY _ZTI5E6x14[];
extern  VTBL_ENTRY _ZTV5E6x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x14y6[] = {
  // 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_E6x14,    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 _ZTI7G6x14y6[];
extern void _ZN5E6x143fooEv();
static  VTBL_ENTRY vtc_G6x14y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x14y6[0]),
  (VTBL_ENTRY)&_ZN5E6x143fooEv,
};
extern VTBL_ENTRY _ZTV7G6x14y6[];
extern void _ZN5E6x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x14__7G6x14y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x14[0]),
  (VTBL_ENTRY)&_ZN5E6x143fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C65E6x14__7G6x14y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x14y6[] = {
  {&(_ZTV7G6x14y6[5]),  5,6},
  {&(_tg__ZTV5E6x14__7G6x14y6[4]),  4,5},
  {&(_tg__ZTV2C65E6x14__7G6x14y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x14y6[];
extern  VTBL_ENTRY _ZTV7G6x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x14y6[];
Class_Descriptor cd_G6x14y6 = {  "G6x14y6", // class name
  bases_G6x14y6, 6,
  &(vtc_G6x14y6[0]), // expected_vtbl_contents
  &(vtt_G6x14y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G6x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x14y6),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x14y6),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  G6x14y7  : virtual E6x14 , virtual F0 {
  int ff;
  ~G6x14y7(); // tgen
  G6x14y7(); // tgen
};
//SIG(1 G6x14y7) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G6x14y7 ::~G6x14y7(){ note_dtor("G6x14y7", this);} // tgen
G6x14y7 ::G6x14y7(){ note_ctor("G6x14y7", this);} // tgen

static void Test_G6x14y7()
{
  extern Class_Descriptor cd_G6x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x14y7, buf);
    G6x14y7 *dp, &lv = *(dp=new (buf) G6x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x14y7)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x14*), ABISELECT(36,24), "G6x14y7");
    check_base_class_offset(lv, (B1*)(C6*)(E6x14*), ABISELECT(16,8), "G6x14y7");
    check_base_class_offset(lv, (C6*)(E6x14*), ABISELECT(16,8), "G6x14y7");
    check_base_class_offset(lv, (D0*)(E6x14*), ABISELECT(40,28), "G6x14y7");
    check_base_class_offset(lv, (E6x14*), ABISELECT(16,8), "G6x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G6x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G6x14y7.ff");
    test_class_info(&lv, &cd_G6x14y7);
    dp->~G6x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x14y7(Test_G6x14y7, "G6x14y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G6x14y7C1Ev();
extern void _ZN7G6x14y7D1Ev();
Name_Map name_map_G6x14y7[] = {
  NSPAIR(_ZN7G6x14y7C1Ev),
  NSPAIR(_ZN7G6x14y7D1Ev),
  {0,0}
};
extern Class_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_E6x14;
extern VTBL_ENTRY _ZTI5E6x14[];
extern  VTBL_ENTRY _ZTV5E6x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x14y7[] = {
  // 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_E6x14,    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 _ZTI7G6x14y7[];
extern void _ZN5E6x143fooEv();
static  VTBL_ENTRY vtc_G6x14y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x14y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G6x14y7[0]),
  (VTBL_ENTRY)&_ZN5E6x143fooEv,
};
extern VTBL_ENTRY _ZTV7G6x14y7[];
extern void _ZN5E6x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x14__7G6x14y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x14[0]),
  (VTBL_ENTRY)&_ZN5E6x143fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C65E6x14__7G6x14y7[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x14y7[] = {
  {&(_ZTV7G6x14y7[6]),  6,12},
  {&(_ZTV7G6x14y7[11]),  11,12},
  {&(_tg__ZTV5E6x14__7G6x14y7[4]),  4,5},
  {&(_tg__ZTV2C65E6x14__7G6x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x14y7[];
extern  VTBL_ENTRY _ZTV7G6x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x14y7[];
Class_Descriptor cd_G6x14y7 = {  "G6x14y7", // class name
  bases_G6x14y7, 6,
  &(vtc_G6x14y7[0]), // expected_vtbl_contents
  &(vtt_G6x14y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G6x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x14y7),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x14y7),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  E7x14  : C7 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E7x143fooEv
  ~E7x14(); // tgen
  E7x14(); // tgen
};
//SIG(-1 E7x14) C1{ BC2{ VBC3{ v1 Fi} BC4{ v1 Fi} Fi} VBC5{ Fi} v1 Fi}


void  E7x14 ::foo(){vfunc_called(this, "_ZN5E7x143fooEv");}
E7x14 ::~E7x14(){ note_dtor("E7x14", this);} // tgen
E7x14 ::E7x14(){ note_ctor("E7x14", this);} // tgen

static void Test_E7x14()
{
  extern Class_Descriptor cd_E7x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E7x14, buf);
    E7x14 *dp, &lv = *(dp=new (buf) E7x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E7x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E7x14)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(24,16), "E7x14");
    check_base_class_offset(lv, (B1*)(C7*), 0, "E7x14");
    check_base_class_offset(lv, (C7*), 0, "E7x14");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E7x14");
    check_field_offset(lv, fd, ABISELECT(16,12), "E7x14.fd");
    test_class_info(&lv, &cd_E7x14);
    dp->~E7x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE7x14(Test_E7x14, "E7x14", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E7x14C1Ev();
extern void _ZN5E7x14D1Ev();
Name_Map name_map_E7x14[] = {
  NSPAIR(_ZN5E7x14C1Ev),
  NSPAIR(_ZN5E7x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x14[] = {
  // 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 _ZTI5E7x14[];
extern void _ZN5E7x143fooEv();
extern void ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv)();
extern void ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn16_N5E7x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E7x14[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x14[0]),
  (VTBL_ENTRY)&_ZN5E7x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E7x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv),
};
extern VTBL_ENTRY _ZTV5E7x14[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__5E7x14[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__5E7x14[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E7x14[] = {
  {&(_ZTV5E7x14[4]),  4,9},
  {&(_tg__ZTV2C7__5E7x14[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__5E7x14[3]),  3,4},
  {&(_ZTV5E7x14[8]),  8,9},
};
extern VTBL_ENTRY _ZTI5E7x14[];
extern  VTBL_ENTRY _ZTV5E7x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x14[];
static VTBL_ENTRY alt_thunk_names395[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn16_N5E7x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E7x14 = {  "E7x14", // class name
  bases_E7x14, 4,
  &(vtc_E7x14[0]), // expected_vtbl_contents
  &(vtt_E7x14[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E7x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E7x14),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E7x14),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names395,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x14y0  : E7x14 , F1 {
  int ff;
  ~G7x14y0(); // tgen
  G7x14y0(); // tgen
};
//SIG(1 G7x14y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G7x14y0 ::~G7x14y0(){ note_dtor("G7x14y0", this);} // tgen
G7x14y0 ::G7x14y0(){ note_ctor("G7x14y0", this);} // tgen

static void Test_G7x14y0()
{
  extern Class_Descriptor cd_G7x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x14y0, buf);
    G7x14y0 *dp, &lv = *(dp=new (buf) G7x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x14y0)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x14*), ABISELECT(40,28), "G7x14y0");
    check_base_class_offset(lv, (B1*)(C7*)(E7x14*), 0, "G7x14y0");
    check_base_class_offset(lv, (C7*)(E7x14*), 0, "G7x14y0");
    check_base_class_offset(lv, (D0*)(E7x14*), ABISELECT(52,36), "G7x14y0");
    check_base_class_offset(lv, (E7x14*), 0, "G7x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G7x14y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G7x14y0.ff");
    test_class_info(&lv, &cd_G7x14y0);
    dp->~G7x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x14y0(Test_G7x14y0, "G7x14y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G7x14y0C1Ev();
extern void _ZN7G7x14y0D1Ev();
Name_Map name_map_G7x14y0[] = {
  NSPAIR(_ZN7G7x14y0C1Ev),
  NSPAIR(_ZN7G7x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x14;
extern VTBL_ENTRY _ZTI5E7x14[];
extern  VTBL_ENTRY _ZTV5E7x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x14y0[] = {
  // 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_E7x14,    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 _ZTI7G7x14y0[];
extern void _ZN5E7x143fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv)();
extern void ABISELECT(_ZThn40_N5E7x143fooEv,_ZThn28_N5E7x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x14y0[0]),
  (VTBL_ENTRY)&_ZN5E7x143fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G7x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G7x14y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv),
};
extern VTBL_ENTRY _ZTV7G7x14y0[];
extern void _ZN5E7x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x14__7G7x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x14[0]),
  (VTBL_ENTRY)&_ZN5E7x143fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C75E7x14__7G7x14y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C75E7x14__7G7x14y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv)();
extern void ABISELECT(_ZThn40_N5E7x143fooEv,_ZThn28_N5E7x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x14__7G7x14y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E7x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv),
};
static  VTT_ENTRY vtt_G7x14y0[] = {
  {&(_ZTV7G7x14y0[4]),  4,12},
  {&(_tg__ZTV5E7x14__7G7x14y0[4]),  4,5},
  {&(_tg__ZTV2C75E7x14__7G7x14y0[3]),  3,4},
  {&(_tg__ZTV2A1__2C75E7x14__7G7x14y0[3]),  3,4},
  {&(_tg__ZTV2A1__5E7x14__7G7x14y0[3]),  3,4},
  {&(_ZTV7G7x14y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G7x14y0[];
extern  VTBL_ENTRY _ZTV7G7x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x14y0[];
static VTBL_ENTRY alt_thunk_names396[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E7x143fooEv,_ZThn28_N5E7x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E7x143fooEv,_ZThn28_N5E7x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x14y0 = {  "G7x14y0", // class name
  bases_G7x14y0, 6,
  &(vtc_G7x14y0[0]), // expected_vtbl_contents
  &(vtt_G7x14y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G7x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x14y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x14y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names396,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x14y1  : virtual E7x14 , F1 {
  int ff;
  ~G7x14y1(); // tgen
  G7x14y1(); // tgen
};
//SIG(1 G7x14y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G7x14y1 ::~G7x14y1(){ note_dtor("G7x14y1", this);} // tgen
G7x14y1 ::G7x14y1(){ note_ctor("G7x14y1", this);} // tgen

static void Test_G7x14y1()
{
  extern Class_Descriptor cd_G7x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x14y1, buf);
    G7x14y1 *dp, &lv = *(dp=new (buf) G7x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x14y1)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x14*), ABISELECT(40,28), "G7x14y1");
    check_base_class_offset(lv, (B1*)(C7*)(E7x14*), ABISELECT(16,12), "G7x14y1");
    check_base_class_offset(lv, (C7*)(E7x14*), ABISELECT(16,12), "G7x14y1");
    check_base_class_offset(lv, (D0*)(E7x14*), ABISELECT(52,36), "G7x14y1");
    check_base_class_offset(lv, (E7x14*), ABISELECT(16,12), "G7x14y1");
    check_base_class_offset(lv, (F1*), 0, "G7x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x14y1.ff");
    test_class_info(&lv, &cd_G7x14y1);
    dp->~G7x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x14y1(Test_G7x14y1, "G7x14y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G7x14y1C1Ev();
extern void _ZN7G7x14y1D1Ev();
Name_Map name_map_G7x14y1[] = {
  NSPAIR(_ZN7G7x14y1C1Ev),
  NSPAIR(_ZN7G7x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x14;
extern VTBL_ENTRY _ZTI5E7x14[];
extern  VTBL_ENTRY _ZTV5E7x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x14y1[] = {
  // 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_E7x14,    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 _ZTI7G7x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E7x143fooEv();
extern void ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv)();
extern void ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn16_N5E7x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x14y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G7x14y1[0]),
  (VTBL_ENTRY)&_ZN5E7x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G7x14y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv),
};
extern VTBL_ENTRY _ZTV7G7x14y1[];
extern void _ZN5E7x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x14__7G7x14y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x14[0]),
  (VTBL_ENTRY)&_ZN5E7x143fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C75E7x14__7G7x14y1[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C75E7x14__7G7x14y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv)();
extern void ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn16_N5E7x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x14__7G7x14y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E7x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv),
};
static  VTT_ENTRY vtt_G7x14y1[] = {
  {&(_ZTV7G7x14y1[5]),  5,16},
  {&(_ZTV7G7x14y1[11]),  11,16},
  {&(_ZTV7G7x14y1[15]),  15,16},
  {&(_tg__ZTV5E7x14__7G7x14y1[4]),  4,5},
  {&(_tg__ZTV2C75E7x14__7G7x14y1[3]),  3,4},
  {&(_tg__ZTV2A1__2C75E7x14__7G7x14y1[3]),  3,4},
  {&(_tg__ZTV2A1__5E7x14__7G7x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x14y1[];
extern  VTBL_ENTRY _ZTV7G7x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x14y1[];
static VTBL_ENTRY alt_thunk_names397[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn16_N5E7x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn16_N5E7x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x14y1 = {  "G7x14y1", // class name
  bases_G7x14y1, 6,
  &(vtc_G7x14y1[0]), // expected_vtbl_contents
  &(vtt_G7x14y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G7x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x14y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x14y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names397,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x14y2  : E7x14 , virtual F1 {
  int ff;
  ~G7x14y2(); // tgen
  G7x14y2(); // tgen
};
//SIG(1 G7x14y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G7x14y2 ::~G7x14y2(){ note_dtor("G7x14y2", this);} // tgen
G7x14y2 ::G7x14y2(){ note_ctor("G7x14y2", this);} // tgen

static void Test_G7x14y2()
{
  extern Class_Descriptor cd_G7x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x14y2, buf);
    G7x14y2 *dp, &lv = *(dp=new (buf) G7x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x14y2)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x14*), ABISELECT(24,20), "G7x14y2");
    check_base_class_offset(lv, (B1*)(C7*)(E7x14*), 0, "G7x14y2");
    check_base_class_offset(lv, (C7*)(E7x14*), 0, "G7x14y2");
    check_base_class_offset(lv, (D0*)(E7x14*), ABISELECT(36,28), "G7x14y2");
    check_base_class_offset(lv, (E7x14*), 0, "G7x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G7x14y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G7x14y2.ff");
    test_class_info(&lv, &cd_G7x14y2);
    dp->~G7x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x14y2(Test_G7x14y2, "G7x14y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G7x14y2C1Ev();
extern void _ZN7G7x14y2D1Ev();
Name_Map name_map_G7x14y2[] = {
  NSPAIR(_ZN7G7x14y2C1Ev),
  NSPAIR(_ZN7G7x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x14;
extern VTBL_ENTRY _ZTI5E7x14[];
extern  VTBL_ENTRY _ZTV5E7x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x14y2[] = {
  // 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_E7x14,    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 _ZTI7G7x14y2[];
extern void _ZN5E7x143fooEv();
extern void ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv)();
extern void ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn20_N5E7x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G7x14y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x14y2[0]),
  (VTBL_ENTRY)&_ZN5E7x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G7x14y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G7x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G7x14y2[];
extern void _ZN5E7x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x14__7G7x14y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x14[0]),
  (VTBL_ENTRY)&_ZN5E7x143fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C75E7x14__7G7x14y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C75E7x14__7G7x14y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv)();
extern void ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn20_N5E7x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x14__7G7x14y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E7x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv),
};
static  VTT_ENTRY vtt_G7x14y2[] = {
  {&(_ZTV7G7x14y2[5]),  5,14},
  {&(_tg__ZTV5E7x14__7G7x14y2[4]),  4,5},
  {&(_tg__ZTV2C75E7x14__7G7x14y2[3]),  3,4},
  {&(_tg__ZTV2A1__2C75E7x14__7G7x14y2[3]),  3,4},
  {&(_tg__ZTV2A1__5E7x14__7G7x14y2[3]),  3,4},
  {&(_ZTV7G7x14y2[9]),  9,14},
  {&(_ZTV7G7x14y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI7G7x14y2[];
extern  VTBL_ENTRY _ZTV7G7x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x14y2[];
static VTBL_ENTRY alt_thunk_names398[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn20_N5E7x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn20_N5E7x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x14y2 = {  "G7x14y2", // class name
  bases_G7x14y2, 6,
  &(vtc_G7x14y2[0]), // expected_vtbl_contents
  &(vtt_G7x14y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G7x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x14y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x14y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names398,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x14y3  : virtual E7x14 , virtual F1 {
  int ff;
  ~G7x14y3(); // tgen
  G7x14y3(); // tgen
};
//SIG(1 G7x14y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G7x14y3 ::~G7x14y3(){ note_dtor("G7x14y3", this);} // tgen
G7x14y3 ::G7x14y3(){ note_ctor("G7x14y3", this);} // tgen

static void Test_G7x14y3()
{
  extern Class_Descriptor cd_G7x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G7x14y3, buf);
    G7x14y3 *dp, &lv = *(dp=new (buf) G7x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G7x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x14y3)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x14*), ABISELECT(40,24), "G7x14y3");
    check_base_class_offset(lv, (B1*)(C7*)(E7x14*), ABISELECT(16,8), "G7x14y3");
    check_base_class_offset(lv, (C7*)(E7x14*), ABISELECT(16,8), "G7x14y3");
    check_base_class_offset(lv, (D0*)(E7x14*), ABISELECT(52,32), "G7x14y3");
    check_base_class_offset(lv, (E7x14*), ABISELECT(16,8), "G7x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G7x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G7x14y3.ff");
    test_class_info(&lv, &cd_G7x14y3);
    dp->~G7x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x14y3(Test_G7x14y3, "G7x14y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G7x14y3C1Ev();
extern void _ZN7G7x14y3D1Ev();
Name_Map name_map_G7x14y3[] = {
  NSPAIR(_ZN7G7x14y3C1Ev),
  NSPAIR(_ZN7G7x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x14;
extern VTBL_ENTRY _ZTI5E7x14[];
extern  VTBL_ENTRY _ZTV5E7x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x14y3[] = {
  // 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_E7x14,    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 _ZTI7G7x14y3[];
extern void _ZN5E7x143fooEv();
extern void ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv)();
extern void ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn16_N5E7x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G7x14y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x14y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G7x14y3[0]),
  (VTBL_ENTRY)&_ZN5E7x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G7x14y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G7x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G7x14y3[];
extern void _ZN5E7x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x14__7G7x14y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x14[0]),
  (VTBL_ENTRY)&_ZN5E7x143fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C75E7x14__7G7x14y3[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C75E7x14__7G7x14y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv)();
extern void ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn16_N5E7x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x14__7G7x14y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E7x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv),
};
static  VTT_ENTRY vtt_G7x14y3[] = {
  {&(_ZTV7G7x14y3[6]),  6,20},
  {&(_ZTV7G7x14y3[11]),  11,20},
  {&(_ZTV7G7x14y3[15]),  15,20},
  {&(_ZTV7G7x14y3[19]),  19,20},
  {&(_tg__ZTV5E7x14__7G7x14y3[4]),  4,5},
  {&(_tg__ZTV2C75E7x14__7G7x14y3[3]),  3,4},
  {&(_tg__ZTV2A1__2C75E7x14__7G7x14y3[3]),  3,4},
  {&(_tg__ZTV2A1__5E7x14__7G7x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x14y3[];
extern  VTBL_ENTRY _ZTV7G7x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x14y3[];
static VTBL_ENTRY alt_thunk_names399[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn16_N5E7x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn16_N5E7x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x14y3 = {  "G7x14y3", // class name
  bases_G7x14y3, 6,
  &(vtc_G7x14y3[0]), // expected_vtbl_contents
  &(vtt_G7x14y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G7x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x14y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x14y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names399,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x14y4  : E7x14 , F0 {
  int ff;
  ~G7x14y4(); // tgen
  G7x14y4(); // tgen
};
//SIG(1 G7x14y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G7x14y4 ::~G7x14y4(){ note_dtor("G7x14y4", this);} // tgen
G7x14y4 ::G7x14y4(){ note_ctor("G7x14y4", this);} // tgen

static void Test_G7x14y4()
{
  extern Class_Descriptor cd_G7x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G7x14y4, buf);
    G7x14y4 *dp, &lv = *(dp=new (buf) G7x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G7x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x14y4)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x14*), ABISELECT(32,24), "G7x14y4");
    check_base_class_offset(lv, (B1*)(C7*)(E7x14*), 0, "G7x14y4");
    check_base_class_offset(lv, (C7*)(E7x14*), 0, "G7x14y4");
    check_base_class_offset(lv, (D0*)(E7x14*), ABISELECT(44,32), "G7x14y4");
    check_base_class_offset(lv, (E7x14*), 0, "G7x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G7x14y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G7x14y4.ff");
    test_class_info(&lv, &cd_G7x14y4);
    dp->~G7x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x14y4(Test_G7x14y4, "G7x14y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G7x14y4C1Ev();
extern void _ZN7G7x14y4D1Ev();
Name_Map name_map_G7x14y4[] = {
  NSPAIR(_ZN7G7x14y4C1Ev),
  NSPAIR(_ZN7G7x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x14;
extern VTBL_ENTRY _ZTI5E7x14[];
extern  VTBL_ENTRY _ZTV5E7x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x14y4[] = {
  // 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_E7x14,    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 _ZTI7G7x14y4[];
extern void _ZN5E7x143fooEv();
extern void ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv)();
extern void ABISELECT(_ZThn32_N5E7x143fooEv,_ZThn24_N5E7x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x14y4[0]),
  (VTBL_ENTRY)&_ZN5E7x143fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G7x14y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv),
};
extern VTBL_ENTRY _ZTV7G7x14y4[];
extern void _ZN5E7x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x14__7G7x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x14[0]),
  (VTBL_ENTRY)&_ZN5E7x143fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C75E7x14__7G7x14y4[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C75E7x14__7G7x14y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv)();
extern void ABISELECT(_ZThn32_N5E7x143fooEv,_ZThn24_N5E7x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x14__7G7x14y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E7x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv),
};
static  VTT_ENTRY vtt_G7x14y4[] = {
  {&(_ZTV7G7x14y4[4]),  4,9},
  {&(_tg__ZTV5E7x14__7G7x14y4[4]),  4,5},
  {&(_tg__ZTV2C75E7x14__7G7x14y4[3]),  3,4},
  {&(_tg__ZTV2A1__2C75E7x14__7G7x14y4[3]),  3,4},
  {&(_tg__ZTV2A1__5E7x14__7G7x14y4[3]),  3,4},
  {&(_ZTV7G7x14y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G7x14y4[];
extern  VTBL_ENTRY _ZTV7G7x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x14y4[];
static VTBL_ENTRY alt_thunk_names400[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x143fooEv,_ZThn24_N5E7x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x143fooEv,_ZThn24_N5E7x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x14y4 = {  "G7x14y4", // class name
  bases_G7x14y4, 6,
  &(vtc_G7x14y4[0]), // expected_vtbl_contents
  &(vtt_G7x14y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G7x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x14y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x14y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names400,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x14y5  : virtual E7x14 , F0 {
  int ff;
  ~G7x14y5(); // tgen
  G7x14y5(); // tgen
};
//SIG(1 G7x14y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G7x14y5 ::~G7x14y5(){ note_dtor("G7x14y5", this);} // tgen
G7x14y5 ::G7x14y5(){ note_ctor("G7x14y5", this);} // tgen

static void Test_G7x14y5()
{
  extern Class_Descriptor cd_G7x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x14y5, buf);
    G7x14y5 *dp, &lv = *(dp=new (buf) G7x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x14y5)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x14*), ABISELECT(40,28), "G7x14y5");
    check_base_class_offset(lv, (B1*)(C7*)(E7x14*), ABISELECT(16,12), "G7x14y5");
    check_base_class_offset(lv, (C7*)(E7x14*), ABISELECT(16,12), "G7x14y5");
    check_base_class_offset(lv, (D0*)(E7x14*), ABISELECT(52,36), "G7x14y5");
    check_base_class_offset(lv, (E7x14*), ABISELECT(16,12), "G7x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G7x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x14y5.ff");
    test_class_info(&lv, &cd_G7x14y5);
    dp->~G7x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x14y5(Test_G7x14y5, "G7x14y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G7x14y5C1Ev();
extern void _ZN7G7x14y5D1Ev();
Name_Map name_map_G7x14y5[] = {
  NSPAIR(_ZN7G7x14y5C1Ev),
  NSPAIR(_ZN7G7x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x14;
extern VTBL_ENTRY _ZTI5E7x14[];
extern  VTBL_ENTRY _ZTV5E7x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x14y5[] = {
  // 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_E7x14,    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 _ZTI7G7x14y5[];
extern void _ZN5E7x143fooEv();
extern void ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv)();
extern void ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn16_N5E7x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x14y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x14y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G7x14y5[0]),
  (VTBL_ENTRY)&_ZN5E7x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G7x14y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv),
};
extern VTBL_ENTRY _ZTV7G7x14y5[];
extern void _ZN5E7x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x14__7G7x14y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x14[0]),
  (VTBL_ENTRY)&_ZN5E7x143fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C75E7x14__7G7x14y5[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C75E7x14__7G7x14y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv)();
extern void ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn16_N5E7x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x14__7G7x14y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E7x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv),
};
static  VTT_ENTRY vtt_G7x14y5[] = {
  {&(_ZTV7G7x14y5[5]),  5,15},
  {&(_ZTV7G7x14y5[10]),  10,15},
  {&(_ZTV7G7x14y5[14]),  14,15},
  {&(_tg__ZTV5E7x14__7G7x14y5[4]),  4,5},
  {&(_tg__ZTV2C75E7x14__7G7x14y5[3]),  3,4},
  {&(_tg__ZTV2A1__2C75E7x14__7G7x14y5[3]),  3,4},
  {&(_tg__ZTV2A1__5E7x14__7G7x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x14y5[];
extern  VTBL_ENTRY _ZTV7G7x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x14y5[];
static VTBL_ENTRY alt_thunk_names401[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn16_N5E7x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn16_N5E7x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x14y5 = {  "G7x14y5", // class name
  bases_G7x14y5, 6,
  &(vtc_G7x14y5[0]), // expected_vtbl_contents
  &(vtt_G7x14y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G7x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x14y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x14y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names401,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x14y6  : E7x14 , virtual F0 {
  int ff;
  ~G7x14y6(); // tgen
  G7x14y6(); // tgen
};
//SIG(1 G7x14y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G7x14y6 ::~G7x14y6(){ note_dtor("G7x14y6", this);} // tgen
G7x14y6 ::G7x14y6(){ note_ctor("G7x14y6", this);} // tgen

static void Test_G7x14y6()
{
  extern Class_Descriptor cd_G7x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G7x14y6, buf);
    G7x14y6 *dp, &lv = *(dp=new (buf) G7x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G7x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x14y6)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x14*), ABISELECT(24,20), "G7x14y6");
    check_base_class_offset(lv, (B1*)(C7*)(E7x14*), 0, "G7x14y6");
    check_base_class_offset(lv, (C7*)(E7x14*), 0, "G7x14y6");
    check_base_class_offset(lv, (D0*)(E7x14*), ABISELECT(36,28), "G7x14y6");
    check_base_class_offset(lv, (E7x14*), 0, "G7x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G7x14y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G7x14y6.ff");
    test_class_info(&lv, &cd_G7x14y6);
    dp->~G7x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x14y6(Test_G7x14y6, "G7x14y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G7x14y6C1Ev();
extern void _ZN7G7x14y6D1Ev();
Name_Map name_map_G7x14y6[] = {
  NSPAIR(_ZN7G7x14y6C1Ev),
  NSPAIR(_ZN7G7x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x14;
extern VTBL_ENTRY _ZTI5E7x14[];
extern  VTBL_ENTRY _ZTV5E7x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x14y6[] = {
  // 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_E7x14,    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 _ZTI7G7x14y6[];
extern void _ZN5E7x143fooEv();
extern void ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv)();
extern void ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn20_N5E7x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x14y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x14y6[0]),
  (VTBL_ENTRY)&_ZN5E7x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G7x14y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv),
};
extern VTBL_ENTRY _ZTV7G7x14y6[];
extern void _ZN5E7x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x14__7G7x14y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x14[0]),
  (VTBL_ENTRY)&_ZN5E7x143fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C75E7x14__7G7x14y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C75E7x14__7G7x14y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv)();
extern void ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn20_N5E7x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x14__7G7x14y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E7x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv),
};
static  VTT_ENTRY vtt_G7x14y6[] = {
  {&(_ZTV7G7x14y6[5]),  5,10},
  {&(_tg__ZTV5E7x14__7G7x14y6[4]),  4,5},
  {&(_tg__ZTV2C75E7x14__7G7x14y6[3]),  3,4},
  {&(_tg__ZTV2A1__2C75E7x14__7G7x14y6[3]),  3,4},
  {&(_tg__ZTV2A1__5E7x14__7G7x14y6[3]),  3,4},
  {&(_ZTV7G7x14y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G7x14y6[];
extern  VTBL_ENTRY _ZTV7G7x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x14y6[];
static VTBL_ENTRY alt_thunk_names402[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn20_N5E7x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn20_N5E7x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x14y6 = {  "G7x14y6", // class name
  bases_G7x14y6, 6,
  &(vtc_G7x14y6[0]), // expected_vtbl_contents
  &(vtt_G7x14y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G7x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x14y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x14y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names402,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x14y7  : virtual E7x14 , virtual F0 {
  int ff;
  ~G7x14y7(); // tgen
  G7x14y7(); // tgen
};
//SIG(1 G7x14y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G7x14y7 ::~G7x14y7(){ note_dtor("G7x14y7", this);} // tgen
G7x14y7 ::G7x14y7(){ note_ctor("G7x14y7", this);} // tgen

static void Test_G7x14y7()
{
  extern Class_Descriptor cd_G7x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G7x14y7, buf);
    G7x14y7 *dp, &lv = *(dp=new (buf) G7x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G7x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x14y7)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x14*), ABISELECT(40,24), "G7x14y7");
    check_base_class_offset(lv, (B1*)(C7*)(E7x14*), ABISELECT(16,8), "G7x14y7");
    check_base_class_offset(lv, (C7*)(E7x14*), ABISELECT(16,8), "G7x14y7");
    check_base_class_offset(lv, (D0*)(E7x14*), ABISELECT(52,32), "G7x14y7");
    check_base_class_offset(lv, (E7x14*), ABISELECT(16,8), "G7x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G7x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G7x14y7.ff");
    test_class_info(&lv, &cd_G7x14y7);
    dp->~G7x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x14y7(Test_G7x14y7, "G7x14y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G7x14y7C1Ev();
extern void _ZN7G7x14y7D1Ev();
Name_Map name_map_G7x14y7[] = {
  NSPAIR(_ZN7G7x14y7C1Ev),
  NSPAIR(_ZN7G7x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x14;
extern VTBL_ENTRY _ZTI5E7x14[];
extern  VTBL_ENTRY _ZTV5E7x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x14y7[] = {
  // 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_E7x14,    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 _ZTI7G7x14y7[];
extern void _ZN5E7x143fooEv();
extern void ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv)();
extern void ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn16_N5E7x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x14y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x14y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G7x14y7[0]),
  (VTBL_ENTRY)&_ZN5E7x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G7x14y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv),
};
extern VTBL_ENTRY _ZTV7G7x14y7[];
extern void _ZN5E7x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x14__7G7x14y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x14[0]),
  (VTBL_ENTRY)&_ZN5E7x143fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C75E7x14__7G7x14y7[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C75E7x14__7G7x14y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv)();
extern void ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn16_N5E7x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x14__7G7x14y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E7x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv),
};
static  VTT_ENTRY vtt_G7x14y7[] = {
  {&(_ZTV7G7x14y7[6]),  6,16},
  {&(_ZTV7G7x14y7[11]),  11,16},
  {&(_ZTV7G7x14y7[15]),  15,16},
  {&(_tg__ZTV5E7x14__7G7x14y7[4]),  4,5},
  {&(_tg__ZTV2C75E7x14__7G7x14y7[3]),  3,4},
  {&(_tg__ZTV2A1__2C75E7x14__7G7x14y7[3]),  3,4},
  {&(_tg__ZTV2A1__5E7x14__7G7x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x14y7[];
extern  VTBL_ENTRY _ZTV7G7x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x14y7[];
static VTBL_ENTRY alt_thunk_names403[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x143fooEv,_ZTv0_n12_N5E7x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn16_N5E7x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x143fooEv,_ZThn16_N5E7x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x14y7 = {  "G7x14y7", // class name
  bases_G7x14y7, 6,
  &(vtc_G7x14y7[0]), // expected_vtbl_contents
  &(vtt_G7x14y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G7x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x14y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x14y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names403,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E8x14  : C8 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E8x143fooEv
  ~E8x14(); // tgen
  E8x14(); // tgen
};
//SIG(-1 E8x14) C1{ BC2{ BC3{ Fi} VBC4{ Fi} Fi} VBC5{ Fi} v1 Fi}


void  E8x14 ::foo(){vfunc_called(this, "_ZN5E8x143fooEv");}
E8x14 ::~E8x14(){ note_dtor("E8x14", this);} // tgen
E8x14 ::E8x14(){ note_ctor("E8x14", this);} // tgen

static void Test_E8x14()
{
  extern Class_Descriptor cd_E8x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E8x14, buf);
    E8x14 *dp, &lv = *(dp=new (buf) E8x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E8x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E8x14)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(8,4), "E8x14");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(20,16), "E8x14");
    check_base_class_offset(lv, (C8*), 0, "E8x14");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E8x14");
    check_field_offset(lv, fd, ABISELECT(16,12), "E8x14.fd");
    test_class_info(&lv, &cd_E8x14);
    dp->~E8x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE8x14(Test_E8x14, "E8x14", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E8x14C1Ev();
extern void _ZN5E8x14D1Ev();
Name_Map name_map_E8x14[] = {
  NSPAIR(_ZN5E8x14C1Ev),
  NSPAIR(_ZN5E8x14D1Ev),
  {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_E8x14[] = {
  // 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 _ZTI5E8x14[];
extern void _ZN5E8x143fooEv();
static  VTBL_ENTRY vtc_E8x14[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x14[0]),
  (VTBL_ENTRY)&_ZN5E8x143fooEv,
};
extern VTBL_ENTRY _ZTV5E8x14[];
static  VTBL_ENTRY _tg__ZTV2C8__5E8x14[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_E8x14[] = {
  {&(_ZTV5E8x14[4]),  4,5},
  {&(_tg__ZTV2C8__5E8x14[3]),  3,3},
};
extern VTBL_ENTRY _ZTI5E8x14[];
extern  VTBL_ENTRY _ZTV5E8x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x14[];
Class_Descriptor cd_E8x14 = {  "E8x14", // class name
  bases_E8x14, 4,
  &(vtc_E8x14[0]), // expected_vtbl_contents
  &(vtt_E8x14[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E8x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E8x14),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E8x14),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  G8x14y0  : E8x14 , F1 {
  int ff;
  ~G8x14y0(); // tgen
  G8x14y0(); // tgen
};
//SIG(1 G8x14y0) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G8x14y0 ::~G8x14y0(){ note_dtor("G8x14y0", this);} // tgen
G8x14y0 ::G8x14y0(){ note_ctor("G8x14y0", this);} // tgen

static void Test_G8x14y0()
{
  extern Class_Descriptor cd_G8x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x14y0, buf);
    G8x14y0 *dp, &lv = *(dp=new (buf) G8x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x14y0)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x14*), ABISELECT(8,4), "G8x14y0");
    check_base_class_offset(lv, (B0*)(C8*)(E8x14*), ABISELECT(40,28), "G8x14y0");
    check_base_class_offset(lv, (C8*)(E8x14*), 0, "G8x14y0");
    check_base_class_offset(lv, (D0*)(E8x14*), ABISELECT(44,32), "G8x14y0");
    check_base_class_offset(lv, (E8x14*), 0, "G8x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G8x14y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G8x14y0.ff");
    test_class_info(&lv, &cd_G8x14y0);
    dp->~G8x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x14y0(Test_G8x14y0, "G8x14y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G8x14y0C1Ev();
extern void _ZN7G8x14y0D1Ev();
Name_Map name_map_G8x14y0[] = {
  NSPAIR(_ZN7G8x14y0C1Ev),
  NSPAIR(_ZN7G8x14y0D1Ev),
  {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_E8x14;
extern VTBL_ENTRY _ZTI5E8x14[];
extern  VTBL_ENTRY _ZTV5E8x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x14y0[] = {
  // 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_E8x14,    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 _ZTI7G8x14y0[];
extern void _ZN5E8x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x14y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x14y0[0]),
  (VTBL_ENTRY)&_ZN5E8x143fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G8x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G8x14y0[];
extern void _ZN5E8x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x14__7G8x14y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x14[0]),
  (VTBL_ENTRY)&_ZN5E8x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C85E8x14__7G8x14y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x14y0[] = {
  {&(_ZTV7G8x14y0[4]),  4,8},
  {&(_tg__ZTV5E8x14__7G8x14y0[4]),  4,5},
  {&(_tg__ZTV2C85E8x14__7G8x14y0[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x14y0[];
extern  VTBL_ENTRY _ZTV7G8x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x14y0[];
Class_Descriptor cd_G8x14y0 = {  "G8x14y0", // class name
  bases_G8x14y0, 6,
  &(vtc_G8x14y0[0]), // expected_vtbl_contents
  &(vtt_G8x14y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G8x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x14y0),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x14y0),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  G8x14y1  : virtual E8x14 , F1 {
  int ff;
  ~G8x14y1(); // tgen
  G8x14y1(); // tgen
};
//SIG(1 G8x14y1) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G8x14y1 ::~G8x14y1(){ note_dtor("G8x14y1", this);} // tgen
G8x14y1 ::G8x14y1(){ note_ctor("G8x14y1", this);} // tgen

static void Test_G8x14y1()
{
  extern Class_Descriptor cd_G8x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x14y1, buf);
    G8x14y1 *dp, &lv = *(dp=new (buf) G8x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x14y1)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x14*), ABISELECT(24,16), "G8x14y1");
    check_base_class_offset(lv, (B0*)(C8*)(E8x14*), ABISELECT(36,28), "G8x14y1");
    check_base_class_offset(lv, (C8*)(E8x14*), ABISELECT(16,12), "G8x14y1");
    check_base_class_offset(lv, (D0*)(E8x14*), ABISELECT(40,32), "G8x14y1");
    check_base_class_offset(lv, (E8x14*), ABISELECT(16,12), "G8x14y1");
    check_base_class_offset(lv, (F1*), 0, "G8x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x14y1.ff");
    test_class_info(&lv, &cd_G8x14y1);
    dp->~G8x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x14y1(Test_G8x14y1, "G8x14y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G8x14y1C1Ev();
extern void _ZN7G8x14y1D1Ev();
Name_Map name_map_G8x14y1[] = {
  NSPAIR(_ZN7G8x14y1C1Ev),
  NSPAIR(_ZN7G8x14y1D1Ev),
  {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_E8x14;
extern VTBL_ENTRY _ZTI5E8x14[];
extern  VTBL_ENTRY _ZTV5E8x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x14y1[] = {
  // 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_E8x14,    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 _ZTI7G8x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E8x143fooEv();
static  VTBL_ENTRY vtc_G8x14y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G8x14y1[0]),
  (VTBL_ENTRY)&_ZN5E8x143fooEv,
};
extern VTBL_ENTRY _ZTV7G8x14y1[];
extern void _ZN5E8x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x14__7G8x14y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x14[0]),
  (VTBL_ENTRY)&_ZN5E8x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C85E8x14__7G8x14y1[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x14y1[] = {
  {&(_ZTV7G8x14y1[5]),  5,12},
  {&(_ZTV7G8x14y1[11]),  11,12},
  {&(_tg__ZTV5E8x14__7G8x14y1[4]),  4,5},
  {&(_tg__ZTV2C85E8x14__7G8x14y1[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x14y1[];
extern  VTBL_ENTRY _ZTV7G8x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x14y1[];
Class_Descriptor cd_G8x14y1 = {  "G8x14y1", // class name
  bases_G8x14y1, 6,
  &(vtc_G8x14y1[0]), // expected_vtbl_contents
  &(vtt_G8x14y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G8x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x14y1),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x14y1),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  G8x14y2  : E8x14 , virtual F1 {
  int ff;
  ~G8x14y2(); // tgen
  G8x14y2(); // tgen
};
//SIG(1 G8x14y2) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G8x14y2 ::~G8x14y2(){ note_dtor("G8x14y2", this);} // tgen
G8x14y2 ::G8x14y2(){ note_ctor("G8x14y2", this);} // tgen

static void Test_G8x14y2()
{
  extern Class_Descriptor cd_G8x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x14y2, buf);
    G8x14y2 *dp, &lv = *(dp=new (buf) G8x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x14y2)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x14*), ABISELECT(8,4), "G8x14y2");
    check_base_class_offset(lv, (B0*)(C8*)(E8x14*), ABISELECT(24,20), "G8x14y2");
    check_base_class_offset(lv, (C8*)(E8x14*), 0, "G8x14y2");
    check_base_class_offset(lv, (D0*)(E8x14*), ABISELECT(28,24), "G8x14y2");
    check_base_class_offset(lv, (E8x14*), 0, "G8x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G8x14y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G8x14y2.ff");
    test_class_info(&lv, &cd_G8x14y2);
    dp->~G8x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x14y2(Test_G8x14y2, "G8x14y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G8x14y2C1Ev();
extern void _ZN7G8x14y2D1Ev();
Name_Map name_map_G8x14y2[] = {
  NSPAIR(_ZN7G8x14y2C1Ev),
  NSPAIR(_ZN7G8x14y2D1Ev),
  {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_E8x14;
extern VTBL_ENTRY _ZTI5E8x14[];
extern  VTBL_ENTRY _ZTV5E8x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x14y2[] = {
  // 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_E8x14,    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 _ZTI7G8x14y2[];
extern void _ZN5E8x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x14y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x14y2[0]),
  (VTBL_ENTRY)&_ZN5E8x143fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G8x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G8x14y2[];
extern void _ZN5E8x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x14__7G8x14y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x14[0]),
  (VTBL_ENTRY)&_ZN5E8x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C85E8x14__7G8x14y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x14y2[] = {
  {&(_ZTV7G8x14y2[5]),  5,10},
  {&(_tg__ZTV5E8x14__7G8x14y2[4]),  4,5},
  {&(_tg__ZTV2C85E8x14__7G8x14y2[3]),  3,3},
  {&(_ZTV7G8x14y2[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G8x14y2[];
extern  VTBL_ENTRY _ZTV7G8x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x14y2[];
Class_Descriptor cd_G8x14y2 = {  "G8x14y2", // class name
  bases_G8x14y2, 6,
  &(vtc_G8x14y2[0]), // expected_vtbl_contents
  &(vtt_G8x14y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G8x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x14y2),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x14y2),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  G8x14y3  : virtual E8x14 , virtual F1 {
  int ff;
  ~G8x14y3(); // tgen
  G8x14y3(); // tgen
};
//SIG(1 G8x14y3) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G8x14y3 ::~G8x14y3(){ note_dtor("G8x14y3", this);} // tgen
G8x14y3 ::G8x14y3(){ note_ctor("G8x14y3", this);} // tgen

static void Test_G8x14y3()
{
  extern Class_Descriptor cd_G8x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G8x14y3, buf);
    G8x14y3 *dp, &lv = *(dp=new (buf) G8x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G8x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x14y3)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x14*), ABISELECT(24,12), "G8x14y3");
    check_base_class_offset(lv, (B0*)(C8*)(E8x14*), ABISELECT(36,24), "G8x14y3");
    check_base_class_offset(lv, (C8*)(E8x14*), ABISELECT(16,8), "G8x14y3");
    check_base_class_offset(lv, (D0*)(E8x14*), ABISELECT(40,28), "G8x14y3");
    check_base_class_offset(lv, (E8x14*), ABISELECT(16,8), "G8x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G8x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G8x14y3.ff");
    test_class_info(&lv, &cd_G8x14y3);
    dp->~G8x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x14y3(Test_G8x14y3, "G8x14y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G8x14y3C1Ev();
extern void _ZN7G8x14y3D1Ev();
Name_Map name_map_G8x14y3[] = {
  NSPAIR(_ZN7G8x14y3C1Ev),
  NSPAIR(_ZN7G8x14y3D1Ev),
  {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_E8x14;
extern VTBL_ENTRY _ZTI5E8x14[];
extern  VTBL_ENTRY _ZTV5E8x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x14y3[] = {
  // 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_E8x14,    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 _ZTI7G8x14y3[];
extern void _ZN5E8x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x14y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x14y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G8x14y3[0]),
  (VTBL_ENTRY)&_ZN5E8x143fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G8x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G8x14y3[];
extern void _ZN5E8x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x14__7G8x14y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x14[0]),
  (VTBL_ENTRY)&_ZN5E8x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C85E8x14__7G8x14y3[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x14y3[] = {
  {&(_ZTV7G8x14y3[6]),  6,16},
  {&(_ZTV7G8x14y3[11]),  11,16},
  {&(_ZTV7G8x14y3[15]),  15,16},
  {&(_tg__ZTV5E8x14__7G8x14y3[4]),  4,5},
  {&(_tg__ZTV2C85E8x14__7G8x14y3[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x14y3[];
extern  VTBL_ENTRY _ZTV7G8x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x14y3[];
Class_Descriptor cd_G8x14y3 = {  "G8x14y3", // class name
  bases_G8x14y3, 6,
  &(vtc_G8x14y3[0]), // expected_vtbl_contents
  &(vtt_G8x14y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G8x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x14y3),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x14y3),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  G8x14y4  : E8x14 , F0 {
  int ff;
  ~G8x14y4(); // tgen
  G8x14y4(); // tgen
};
//SIG(1 G8x14y4) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G8x14y4 ::~G8x14y4(){ note_dtor("G8x14y4", this);} // tgen
G8x14y4 ::G8x14y4(){ note_ctor("G8x14y4", this);} // tgen

static void Test_G8x14y4()
{
  extern Class_Descriptor cd_G8x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G8x14y4, buf);
    G8x14y4 *dp, &lv = *(dp=new (buf) G8x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G8x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x14y4)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x14*), ABISELECT(8,4), "G8x14y4");
    check_base_class_offset(lv, (B0*)(C8*)(E8x14*), ABISELECT(28,24), "G8x14y4");
    check_base_class_offset(lv, (C8*)(E8x14*), 0, "G8x14y4");
    check_base_class_offset(lv, (D0*)(E8x14*), ABISELECT(32,28), "G8x14y4");
    check_base_class_offset(lv, (E8x14*), 0, "G8x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G8x14y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G8x14y4.ff");
    test_class_info(&lv, &cd_G8x14y4);
    dp->~G8x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x14y4(Test_G8x14y4, "G8x14y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G8x14y4C1Ev();
extern void _ZN7G8x14y4D1Ev();
Name_Map name_map_G8x14y4[] = {
  NSPAIR(_ZN7G8x14y4C1Ev),
  NSPAIR(_ZN7G8x14y4D1Ev),
  {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_E8x14;
extern VTBL_ENTRY _ZTI5E8x14[];
extern  VTBL_ENTRY _ZTV5E8x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x14y4[] = {
  // 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_E8x14,    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 _ZTI7G8x14y4[];
extern void _ZN5E8x143fooEv();
static  VTBL_ENTRY vtc_G8x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x14y4[0]),
  (VTBL_ENTRY)&_ZN5E8x143fooEv,
};
extern VTBL_ENTRY _ZTV7G8x14y4[];
extern void _ZN5E8x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x14__7G8x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x14[0]),
  (VTBL_ENTRY)&_ZN5E8x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C85E8x14__7G8x14y4[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x14y4[] = {
  {&(_ZTV7G8x14y4[4]),  4,5},
  {&(_tg__ZTV5E8x14__7G8x14y4[4]),  4,5},
  {&(_tg__ZTV2C85E8x14__7G8x14y4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x14y4[];
extern  VTBL_ENTRY _ZTV7G8x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x14y4[];
Class_Descriptor cd_G8x14y4 = {  "G8x14y4", // class name
  bases_G8x14y4, 6,
  &(vtc_G8x14y4[0]), // expected_vtbl_contents
  &(vtt_G8x14y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G8x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x14y4),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x14y4),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  G8x14y5  : virtual E8x14 , F0 {
  int ff;
  ~G8x14y5(); // tgen
  G8x14y5(); // tgen
};
//SIG(1 G8x14y5) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G8x14y5 ::~G8x14y5(){ note_dtor("G8x14y5", this);} // tgen
G8x14y5 ::G8x14y5(){ note_ctor("G8x14y5", this);} // tgen

static void Test_G8x14y5()
{
  extern Class_Descriptor cd_G8x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x14y5, buf);
    G8x14y5 *dp, &lv = *(dp=new (buf) G8x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x14y5)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x14*), ABISELECT(24,16), "G8x14y5");
    check_base_class_offset(lv, (B0*)(C8*)(E8x14*), ABISELECT(36,28), "G8x14y5");
    check_base_class_offset(lv, (C8*)(E8x14*), ABISELECT(16,12), "G8x14y5");
    check_base_class_offset(lv, (D0*)(E8x14*), ABISELECT(40,32), "G8x14y5");
    check_base_class_offset(lv, (E8x14*), ABISELECT(16,12), "G8x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G8x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x14y5.ff");
    test_class_info(&lv, &cd_G8x14y5);
    dp->~G8x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x14y5(Test_G8x14y5, "G8x14y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G8x14y5C1Ev();
extern void _ZN7G8x14y5D1Ev();
Name_Map name_map_G8x14y5[] = {
  NSPAIR(_ZN7G8x14y5C1Ev),
  NSPAIR(_ZN7G8x14y5D1Ev),
  {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_E8x14;
extern VTBL_ENTRY _ZTI5E8x14[];
extern  VTBL_ENTRY _ZTV5E8x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x14y5[] = {
  // 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_E8x14,    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 _ZTI7G8x14y5[];
extern void _ZN5E8x143fooEv();
static  VTBL_ENTRY vtc_G8x14y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x14y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G8x14y5[0]),
  (VTBL_ENTRY)&_ZN5E8x143fooEv,
};
extern VTBL_ENTRY _ZTV7G8x14y5[];
extern void _ZN5E8x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x14__7G8x14y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x14[0]),
  (VTBL_ENTRY)&_ZN5E8x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C85E8x14__7G8x14y5[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x14y5[] = {
  {&(_ZTV7G8x14y5[5]),  5,11},
  {&(_ZTV7G8x14y5[10]),  10,11},
  {&(_tg__ZTV5E8x14__7G8x14y5[4]),  4,5},
  {&(_tg__ZTV2C85E8x14__7G8x14y5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x14y5[];
extern  VTBL_ENTRY _ZTV7G8x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x14y5[];
Class_Descriptor cd_G8x14y5 = {  "G8x14y5", // class name
  bases_G8x14y5, 6,
  &(vtc_G8x14y5[0]), // expected_vtbl_contents
  &(vtt_G8x14y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G8x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x14y5),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x14y5),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  G8x14y6  : E8x14 , virtual F0 {
  int ff;
  ~G8x14y6(); // tgen
  G8x14y6(); // tgen
};
//SIG(1 G8x14y6) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G8x14y6 ::~G8x14y6(){ note_dtor("G8x14y6", this);} // tgen
G8x14y6 ::G8x14y6(){ note_ctor("G8x14y6", this);} // tgen

static void Test_G8x14y6()
{
  extern Class_Descriptor cd_G8x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G8x14y6, buf);
    G8x14y6 *dp, &lv = *(dp=new (buf) G8x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G8x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x14y6)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x14*), ABISELECT(8,4), "G8x14y6");
    check_base_class_offset(lv, (B0*)(C8*)(E8x14*), ABISELECT(24,20), "G8x14y6");
    check_base_class_offset(lv, (C8*)(E8x14*), 0, "G8x14y6");
    check_base_class_offset(lv, (D0*)(E8x14*), ABISELECT(28,24), "G8x14y6");
    check_base_class_offset(lv, (E8x14*), 0, "G8x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G8x14y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G8x14y6.ff");
    test_class_info(&lv, &cd_G8x14y6);
    dp->~G8x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x14y6(Test_G8x14y6, "G8x14y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G8x14y6C1Ev();
extern void _ZN7G8x14y6D1Ev();
Name_Map name_map_G8x14y6[] = {
  NSPAIR(_ZN7G8x14y6C1Ev),
  NSPAIR(_ZN7G8x14y6D1Ev),
  {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_E8x14;
extern VTBL_ENTRY _ZTI5E8x14[];
extern  VTBL_ENTRY _ZTV5E8x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x14y6[] = {
  // 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_E8x14,    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 _ZTI7G8x14y6[];
extern void _ZN5E8x143fooEv();
static  VTBL_ENTRY vtc_G8x14y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x14y6[0]),
  (VTBL_ENTRY)&_ZN5E8x143fooEv,
};
extern VTBL_ENTRY _ZTV7G8x14y6[];
extern void _ZN5E8x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x14__7G8x14y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x14[0]),
  (VTBL_ENTRY)&_ZN5E8x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C85E8x14__7G8x14y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x14y6[] = {
  {&(_ZTV7G8x14y6[5]),  5,6},
  {&(_tg__ZTV5E8x14__7G8x14y6[4]),  4,5},
  {&(_tg__ZTV2C85E8x14__7G8x14y6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x14y6[];
extern  VTBL_ENTRY _ZTV7G8x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x14y6[];
Class_Descriptor cd_G8x14y6 = {  "G8x14y6", // class name
  bases_G8x14y6, 6,
  &(vtc_G8x14y6[0]), // expected_vtbl_contents
  &(vtt_G8x14y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G8x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x14y6),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x14y6),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  G8x14y7  : virtual E8x14 , virtual F0 {
  int ff;
  ~G8x14y7(); // tgen
  G8x14y7(); // tgen
};
//SIG(1 G8x14y7) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G8x14y7 ::~G8x14y7(){ note_dtor("G8x14y7", this);} // tgen
G8x14y7 ::G8x14y7(){ note_ctor("G8x14y7", this);} // tgen

static void Test_G8x14y7()
{
  extern Class_Descriptor cd_G8x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x14y7, buf);
    G8x14y7 *dp, &lv = *(dp=new (buf) G8x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x14y7)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x14*), ABISELECT(24,12), "G8x14y7");
    check_base_class_offset(lv, (B0*)(C8*)(E8x14*), ABISELECT(36,24), "G8x14y7");
    check_base_class_offset(lv, (C8*)(E8x14*), ABISELECT(16,8), "G8x14y7");
    check_base_class_offset(lv, (D0*)(E8x14*), ABISELECT(40,28), "G8x14y7");
    check_base_class_offset(lv, (E8x14*), ABISELECT(16,8), "G8x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G8x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G8x14y7.ff");
    test_class_info(&lv, &cd_G8x14y7);
    dp->~G8x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x14y7(Test_G8x14y7, "G8x14y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G8x14y7C1Ev();
extern void _ZN7G8x14y7D1Ev();
Name_Map name_map_G8x14y7[] = {
  NSPAIR(_ZN7G8x14y7C1Ev),
  NSPAIR(_ZN7G8x14y7D1Ev),
  {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_E8x14;
extern VTBL_ENTRY _ZTI5E8x14[];
extern  VTBL_ENTRY _ZTV5E8x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x14y7[] = {
  // 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_E8x14,    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 _ZTI7G8x14y7[];
extern void _ZN5E8x143fooEv();
static  VTBL_ENTRY vtc_G8x14y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x14y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G8x14y7[0]),
  (VTBL_ENTRY)&_ZN5E8x143fooEv,
};
extern VTBL_ENTRY _ZTV7G8x14y7[];
extern void _ZN5E8x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x14__7G8x14y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x14[0]),
  (VTBL_ENTRY)&_ZN5E8x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C85E8x14__7G8x14y7[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x14y7[] = {
  {&(_ZTV7G8x14y7[6]),  6,12},
  {&(_ZTV7G8x14y7[11]),  11,12},
  {&(_tg__ZTV5E8x14__7G8x14y7[4]),  4,5},
  {&(_tg__ZTV2C85E8x14__7G8x14y7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x14y7[];
extern  VTBL_ENTRY _ZTV7G8x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x14y7[];
Class_Descriptor cd_G8x14y7 = {  "G8x14y7", // class name
  bases_G8x14y7, 6,
  &(vtc_G8x14y7[0]), // expected_vtbl_contents
  &(vtt_G8x14y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G8x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x14y7),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x14y7),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  E9x14  : C9 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E9x143fooEv
  ~E9x14(); // tgen
  E9x14(); // tgen
};
//SIG(-1 E9x14) C1{ BC2{ BC3{ v1 Fi} VBC4{ Fi} Fi} VBC5{ Fi} v1 Fi}


void  E9x14 ::foo(){vfunc_called(this, "_ZN5E9x143fooEv");}
E9x14 ::~E9x14(){ note_dtor("E9x14", this);} // tgen
E9x14 ::E9x14(){ note_ctor("E9x14", this);} // tgen

static void Test_E9x14()
{
  extern Class_Descriptor cd_E9x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E9x14, buf);
    E9x14 *dp, &lv = *(dp=new (buf) E9x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E9x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E9x14)");
    check_base_class_offset(lv, (A1*)(C9*), 0, "E9x14");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(20,16), "E9x14");
    check_base_class_offset(lv, (C9*), 0, "E9x14");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E9x14");
    check_field_offset(lv, fd, ABISELECT(16,12), "E9x14.fd");
    test_class_info(&lv, &cd_E9x14);
    dp->~E9x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE9x14(Test_E9x14, "E9x14", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E9x14C1Ev();
extern void _ZN5E9x14D1Ev();
Name_Map name_map_E9x14[] = {
  NSPAIR(_ZN5E9x14C1Ev),
  NSPAIR(_ZN5E9x14D1Ev),
  {0,0}
};
extern Class_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_E9x14[] = {
  // 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 _ZTI5E9x14[];
extern void _ZN5E9x143fooEv();
static  VTBL_ENTRY vtc_E9x14[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x14[0]),
  (VTBL_ENTRY)&_ZN5E9x143fooEv,
};
extern VTBL_ENTRY _ZTV5E9x14[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__5E9x14[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E9x14[] = {
  {&(_ZTV5E9x14[4]),  4,5},
  {&(_tg__ZTV2C9__5E9x14[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E9x14[];
extern  VTBL_ENTRY _ZTV5E9x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x14[];
Class_Descriptor cd_E9x14 = {  "E9x14", // class name
  bases_E9x14, 4,
  &(vtc_E9x14[0]), // expected_vtbl_contents
  &(vtt_E9x14[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E9x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E9x14),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E9x14),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  G9x14y0  : E9x14 , F1 {
  int ff;
  ~G9x14y0(); // tgen
  G9x14y0(); // tgen
};
//SIG(1 G9x14y0) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G9x14y0 ::~G9x14y0(){ note_dtor("G9x14y0", this);} // tgen
G9x14y0 ::G9x14y0(){ note_ctor("G9x14y0", this);} // tgen

static void Test_G9x14y0()
{
  extern Class_Descriptor cd_G9x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x14y0, buf);
    G9x14y0 *dp, &lv = *(dp=new (buf) G9x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x14y0)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x14*), 0, "G9x14y0");
    check_base_class_offset(lv, (B0*)(C9*)(E9x14*), ABISELECT(40,28), "G9x14y0");
    check_base_class_offset(lv, (C9*)(E9x14*), 0, "G9x14y0");
    check_base_class_offset(lv, (D0*)(E9x14*), ABISELECT(44,32), "G9x14y0");
    check_base_class_offset(lv, (E9x14*), 0, "G9x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G9x14y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G9x14y0.ff");
    test_class_info(&lv, &cd_G9x14y0);
    dp->~G9x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x14y0(Test_G9x14y0, "G9x14y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G9x14y0C1Ev();
extern void _ZN7G9x14y0D1Ev();
Name_Map name_map_G9x14y0[] = {
  NSPAIR(_ZN7G9x14y0C1Ev),
  NSPAIR(_ZN7G9x14y0D1Ev),
  {0,0}
};
extern Class_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_E9x14;
extern VTBL_ENTRY _ZTI5E9x14[];
extern  VTBL_ENTRY _ZTV5E9x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x14y0[] = {
  // 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_E9x14,    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 _ZTI7G9x14y0[];
extern void _ZN5E9x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x14y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x14y0[0]),
  (VTBL_ENTRY)&_ZN5E9x143fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G9x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G9x14y0[];
extern void _ZN5E9x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x14__7G9x14y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x14[0]),
  (VTBL_ENTRY)&_ZN5E9x143fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C95E9x14__7G9x14y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x14y0[] = {
  {&(_ZTV7G9x14y0[4]),  4,8},
  {&(_tg__ZTV5E9x14__7G9x14y0[4]),  4,5},
  {&(_tg__ZTV2C95E9x14__7G9x14y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x14y0[];
extern  VTBL_ENTRY _ZTV7G9x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x14y0[];
Class_Descriptor cd_G9x14y0 = {  "G9x14y0", // class name
  bases_G9x14y0, 6,
  &(vtc_G9x14y0[0]), // expected_vtbl_contents
  &(vtt_G9x14y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G9x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x14y0),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x14y0),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  G9x14y1  : virtual E9x14 , F1 {
  int ff;
  ~G9x14y1(); // tgen
  G9x14y1(); // tgen
};
//SIG(1 G9x14y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G9x14y1 ::~G9x14y1(){ note_dtor("G9x14y1", this);} // tgen
G9x14y1 ::G9x14y1(){ note_ctor("G9x14y1", this);} // tgen

static void Test_G9x14y1()
{
  extern Class_Descriptor cd_G9x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x14y1, buf);
    G9x14y1 *dp, &lv = *(dp=new (buf) G9x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x14y1)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x14*), ABISELECT(16,12), "G9x14y1");
    check_base_class_offset(lv, (B0*)(C9*)(E9x14*), ABISELECT(36,28), "G9x14y1");
    check_base_class_offset(lv, (C9*)(E9x14*), ABISELECT(16,12), "G9x14y1");
    check_base_class_offset(lv, (D0*)(E9x14*), ABISELECT(40,32), "G9x14y1");
    check_base_class_offset(lv, (E9x14*), ABISELECT(16,12), "G9x14y1");
    check_base_class_offset(lv, (F1*), 0, "G9x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x14y1.ff");
    test_class_info(&lv, &cd_G9x14y1);
    dp->~G9x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x14y1(Test_G9x14y1, "G9x14y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G9x14y1C1Ev();
extern void _ZN7G9x14y1D1Ev();
Name_Map name_map_G9x14y1[] = {
  NSPAIR(_ZN7G9x14y1C1Ev),
  NSPAIR(_ZN7G9x14y1D1Ev),
  {0,0}
};
extern Class_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_E9x14;
extern VTBL_ENTRY _ZTI5E9x14[];
extern  VTBL_ENTRY _ZTV5E9x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x14y1[] = {
  // 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_E9x14,    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 _ZTI7G9x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E9x143fooEv();
static  VTBL_ENTRY vtc_G9x14y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G9x14y1[0]),
  (VTBL_ENTRY)&_ZN5E9x143fooEv,
};
extern VTBL_ENTRY _ZTV7G9x14y1[];
extern void _ZN5E9x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x14__7G9x14y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x14[0]),
  (VTBL_ENTRY)&_ZN5E9x143fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C95E9x14__7G9x14y1[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x14y1[] = {
  {&(_ZTV7G9x14y1[5]),  5,12},
  {&(_ZTV7G9x14y1[11]),  11,12},
  {&(_tg__ZTV5E9x14__7G9x14y1[4]),  4,5},
  {&(_tg__ZTV2C95E9x14__7G9x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x14y1[];
extern  VTBL_ENTRY _ZTV7G9x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x14y1[];
Class_Descriptor cd_G9x14y1 = {  "G9x14y1", // class name
  bases_G9x14y1, 6,
  &(vtc_G9x14y1[0]), // expected_vtbl_contents
  &(vtt_G9x14y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G9x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x14y1),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x14y1),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  G9x14y2  : E9x14 , virtual F1 {
  int ff;
  ~G9x14y2(); // tgen
  G9x14y2(); // tgen
};
//SIG(1 G9x14y2) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G9x14y2 ::~G9x14y2(){ note_dtor("G9x14y2", this);} // tgen
G9x14y2 ::G9x14y2(){ note_ctor("G9x14y2", this);} // tgen

static void Test_G9x14y2()
{
  extern Class_Descriptor cd_G9x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x14y2, buf);
    G9x14y2 *dp, &lv = *(dp=new (buf) G9x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x14y2)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x14*), 0, "G9x14y2");
    check_base_class_offset(lv, (B0*)(C9*)(E9x14*), ABISELECT(24,20), "G9x14y2");
    check_base_class_offset(lv, (C9*)(E9x14*), 0, "G9x14y2");
    check_base_class_offset(lv, (D0*)(E9x14*), ABISELECT(28,24), "G9x14y2");
    check_base_class_offset(lv, (E9x14*), 0, "G9x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G9x14y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G9x14y2.ff");
    test_class_info(&lv, &cd_G9x14y2);
    dp->~G9x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x14y2(Test_G9x14y2, "G9x14y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G9x14y2C1Ev();
extern void _ZN7G9x14y2D1Ev();
Name_Map name_map_G9x14y2[] = {
  NSPAIR(_ZN7G9x14y2C1Ev),
  NSPAIR(_ZN7G9x14y2D1Ev),
  {0,0}
};
extern Class_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_E9x14;
extern VTBL_ENTRY _ZTI5E9x14[];
extern  VTBL_ENTRY _ZTV5E9x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x14y2[] = {
  // 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_E9x14,    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 _ZTI7G9x14y2[];
extern void _ZN5E9x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x14y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x14y2[0]),
  (VTBL_ENTRY)&_ZN5E9x143fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G9x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G9x14y2[];
extern void _ZN5E9x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x14__7G9x14y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x14[0]),
  (VTBL_ENTRY)&_ZN5E9x143fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C95E9x14__7G9x14y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x14y2[] = {
  {&(_ZTV7G9x14y2[5]),  5,10},
  {&(_tg__ZTV5E9x14__7G9x14y2[4]),  4,5},
  {&(_tg__ZTV2C95E9x14__7G9x14y2[3]),  3,4},
  {&(_ZTV7G9x14y2[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G9x14y2[];
extern  VTBL_ENTRY _ZTV7G9x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x14y2[];
Class_Descriptor cd_G9x14y2 = {  "G9x14y2", // class name
  bases_G9x14y2, 6,
  &(vtc_G9x14y2[0]), // expected_vtbl_contents
  &(vtt_G9x14y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G9x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x14y2),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x14y2),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  G9x14y3  : virtual E9x14 , virtual F1 {
  int ff;
  ~G9x14y3(); // tgen
  G9x14y3(); // tgen
};
//SIG(1 G9x14y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G9x14y3 ::~G9x14y3(){ note_dtor("G9x14y3", this);} // tgen
G9x14y3 ::G9x14y3(){ note_ctor("G9x14y3", this);} // tgen

static void Test_G9x14y3()
{
  extern Class_Descriptor cd_G9x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G9x14y3, buf);
    G9x14y3 *dp, &lv = *(dp=new (buf) G9x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G9x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x14y3)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x14*), ABISELECT(16,8), "G9x14y3");
    check_base_class_offset(lv, (B0*)(C9*)(E9x14*), ABISELECT(36,24), "G9x14y3");
    check_base_class_offset(lv, (C9*)(E9x14*), ABISELECT(16,8), "G9x14y3");
    check_base_class_offset(lv, (D0*)(E9x14*), ABISELECT(40,28), "G9x14y3");
    check_base_class_offset(lv, (E9x14*), ABISELECT(16,8), "G9x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G9x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G9x14y3.ff");
    test_class_info(&lv, &cd_G9x14y3);
    dp->~G9x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x14y3(Test_G9x14y3, "G9x14y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G9x14y3C1Ev();
extern void _ZN7G9x14y3D1Ev();
Name_Map name_map_G9x14y3[] = {
  NSPAIR(_ZN7G9x14y3C1Ev),
  NSPAIR(_ZN7G9x14y3D1Ev),
  {0,0}
};
extern Class_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_E9x14;
extern VTBL_ENTRY _ZTI5E9x14[];
extern  VTBL_ENTRY _ZTV5E9x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x14y3[] = {
  // 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_E9x14,    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 _ZTI7G9x14y3[];
extern void _ZN5E9x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x14y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x14y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G9x14y3[0]),
  (VTBL_ENTRY)&_ZN5E9x143fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G9x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G9x14y3[];
extern void _ZN5E9x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x14__7G9x14y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x14[0]),
  (VTBL_ENTRY)&_ZN5E9x143fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C95E9x14__7G9x14y3[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x14y3[] = {
  {&(_ZTV7G9x14y3[6]),  6,16},
  {&(_ZTV7G9x14y3[11]),  11,16},
  {&(_ZTV7G9x14y3[15]),  15,16},
  {&(_tg__ZTV5E9x14__7G9x14y3[4]),  4,5},
  {&(_tg__ZTV2C95E9x14__7G9x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x14y3[];
extern  VTBL_ENTRY _ZTV7G9x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x14y3[];
Class_Descriptor cd_G9x14y3 = {  "G9x14y3", // class name
  bases_G9x14y3, 6,
  &(vtc_G9x14y3[0]), // expected_vtbl_contents
  &(vtt_G9x14y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G9x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x14y3),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x14y3),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  G9x14y4  : E9x14 , F0 {
  int ff;
  ~G9x14y4(); // tgen
  G9x14y4(); // tgen
};
//SIG(1 G9x14y4) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G9x14y4 ::~G9x14y4(){ note_dtor("G9x14y4", this);} // tgen
G9x14y4 ::G9x14y4(){ note_ctor("G9x14y4", this);} // tgen

static void Test_G9x14y4()
{
  extern Class_Descriptor cd_G9x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G9x14y4, buf);
    G9x14y4 *dp, &lv = *(dp=new (buf) G9x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G9x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x14y4)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x14*), 0, "G9x14y4");
    check_base_class_offset(lv, (B0*)(C9*)(E9x14*), ABISELECT(28,24), "G9x14y4");
    check_base_class_offset(lv, (C9*)(E9x14*), 0, "G9x14y4");
    check_base_class_offset(lv, (D0*)(E9x14*), ABISELECT(32,28), "G9x14y4");
    check_base_class_offset(lv, (E9x14*), 0, "G9x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G9x14y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G9x14y4.ff");
    test_class_info(&lv, &cd_G9x14y4);
    dp->~G9x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x14y4(Test_G9x14y4, "G9x14y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G9x14y4C1Ev();
extern void _ZN7G9x14y4D1Ev();
Name_Map name_map_G9x14y4[] = {
  NSPAIR(_ZN7G9x14y4C1Ev),
  NSPAIR(_ZN7G9x14y4D1Ev),
  {0,0}
};
extern Class_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_E9x14;
extern VTBL_ENTRY _ZTI5E9x14[];
extern  VTBL_ENTRY _ZTV5E9x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x14y4[] = {
  // 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_E9x14,    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 _ZTI7G9x14y4[];
extern void _ZN5E9x143fooEv();
static  VTBL_ENTRY vtc_G9x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x14y4[0]),
  (VTBL_ENTRY)&_ZN5E9x143fooEv,
};
extern VTBL_ENTRY _ZTV7G9x14y4[];
extern void _ZN5E9x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x14__7G9x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x14[0]),
  (VTBL_ENTRY)&_ZN5E9x143fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C95E9x14__7G9x14y4[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x14y4[] = {
  {&(_ZTV7G9x14y4[4]),  4,5},
  {&(_tg__ZTV5E9x14__7G9x14y4[4]),  4,5},
  {&(_tg__ZTV2C95E9x14__7G9x14y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x14y4[];
extern  VTBL_ENTRY _ZTV7G9x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x14y4[];
Class_Descriptor cd_G9x14y4 = {  "G9x14y4", // class name
  bases_G9x14y4, 6,
  &(vtc_G9x14y4[0]), // expected_vtbl_contents
  &(vtt_G9x14y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G9x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x14y4),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x14y4),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  G9x14y5  : virtual E9x14 , F0 {
  int ff;
  ~G9x14y5(); // tgen
  G9x14y5(); // tgen
};
//SIG(1 G9x14y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G9x14y5 ::~G9x14y5(){ note_dtor("G9x14y5", this);} // tgen
G9x14y5 ::G9x14y5(){ note_ctor("G9x14y5", this);} // tgen

static void Test_G9x14y5()
{
  extern Class_Descriptor cd_G9x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x14y5, buf);
    G9x14y5 *dp, &lv = *(dp=new (buf) G9x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x14y5)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x14*), ABISELECT(16,12), "G9x14y5");
    check_base_class_offset(lv, (B0*)(C9*)(E9x14*), ABISELECT(36,28), "G9x14y5");
    check_base_class_offset(lv, (C9*)(E9x14*), ABISELECT(16,12), "G9x14y5");
    check_base_class_offset(lv, (D0*)(E9x14*), ABISELECT(40,32), "G9x14y5");
    check_base_class_offset(lv, (E9x14*), ABISELECT(16,12), "G9x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G9x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x14y5.ff");
    test_class_info(&lv, &cd_G9x14y5);
    dp->~G9x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x14y5(Test_G9x14y5, "G9x14y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G9x14y5C1Ev();
extern void _ZN7G9x14y5D1Ev();
Name_Map name_map_G9x14y5[] = {
  NSPAIR(_ZN7G9x14y5C1Ev),
  NSPAIR(_ZN7G9x14y5D1Ev),
  {0,0}
};
extern Class_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_E9x14;
extern VTBL_ENTRY _ZTI5E9x14[];
extern  VTBL_ENTRY _ZTV5E9x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x14y5[] = {
  // 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_E9x14,    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 _ZTI7G9x14y5[];
extern void _ZN5E9x143fooEv();
static  VTBL_ENTRY vtc_G9x14y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x14y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G9x14y5[0]),
  (VTBL_ENTRY)&_ZN5E9x143fooEv,
};
extern VTBL_ENTRY _ZTV7G9x14y5[];
extern void _ZN5E9x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x14__7G9x14y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x14[0]),
  (VTBL_ENTRY)&_ZN5E9x143fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C95E9x14__7G9x14y5[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x14y5[] = {
  {&(_ZTV7G9x14y5[5]),  5,11},
  {&(_ZTV7G9x14y5[10]),  10,11},
  {&(_tg__ZTV5E9x14__7G9x14y5[4]),  4,5},
  {&(_tg__ZTV2C95E9x14__7G9x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x14y5[];
extern  VTBL_ENTRY _ZTV7G9x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x14y5[];
Class_Descriptor cd_G9x14y5 = {  "G9x14y5", // class name
  bases_G9x14y5, 6,
  &(vtc_G9x14y5[0]), // expected_vtbl_contents
  &(vtt_G9x14y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G9x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x14y5),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x14y5),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  G9x14y6  : E9x14 , virtual F0 {
  int ff;
  ~G9x14y6(); // tgen
  G9x14y6(); // tgen
};
//SIG(1 G9x14y6) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G9x14y6 ::~G9x14y6(){ note_dtor("G9x14y6", this);} // tgen
G9x14y6 ::G9x14y6(){ note_ctor("G9x14y6", this);} // tgen

static void Test_G9x14y6()
{
  extern Class_Descriptor cd_G9x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G9x14y6, buf);
    G9x14y6 *dp, &lv = *(dp=new (buf) G9x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G9x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x14y6)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x14*), 0, "G9x14y6");
    check_base_class_offset(lv, (B0*)(C9*)(E9x14*), ABISELECT(24,20), "G9x14y6");
    check_base_class_offset(lv, (C9*)(E9x14*), 0, "G9x14y6");
    check_base_class_offset(lv, (D0*)(E9x14*), ABISELECT(28,24), "G9x14y6");
    check_base_class_offset(lv, (E9x14*), 0, "G9x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G9x14y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G9x14y6.ff");
    test_class_info(&lv, &cd_G9x14y6);
    dp->~G9x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x14y6(Test_G9x14y6, "G9x14y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G9x14y6C1Ev();
extern void _ZN7G9x14y6D1Ev();
Name_Map name_map_G9x14y6[] = {
  NSPAIR(_ZN7G9x14y6C1Ev),
  NSPAIR(_ZN7G9x14y6D1Ev),
  {0,0}
};
extern Class_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_E9x14;
extern VTBL_ENTRY _ZTI5E9x14[];
extern  VTBL_ENTRY _ZTV5E9x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x14y6[] = {
  // 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_E9x14,    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 _ZTI7G9x14y6[];
extern void _ZN5E9x143fooEv();
static  VTBL_ENTRY vtc_G9x14y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x14y6[0]),
  (VTBL_ENTRY)&_ZN5E9x143fooEv,
};
extern VTBL_ENTRY _ZTV7G9x14y6[];
extern void _ZN5E9x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x14__7G9x14y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x14[0]),
  (VTBL_ENTRY)&_ZN5E9x143fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C95E9x14__7G9x14y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x14y6[] = {
  {&(_ZTV7G9x14y6[5]),  5,6},
  {&(_tg__ZTV5E9x14__7G9x14y6[4]),  4,5},
  {&(_tg__ZTV2C95E9x14__7G9x14y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x14y6[];
extern  VTBL_ENTRY _ZTV7G9x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x14y6[];
Class_Descriptor cd_G9x14y6 = {  "G9x14y6", // class name
  bases_G9x14y6, 6,
  &(vtc_G9x14y6[0]), // expected_vtbl_contents
  &(vtt_G9x14y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G9x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x14y6),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x14y6),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  G9x14y7  : virtual E9x14 , virtual F0 {
  int ff;
  ~G9x14y7(); // tgen
  G9x14y7(); // tgen
};
//SIG(1 G9x14y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G9x14y7 ::~G9x14y7(){ note_dtor("G9x14y7", this);} // tgen
G9x14y7 ::G9x14y7(){ note_ctor("G9x14y7", this);} // tgen

static void Test_G9x14y7()
{
  extern Class_Descriptor cd_G9x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x14y7, buf);
    G9x14y7 *dp, &lv = *(dp=new (buf) G9x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x14y7)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x14*), ABISELECT(16,8), "G9x14y7");
    check_base_class_offset(lv, (B0*)(C9*)(E9x14*), ABISELECT(36,24), "G9x14y7");
    check_base_class_offset(lv, (C9*)(E9x14*), ABISELECT(16,8), "G9x14y7");
    check_base_class_offset(lv, (D0*)(E9x14*), ABISELECT(40,28), "G9x14y7");
    check_base_class_offset(lv, (E9x14*), ABISELECT(16,8), "G9x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G9x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G9x14y7.ff");
    test_class_info(&lv, &cd_G9x14y7);
    dp->~G9x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x14y7(Test_G9x14y7, "G9x14y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G9x14y7C1Ev();
extern void _ZN7G9x14y7D1Ev();
Name_Map name_map_G9x14y7[] = {
  NSPAIR(_ZN7G9x14y7C1Ev),
  NSPAIR(_ZN7G9x14y7D1Ev),
  {0,0}
};
extern Class_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_E9x14;
extern VTBL_ENTRY _ZTI5E9x14[];
extern  VTBL_ENTRY _ZTV5E9x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x14y7[] = {
  // 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_E9x14,    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 _ZTI7G9x14y7[];
extern void _ZN5E9x143fooEv();
static  VTBL_ENTRY vtc_G9x14y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x14y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G9x14y7[0]),
  (VTBL_ENTRY)&_ZN5E9x143fooEv,
};
extern VTBL_ENTRY _ZTV7G9x14y7[];
extern void _ZN5E9x143fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x14__7G9x14y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x14[0]),
  (VTBL_ENTRY)&_ZN5E9x143fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C95E9x14__7G9x14y7[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x14y7[] = {
  {&(_ZTV7G9x14y7[6]),  6,12},
  {&(_ZTV7G9x14y7[11]),  11,12},
  {&(_tg__ZTV5E9x14__7G9x14y7[4]),  4,5},
  {&(_tg__ZTV2C95E9x14__7G9x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x14y7[];
extern  VTBL_ENTRY _ZTV7G9x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x14y7[];
Class_Descriptor cd_G9x14y7 = {  "G9x14y7", // class name
  bases_G9x14y7, 6,
  &(vtc_G9x14y7[0]), // expected_vtbl_contents
  &(vtt_G9x14y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G9x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x14y7),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x14y7),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  E10x14  : C10 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E10x143fooEv
  ~E10x14(); // tgen
  E10x14(); // tgen
};
//SIG(-1 E10x14) C1{ BC2{ VBC3{ Fi} VBC4{ Fi} Fi} VBC5{ Fi} v1 Fi}


void  E10x14 ::foo(){vfunc_called(this, "_ZN6E10x143fooEv");}
E10x14 ::~E10x14(){ note_dtor("E10x14", this);} // tgen
E10x14 ::E10x14(){ note_ctor("E10x14", this);} // tgen

static void Test_E10x14()
{
  extern Class_Descriptor cd_E10x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E10x14, buf);
    E10x14 *dp, &lv = *(dp=new (buf) E10x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E10x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E10x14)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(16,12), "E10x14");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(20,16), "E10x14");
    check_base_class_offset(lv, (C10*), 0, "E10x14");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E10x14");
    check_field_offset(lv, fd, ABISELECT(12,8), "E10x14.fd");
    test_class_info(&lv, &cd_E10x14);
    dp->~E10x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE10x14(Test_E10x14, "E10x14", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6E10x14C1Ev();
extern void _ZN6E10x14D1Ev();
Name_Map name_map_E10x14[] = {
  NSPAIR(_ZN6E10x14C1Ev),
  NSPAIR(_ZN6E10x14D1Ev),
  {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_E10x14[] = {
  // 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 _ZTI6E10x14[];
extern void _ZN6E10x143fooEv();
static  VTBL_ENTRY vtc_E10x14[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x14[0]),
  (VTBL_ENTRY)&_ZN6E10x143fooEv,
};
extern VTBL_ENTRY _ZTV6E10x14[];
static  VTBL_ENTRY _tg__ZTV3C10__6E10x14[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_E10x14[] = {
  {&(_ZTV6E10x14[5]),  5,6},
  {&(_tg__ZTV3C10__6E10x14[4]),  4,4},
};
extern VTBL_ENTRY _ZTI6E10x14[];
extern  VTBL_ENTRY _ZTV6E10x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x14[];
Class_Descriptor cd_E10x14 = {  "E10x14", // class name
  bases_E10x14, 4,
  &(vtc_E10x14[0]), // expected_vtbl_contents
  &(vtt_E10x14[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6E10x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E10x14),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E10x14),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  G10x14y0  : E10x14 , F1 {
  int ff;
  ~G10x14y0(); // tgen
  G10x14y0(); // tgen
};
//SIG(1 G10x14y0) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G10x14y0 ::~G10x14y0(){ note_dtor("G10x14y0", this);} // tgen
G10x14y0 ::G10x14y0(){ note_ctor("G10x14y0", this);} // tgen

static void Test_G10x14y0()
{
  extern Class_Descriptor cd_G10x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x14y0, buf);
    G10x14y0 *dp, &lv = *(dp=new (buf) G10x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x14y0)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x14*), ABISELECT(32,24), "G10x14y0");
    check_base_class_offset(lv, (B0*)(C10*)(E10x14*), ABISELECT(36,28), "G10x14y0");
    check_base_class_offset(lv, (C10*)(E10x14*), 0, "G10x14y0");
    check_base_class_offset(lv, (D0*)(E10x14*), ABISELECT(40,32), "G10x14y0");
    check_base_class_offset(lv, (E10x14*), 0, "G10x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G10x14y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G10x14y0.ff");
    test_class_info(&lv, &cd_G10x14y0);
    dp->~G10x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x14y0(Test_G10x14y0, "G10x14y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G10x14y0C1Ev();
extern void _ZN8G10x14y0D1Ev();
Name_Map name_map_G10x14y0[] = {
  NSPAIR(_ZN8G10x14y0C1Ev),
  NSPAIR(_ZN8G10x14y0D1Ev),
  {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_E10x14;
extern VTBL_ENTRY _ZTI6E10x14[];
extern  VTBL_ENTRY _ZTV6E10x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x14y0[] = {
  // 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_E10x14,    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 _ZTI8G10x14y0[];
extern void _ZN6E10x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x14y0[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x14y0[0]),
  (VTBL_ENTRY)&_ZN6E10x143fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G10x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G10x14y0[];
extern void _ZN6E10x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x14__8G10x14y0[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x14[0]),
  (VTBL_ENTRY)&_ZN6E10x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C106E10x14__8G10x14y0[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x14y0[] = {
  {&(_ZTV8G10x14y0[5]),  5,9},
  {&(_tg__ZTV6E10x14__8G10x14y0[5]),  5,6},
  {&(_tg__ZTV3C106E10x14__8G10x14y0[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x14y0[];
extern  VTBL_ENTRY _ZTV8G10x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x14y0[];
Class_Descriptor cd_G10x14y0 = {  "G10x14y0", // class name
  bases_G10x14y0, 6,
  &(vtc_G10x14y0[0]), // expected_vtbl_contents
  &(vtt_G10x14y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G10x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x14y0),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x14y0),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  G10x14y1  : virtual E10x14 , F1 {
  int ff;
  ~G10x14y1(); // tgen
  G10x14y1(); // tgen
};
//SIG(1 G10x14y1) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G10x14y1 ::~G10x14y1(){ note_dtor("G10x14y1", this);} // tgen
G10x14y1 ::G10x14y1(){ note_ctor("G10x14y1", this);} // tgen

static void Test_G10x14y1()
{
  extern Class_Descriptor cd_G10x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x14y1, buf);
    G10x14y1 *dp, &lv = *(dp=new (buf) G10x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x14y1)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x14*), ABISELECT(32,24), "G10x14y1");
    check_base_class_offset(lv, (B0*)(C10*)(E10x14*), ABISELECT(36,28), "G10x14y1");
    check_base_class_offset(lv, (C10*)(E10x14*), ABISELECT(16,12), "G10x14y1");
    check_base_class_offset(lv, (D0*)(E10x14*), ABISELECT(40,32), "G10x14y1");
    check_base_class_offset(lv, (E10x14*), ABISELECT(16,12), "G10x14y1");
    check_base_class_offset(lv, (F1*), 0, "G10x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x14y1.ff");
    test_class_info(&lv, &cd_G10x14y1);
    dp->~G10x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x14y1(Test_G10x14y1, "G10x14y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G10x14y1C1Ev();
extern void _ZN8G10x14y1D1Ev();
Name_Map name_map_G10x14y1[] = {
  NSPAIR(_ZN8G10x14y1C1Ev),
  NSPAIR(_ZN8G10x14y1D1Ev),
  {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_E10x14;
extern VTBL_ENTRY _ZTI6E10x14[];
extern  VTBL_ENTRY _ZTV6E10x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x14y1[] = {
  // 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_E10x14,    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 _ZTI8G10x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E10x143fooEv();
static  VTBL_ENTRY vtc_G10x14y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G10x14y1[0]),
  (VTBL_ENTRY)&_ZN6E10x143fooEv,
};
extern VTBL_ENTRY _ZTV8G10x14y1[];
extern void _ZN6E10x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x14__8G10x14y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x14[0]),
  (VTBL_ENTRY)&_ZN6E10x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C106E10x14__8G10x14y1[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x14y1[] = {
  {&(_ZTV8G10x14y1[6]),  6,14},
  {&(_ZTV8G10x14y1[13]),  13,14},
  {&(_tg__ZTV6E10x14__8G10x14y1[5]),  5,6},
  {&(_tg__ZTV3C106E10x14__8G10x14y1[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x14y1[];
extern  VTBL_ENTRY _ZTV8G10x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x14y1[];
Class_Descriptor cd_G10x14y1 = {  "G10x14y1", // class name
  bases_G10x14y1, 6,
  &(vtc_G10x14y1[0]), // expected_vtbl_contents
  &(vtt_G10x14y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G10x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x14y1),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x14y1),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  G10x14y2  : E10x14 , virtual F1 {
  int ff;
  ~G10x14y2(); // tgen
  G10x14y2(); // tgen
};
//SIG(1 G10x14y2) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G10x14y2 ::~G10x14y2(){ note_dtor("G10x14y2", this);} // tgen
G10x14y2 ::G10x14y2(){ note_ctor("G10x14y2", this);} // tgen

static void Test_G10x14y2()
{
  extern Class_Descriptor cd_G10x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x14y2, buf);
    G10x14y2 *dp, &lv = *(dp=new (buf) G10x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x14y2)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x14*), ABISELECT(20,16), "G10x14y2");
    check_base_class_offset(lv, (B0*)(C10*)(E10x14*), ABISELECT(24,20), "G10x14y2");
    check_base_class_offset(lv, (C10*)(E10x14*), 0, "G10x14y2");
    check_base_class_offset(lv, (D0*)(E10x14*), ABISELECT(28,24), "G10x14y2");
    check_base_class_offset(lv, (E10x14*), 0, "G10x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G10x14y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G10x14y2.ff");
    test_class_info(&lv, &cd_G10x14y2);
    dp->~G10x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x14y2(Test_G10x14y2, "G10x14y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G10x14y2C1Ev();
extern void _ZN8G10x14y2D1Ev();
Name_Map name_map_G10x14y2[] = {
  NSPAIR(_ZN8G10x14y2C1Ev),
  NSPAIR(_ZN8G10x14y2D1Ev),
  {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_E10x14;
extern VTBL_ENTRY _ZTI6E10x14[];
extern  VTBL_ENTRY _ZTV6E10x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x14y2[] = {
  // 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_E10x14,    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 _ZTI8G10x14y2[];
extern void _ZN6E10x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x14y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x14y2[0]),
  (VTBL_ENTRY)&_ZN6E10x143fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G10x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G10x14y2[];
extern void _ZN6E10x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x14__8G10x14y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x14[0]),
  (VTBL_ENTRY)&_ZN6E10x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C106E10x14__8G10x14y2[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x14y2[] = {
  {&(_ZTV8G10x14y2[6]),  6,11},
  {&(_tg__ZTV6E10x14__8G10x14y2[5]),  5,6},
  {&(_tg__ZTV3C106E10x14__8G10x14y2[4]),  4,4},
  {&(_ZTV8G10x14y2[10]),  10,11},
};
extern VTBL_ENTRY _ZTI8G10x14y2[];
extern  VTBL_ENTRY _ZTV8G10x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x14y2[];
Class_Descriptor cd_G10x14y2 = {  "G10x14y2", // class name
  bases_G10x14y2, 6,
  &(vtc_G10x14y2[0]), // expected_vtbl_contents
  &(vtt_G10x14y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G10x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x14y2),11, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x14y2),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  G10x14y3  : virtual E10x14 , virtual F1 {
  int ff;
  ~G10x14y3(); // tgen
  G10x14y3(); // tgen
};
//SIG(1 G10x14y3) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G10x14y3 ::~G10x14y3(){ note_dtor("G10x14y3", this);} // tgen
G10x14y3 ::G10x14y3(){ note_ctor("G10x14y3", this);} // tgen

static void Test_G10x14y3()
{
  extern Class_Descriptor cd_G10x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G10x14y3, buf);
    G10x14y3 *dp, &lv = *(dp=new (buf) G10x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G10x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x14y3)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x14*), ABISELECT(32,20), "G10x14y3");
    check_base_class_offset(lv, (B0*)(C10*)(E10x14*), ABISELECT(36,24), "G10x14y3");
    check_base_class_offset(lv, (C10*)(E10x14*), ABISELECT(16,8), "G10x14y3");
    check_base_class_offset(lv, (D0*)(E10x14*), ABISELECT(40,28), "G10x14y3");
    check_base_class_offset(lv, (E10x14*), ABISELECT(16,8), "G10x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G10x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G10x14y3.ff");
    test_class_info(&lv, &cd_G10x14y3);
    dp->~G10x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x14y3(Test_G10x14y3, "G10x14y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G10x14y3C1Ev();
extern void _ZN8G10x14y3D1Ev();
Name_Map name_map_G10x14y3[] = {
  NSPAIR(_ZN8G10x14y3C1Ev),
  NSPAIR(_ZN8G10x14y3D1Ev),
  {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_E10x14;
extern VTBL_ENTRY _ZTI6E10x14[];
extern  VTBL_ENTRY _ZTV6E10x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x14y3[] = {
  // 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_E10x14,    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 _ZTI8G10x14y3[];
extern void _ZN6E10x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x14y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x14y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G10x14y3[0]),
  (VTBL_ENTRY)&_ZN6E10x143fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G10x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G10x14y3[];
extern void _ZN6E10x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x14__8G10x14y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x14[0]),
  (VTBL_ENTRY)&_ZN6E10x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C106E10x14__8G10x14y3[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x14y3[] = {
  {&(_ZTV8G10x14y3[7]),  7,18},
  {&(_ZTV8G10x14y3[13]),  13,18},
  {&(_ZTV8G10x14y3[17]),  17,18},
  {&(_tg__ZTV6E10x14__8G10x14y3[5]),  5,6},
  {&(_tg__ZTV3C106E10x14__8G10x14y3[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x14y3[];
extern  VTBL_ENTRY _ZTV8G10x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x14y3[];
Class_Descriptor cd_G10x14y3 = {  "G10x14y3", // class name
  bases_G10x14y3, 6,
  &(vtc_G10x14y3[0]), // expected_vtbl_contents
  &(vtt_G10x14y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G10x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x14y3),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x14y3),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  G10x14y4  : E10x14 , F0 {
  int ff;
  ~G10x14y4(); // tgen
  G10x14y4(); // tgen
};
//SIG(1 G10x14y4) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G10x14y4 ::~G10x14y4(){ note_dtor("G10x14y4", this);} // tgen
G10x14y4 ::G10x14y4(){ note_ctor("G10x14y4", this);} // tgen

static void Test_G10x14y4()
{
  extern Class_Descriptor cd_G10x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G10x14y4, buf);
    G10x14y4 *dp, &lv = *(dp=new (buf) G10x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G10x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x14y4)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x14*), ABISELECT(24,20), "G10x14y4");
    check_base_class_offset(lv, (B0*)(C10*)(E10x14*), ABISELECT(28,24), "G10x14y4");
    check_base_class_offset(lv, (C10*)(E10x14*), 0, "G10x14y4");
    check_base_class_offset(lv, (D0*)(E10x14*), ABISELECT(32,28), "G10x14y4");
    check_base_class_offset(lv, (E10x14*), 0, "G10x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G10x14y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G10x14y4.ff");
    test_class_info(&lv, &cd_G10x14y4);
    dp->~G10x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x14y4(Test_G10x14y4, "G10x14y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G10x14y4C1Ev();
extern void _ZN8G10x14y4D1Ev();
Name_Map name_map_G10x14y4[] = {
  NSPAIR(_ZN8G10x14y4C1Ev),
  NSPAIR(_ZN8G10x14y4D1Ev),
  {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_E10x14;
extern VTBL_ENTRY _ZTI6E10x14[];
extern  VTBL_ENTRY _ZTV6E10x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x14y4[] = {
  // 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_E10x14,    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 _ZTI8G10x14y4[];
extern void _ZN6E10x143fooEv();
static  VTBL_ENTRY vtc_G10x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x14y4[0]),
  (VTBL_ENTRY)&_ZN6E10x143fooEv,
};
extern VTBL_ENTRY _ZTV8G10x14y4[];
extern void _ZN6E10x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x14__8G10x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x14[0]),
  (VTBL_ENTRY)&_ZN6E10x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C106E10x14__8G10x14y4[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x14y4[] = {
  {&(_ZTV8G10x14y4[5]),  5,6},
  {&(_tg__ZTV6E10x14__8G10x14y4[5]),  5,6},
  {&(_tg__ZTV3C106E10x14__8G10x14y4[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x14y4[];
extern  VTBL_ENTRY _ZTV8G10x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x14y4[];
Class_Descriptor cd_G10x14y4 = {  "G10x14y4", // class name
  bases_G10x14y4, 6,
  &(vtc_G10x14y4[0]), // expected_vtbl_contents
  &(vtt_G10x14y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G10x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x14y4),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x14y4),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  G10x14y5  : virtual E10x14 , F0 {
  int ff;
  ~G10x14y5(); // tgen
  G10x14y5(); // tgen
};
//SIG(1 G10x14y5) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G10x14y5 ::~G10x14y5(){ note_dtor("G10x14y5", this);} // tgen
G10x14y5 ::G10x14y5(){ note_ctor("G10x14y5", this);} // tgen

static void Test_G10x14y5()
{
  extern Class_Descriptor cd_G10x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x14y5, buf);
    G10x14y5 *dp, &lv = *(dp=new (buf) G10x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x14y5)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x14*), ABISELECT(32,24), "G10x14y5");
    check_base_class_offset(lv, (B0*)(C10*)(E10x14*), ABISELECT(36,28), "G10x14y5");
    check_base_class_offset(lv, (C10*)(E10x14*), ABISELECT(16,12), "G10x14y5");
    check_base_class_offset(lv, (D0*)(E10x14*), ABISELECT(40,32), "G10x14y5");
    check_base_class_offset(lv, (E10x14*), ABISELECT(16,12), "G10x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G10x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x14y5.ff");
    test_class_info(&lv, &cd_G10x14y5);
    dp->~G10x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x14y5(Test_G10x14y5, "G10x14y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G10x14y5C1Ev();
extern void _ZN8G10x14y5D1Ev();
Name_Map name_map_G10x14y5[] = {
  NSPAIR(_ZN8G10x14y5C1Ev),
  NSPAIR(_ZN8G10x14y5D1Ev),
  {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_E10x14;
extern VTBL_ENTRY _ZTI6E10x14[];
extern  VTBL_ENTRY _ZTV6E10x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x14y5[] = {
  // 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_E10x14,    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 _ZTI8G10x14y5[];
extern void _ZN6E10x143fooEv();
static  VTBL_ENTRY vtc_G10x14y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x14y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G10x14y5[0]),
  (VTBL_ENTRY)&_ZN6E10x143fooEv,
};
extern VTBL_ENTRY _ZTV8G10x14y5[];
extern void _ZN6E10x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x14__8G10x14y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x14[0]),
  (VTBL_ENTRY)&_ZN6E10x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C106E10x14__8G10x14y5[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x14y5[] = {
  {&(_ZTV8G10x14y5[6]),  6,13},
  {&(_ZTV8G10x14y5[12]),  12,13},
  {&(_tg__ZTV6E10x14__8G10x14y5[5]),  5,6},
  {&(_tg__ZTV3C106E10x14__8G10x14y5[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x14y5[];
extern  VTBL_ENTRY _ZTV8G10x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x14y5[];
Class_Descriptor cd_G10x14y5 = {  "G10x14y5", // class name
  bases_G10x14y5, 6,
  &(vtc_G10x14y5[0]), // expected_vtbl_contents
  &(vtt_G10x14y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G10x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x14y5),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x14y5),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  G10x14y6  : E10x14 , virtual F0 {
  int ff;
  ~G10x14y6(); // tgen
  G10x14y6(); // tgen
};
//SIG(1 G10x14y6) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G10x14y6 ::~G10x14y6(){ note_dtor("G10x14y6", this);} // tgen
G10x14y6 ::G10x14y6(){ note_ctor("G10x14y6", this);} // tgen

static void Test_G10x14y6()
{
  extern Class_Descriptor cd_G10x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G10x14y6, buf);
    G10x14y6 *dp, &lv = *(dp=new (buf) G10x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G10x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x14y6)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x14*), ABISELECT(20,16), "G10x14y6");
    check_base_class_offset(lv, (B0*)(C10*)(E10x14*), ABISELECT(24,20), "G10x14y6");
    check_base_class_offset(lv, (C10*)(E10x14*), 0, "G10x14y6");
    check_base_class_offset(lv, (D0*)(E10x14*), ABISELECT(28,24), "G10x14y6");
    check_base_class_offset(lv, (E10x14*), 0, "G10x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G10x14y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G10x14y6.ff");
    test_class_info(&lv, &cd_G10x14y6);
    dp->~G10x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x14y6(Test_G10x14y6, "G10x14y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G10x14y6C1Ev();
extern void _ZN8G10x14y6D1Ev();
Name_Map name_map_G10x14y6[] = {
  NSPAIR(_ZN8G10x14y6C1Ev),
  NSPAIR(_ZN8G10x14y6D1Ev),
  {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_E10x14;
extern VTBL_ENTRY _ZTI6E10x14[];
extern  VTBL_ENTRY _ZTV6E10x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x14y6[] = {
  // 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_E10x14,    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 _ZTI8G10x14y6[];
extern void _ZN6E10x143fooEv();
static  VTBL_ENTRY vtc_G10x14y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x14y6[0]),
  (VTBL_ENTRY)&_ZN6E10x143fooEv,
};
extern VTBL_ENTRY _ZTV8G10x14y6[];
extern void _ZN6E10x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x14__8G10x14y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x14[0]),
  (VTBL_ENTRY)&_ZN6E10x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C106E10x14__8G10x14y6[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x14y6[] = {
  {&(_ZTV8G10x14y6[6]),  6,7},
  {&(_tg__ZTV6E10x14__8G10x14y6[5]),  5,6},
  {&(_tg__ZTV3C106E10x14__8G10x14y6[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x14y6[];
extern  VTBL_ENTRY _ZTV8G10x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x14y6[];
Class_Descriptor cd_G10x14y6 = {  "G10x14y6", // class name
  bases_G10x14y6, 6,
  &(vtc_G10x14y6[0]), // expected_vtbl_contents
  &(vtt_G10x14y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G10x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x14y6),7, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x14y6),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  G10x14y7  : virtual E10x14 , virtual F0 {
  int ff;
  ~G10x14y7(); // tgen
  G10x14y7(); // tgen
};
//SIG(1 G10x14y7) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G10x14y7 ::~G10x14y7(){ note_dtor("G10x14y7", this);} // tgen
G10x14y7 ::G10x14y7(){ note_ctor("G10x14y7", this);} // tgen

static void Test_G10x14y7()
{
  extern Class_Descriptor cd_G10x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x14y7, buf);
    G10x14y7 *dp, &lv = *(dp=new (buf) G10x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x14y7)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x14*), ABISELECT(32,20), "G10x14y7");
    check_base_class_offset(lv, (B0*)(C10*)(E10x14*), ABISELECT(36,24), "G10x14y7");
    check_base_class_offset(lv, (C10*)(E10x14*), ABISELECT(16,8), "G10x14y7");
    check_base_class_offset(lv, (D0*)(E10x14*), ABISELECT(40,28), "G10x14y7");
    check_base_class_offset(lv, (E10x14*), ABISELECT(16,8), "G10x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G10x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G10x14y7.ff");
    test_class_info(&lv, &cd_G10x14y7);
    dp->~G10x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x14y7(Test_G10x14y7, "G10x14y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G10x14y7C1Ev();
extern void _ZN8G10x14y7D1Ev();
Name_Map name_map_G10x14y7[] = {
  NSPAIR(_ZN8G10x14y7C1Ev),
  NSPAIR(_ZN8G10x14y7D1Ev),
  {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_E10x14;
extern VTBL_ENTRY _ZTI6E10x14[];
extern  VTBL_ENTRY _ZTV6E10x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x14y7[] = {
  // 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_E10x14,    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 _ZTI8G10x14y7[];
extern void _ZN6E10x143fooEv();
static  VTBL_ENTRY vtc_G10x14y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x14y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G10x14y7[0]),
  (VTBL_ENTRY)&_ZN6E10x143fooEv,
};
extern VTBL_ENTRY _ZTV8G10x14y7[];
extern void _ZN6E10x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x14__8G10x14y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x14[0]),
  (VTBL_ENTRY)&_ZN6E10x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C106E10x14__8G10x14y7[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x14y7[] = {
  {&(_ZTV8G10x14y7[7]),  7,14},
  {&(_ZTV8G10x14y7[13]),  13,14},
  {&(_tg__ZTV6E10x14__8G10x14y7[5]),  5,6},
  {&(_tg__ZTV3C106E10x14__8G10x14y7[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x14y7[];
extern  VTBL_ENTRY _ZTV8G10x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x14y7[];
Class_Descriptor cd_G10x14y7 = {  "G10x14y7", // class name
  bases_G10x14y7, 6,
  &(vtc_G10x14y7[0]), // expected_vtbl_contents
  &(vtt_G10x14y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G10x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x14y7),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x14y7),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  E11x14  : C11 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E11x143fooEv
  ~E11x14(); // tgen
  E11x14(); // tgen
};
//SIG(-1 E11x14) C1{ BC2{ VBC3{ v1 Fi} VBC4{ Fi} Fi} VBC5{ Fi} v1 Fi}


void  E11x14 ::foo(){vfunc_called(this, "_ZN6E11x143fooEv");}
E11x14 ::~E11x14(){ note_dtor("E11x14", this);} // tgen
E11x14 ::E11x14(){ note_ctor("E11x14", this);} // tgen

static void Test_E11x14()
{
  extern Class_Descriptor cd_E11x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E11x14, buf);
    E11x14 *dp, &lv = *(dp=new (buf) E11x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E11x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E11x14)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(16,12), "E11x14");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(28,20), "E11x14");
    check_base_class_offset(lv, (C11*), 0, "E11x14");
    check_base_class_offset(lv, (D0*), ABISELECT(32,24), "E11x14");
    check_field_offset(lv, fd, ABISELECT(12,8), "E11x14.fd");
    test_class_info(&lv, &cd_E11x14);
    dp->~E11x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE11x14(Test_E11x14, "E11x14", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E11x14C1Ev();
extern void _ZN6E11x14D1Ev();
Name_Map name_map_E11x14[] = {
  NSPAIR(_ZN6E11x14C1Ev),
  NSPAIR(_ZN6E11x14D1Ev),
  {0,0}
};
extern Class_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_E11x14[] = {
  // 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_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 _ZTI6E11x14[];
extern void _ZN6E11x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv)();
extern void ABISELECT(_ZThn16_N6E11x143fooEv,_ZThn12_N6E11x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E11x14[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x14[0]),
  (VTBL_ENTRY)&_ZN6E11x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E11x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv),
};
extern VTBL_ENTRY _ZTV6E11x14[];
static  VTBL_ENTRY _tg__ZTV3C11__6E11x14[] = {
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__6E11x14[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E11x14[] = {
  {&(_ZTV6E11x14[5]),  5,10},
  {&(_tg__ZTV3C11__6E11x14[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__6E11x14[3]),  3,4},
  {&(_ZTV6E11x14[9]),  9,10},
};
extern VTBL_ENTRY _ZTI6E11x14[];
extern  VTBL_ENTRY _ZTV6E11x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x14[];
static VTBL_ENTRY alt_thunk_names404[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E11x143fooEv,_ZThn12_N6E11x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E11x14 = {  "E11x14", // class name
  bases_E11x14, 4,
  &(vtc_E11x14[0]), // expected_vtbl_contents
  &(vtt_E11x14[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E11x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E11x14),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E11x14),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names404,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x14y0  : E11x14 , F1 {
  int ff;
  ~G11x14y0(); // tgen
  G11x14y0(); // tgen
};
//SIG(1 G11x14y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G11x14y0 ::~G11x14y0(){ note_dtor("G11x14y0", this);} // tgen
G11x14y0 ::G11x14y0(){ note_ctor("G11x14y0", this);} // tgen

static void Test_G11x14y0()
{
  extern Class_Descriptor cd_G11x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x14y0, buf);
    G11x14y0 *dp, &lv = *(dp=new (buf) G11x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x14y0)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x14*), ABISELECT(32,24), "G11x14y0");
    check_base_class_offset(lv, (B0*)(C11*)(E11x14*), ABISELECT(44,32), "G11x14y0");
    check_base_class_offset(lv, (C11*)(E11x14*), 0, "G11x14y0");
    check_base_class_offset(lv, (D0*)(E11x14*), ABISELECT(48,36), "G11x14y0");
    check_base_class_offset(lv, (E11x14*), 0, "G11x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G11x14y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G11x14y0.ff");
    test_class_info(&lv, &cd_G11x14y0);
    dp->~G11x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x14y0(Test_G11x14y0, "G11x14y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G11x14y0C1Ev();
extern void _ZN8G11x14y0D1Ev();
Name_Map name_map_G11x14y0[] = {
  NSPAIR(_ZN8G11x14y0C1Ev),
  NSPAIR(_ZN8G11x14y0D1Ev),
  {0,0}
};
extern Class_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_E11x14;
extern VTBL_ENTRY _ZTI6E11x14[];
extern  VTBL_ENTRY _ZTV6E11x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x14y0[] = {
  // 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_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_E11x14,    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 _ZTI8G11x14y0[];
extern void _ZN6E11x143fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv)();
extern void ABISELECT(_ZThn32_N6E11x143fooEv,_ZThn24_N6E11x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x14y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x14y0[0]),
  (VTBL_ENTRY)&_ZN6E11x143fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G11x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G11x14y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv),
};
extern VTBL_ENTRY _ZTV8G11x14y0[];
extern void _ZN6E11x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x14__8G11x14y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x14[0]),
  (VTBL_ENTRY)&_ZN6E11x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C116E11x14__8G11x14y0[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C116E11x14__8G11x14y0[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv)();
extern void ABISELECT(_ZThn32_N6E11x143fooEv,_ZThn24_N6E11x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x14__8G11x14y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E11x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv),
};
static  VTT_ENTRY vtt_G11x14y0[] = {
  {&(_ZTV8G11x14y0[5]),  5,13},
  {&(_tg__ZTV6E11x14__8G11x14y0[5]),  5,6},
  {&(_tg__ZTV3C116E11x14__8G11x14y0[4]),  4,4},
  {&(_tg__ZTV2A1__3C116E11x14__8G11x14y0[3]),  3,4},
  {&(_tg__ZTV2A1__6E11x14__8G11x14y0[3]),  3,4},
  {&(_ZTV8G11x14y0[12]),  12,13},
};
extern VTBL_ENTRY _ZTI8G11x14y0[];
extern  VTBL_ENTRY _ZTV8G11x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x14y0[];
static VTBL_ENTRY alt_thunk_names405[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x143fooEv,_ZThn24_N6E11x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x143fooEv,_ZThn24_N6E11x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x14y0 = {  "G11x14y0", // class name
  bases_G11x14y0, 6,
  &(vtc_G11x14y0[0]), // expected_vtbl_contents
  &(vtt_G11x14y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G11x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x14y0),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x14y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names405,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x14y1  : virtual E11x14 , F1 {
  int ff;
  ~G11x14y1(); // tgen
  G11x14y1(); // tgen
};
//SIG(1 G11x14y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G11x14y1 ::~G11x14y1(){ note_dtor("G11x14y1", this);} // tgen
G11x14y1 ::G11x14y1(){ note_ctor("G11x14y1", this);} // tgen

static void Test_G11x14y1()
{
  extern Class_Descriptor cd_G11x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x14y1, buf);
    G11x14y1 *dp, &lv = *(dp=new (buf) G11x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x14y1)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x14*), ABISELECT(32,24), "G11x14y1");
    check_base_class_offset(lv, (B0*)(C11*)(E11x14*), ABISELECT(44,32), "G11x14y1");
    check_base_class_offset(lv, (C11*)(E11x14*), ABISELECT(16,12), "G11x14y1");
    check_base_class_offset(lv, (D0*)(E11x14*), ABISELECT(48,36), "G11x14y1");
    check_base_class_offset(lv, (E11x14*), ABISELECT(16,12), "G11x14y1");
    check_base_class_offset(lv, (F1*), 0, "G11x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x14y1.ff");
    test_class_info(&lv, &cd_G11x14y1);
    dp->~G11x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x14y1(Test_G11x14y1, "G11x14y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G11x14y1C1Ev();
extern void _ZN8G11x14y1D1Ev();
Name_Map name_map_G11x14y1[] = {
  NSPAIR(_ZN8G11x14y1C1Ev),
  NSPAIR(_ZN8G11x14y1D1Ev),
  {0,0}
};
extern Class_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_E11x14;
extern VTBL_ENTRY _ZTI6E11x14[];
extern  VTBL_ENTRY _ZTV6E11x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x14y1[] = {
  // 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_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_E11x14,    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 _ZTI8G11x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E11x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv)();
extern void ABISELECT(_ZThn16_N6E11x143fooEv,_ZThn12_N6E11x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x14y1[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G11x14y1[0]),
  (VTBL_ENTRY)&_ZN6E11x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G11x14y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv),
};
extern VTBL_ENTRY _ZTV8G11x14y1[];
extern void _ZN6E11x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x14__8G11x14y1[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x14[0]),
  (VTBL_ENTRY)&_ZN6E11x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C116E11x14__8G11x14y1[] = {
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C116E11x14__8G11x14y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv)();
extern void ABISELECT(_ZThn16_N6E11x143fooEv,_ZThn12_N6E11x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x14__8G11x14y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E11x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv),
};
static  VTT_ENTRY vtt_G11x14y1[] = {
  {&(_ZTV8G11x14y1[6]),  6,18},
  {&(_ZTV8G11x14y1[13]),  13,18},
  {&(_ZTV8G11x14y1[17]),  17,18},
  {&(_tg__ZTV6E11x14__8G11x14y1[5]),  5,6},
  {&(_tg__ZTV3C116E11x14__8G11x14y1[4]),  4,4},
  {&(_tg__ZTV2A1__3C116E11x14__8G11x14y1[3]),  3,4},
  {&(_tg__ZTV2A1__6E11x14__8G11x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x14y1[];
extern  VTBL_ENTRY _ZTV8G11x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x14y1[];
static VTBL_ENTRY alt_thunk_names406[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E11x143fooEv,_ZThn12_N6E11x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E11x143fooEv,_ZThn12_N6E11x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x14y1 = {  "G11x14y1", // class name
  bases_G11x14y1, 6,
  &(vtc_G11x14y1[0]), // expected_vtbl_contents
  &(vtt_G11x14y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G11x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x14y1),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x14y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names406,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x14y2  : E11x14 , virtual F1 {
  int ff;
  ~G11x14y2(); // tgen
  G11x14y2(); // tgen
};
//SIG(1 G11x14y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G11x14y2 ::~G11x14y2(){ note_dtor("G11x14y2", this);} // tgen
G11x14y2 ::G11x14y2(){ note_ctor("G11x14y2", this);} // tgen

static void Test_G11x14y2()
{
  extern Class_Descriptor cd_G11x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G11x14y2, buf);
    G11x14y2 *dp, &lv = *(dp=new (buf) G11x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G11x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x14y2)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x14*), ABISELECT(24,16), "G11x14y2");
    check_base_class_offset(lv, (B0*)(C11*)(E11x14*), ABISELECT(36,24), "G11x14y2");
    check_base_class_offset(lv, (C11*)(E11x14*), 0, "G11x14y2");
    check_base_class_offset(lv, (D0*)(E11x14*), ABISELECT(40,28), "G11x14y2");
    check_base_class_offset(lv, (E11x14*), 0, "G11x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G11x14y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G11x14y2.ff");
    test_class_info(&lv, &cd_G11x14y2);
    dp->~G11x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x14y2(Test_G11x14y2, "G11x14y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G11x14y2C1Ev();
extern void _ZN8G11x14y2D1Ev();
Name_Map name_map_G11x14y2[] = {
  NSPAIR(_ZN8G11x14y2C1Ev),
  NSPAIR(_ZN8G11x14y2D1Ev),
  {0,0}
};
extern Class_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_E11x14;
extern VTBL_ENTRY _ZTI6E11x14[];
extern  VTBL_ENTRY _ZTV6E11x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x14y2[] = {
  // 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_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_E11x14,    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 _ZTI8G11x14y2[];
extern void _ZN6E11x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv)();
extern void ABISELECT(_ZThn24_N6E11x143fooEv,_ZThn16_N6E11x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G11x14y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x14y2[0]),
  (VTBL_ENTRY)&_ZN6E11x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G11x14y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G11x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G11x14y2[];
extern void _ZN6E11x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x14__8G11x14y2[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x14[0]),
  (VTBL_ENTRY)&_ZN6E11x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C116E11x14__8G11x14y2[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C116E11x14__8G11x14y2[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv)();
extern void ABISELECT(_ZThn24_N6E11x143fooEv,_ZThn16_N6E11x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x14__8G11x14y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E11x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv),
};
static  VTT_ENTRY vtt_G11x14y2[] = {
  {&(_ZTV8G11x14y2[6]),  6,15},
  {&(_tg__ZTV6E11x14__8G11x14y2[5]),  5,6},
  {&(_tg__ZTV3C116E11x14__8G11x14y2[4]),  4,4},
  {&(_tg__ZTV2A1__3C116E11x14__8G11x14y2[3]),  3,4},
  {&(_tg__ZTV2A1__6E11x14__8G11x14y2[3]),  3,4},
  {&(_ZTV8G11x14y2[10]),  10,15},
  {&(_ZTV8G11x14y2[14]),  14,15},
};
extern VTBL_ENTRY _ZTI8G11x14y2[];
extern  VTBL_ENTRY _ZTV8G11x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x14y2[];
static VTBL_ENTRY alt_thunk_names407[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E11x143fooEv,_ZThn16_N6E11x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E11x143fooEv,_ZThn16_N6E11x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x14y2 = {  "G11x14y2", // class name
  bases_G11x14y2, 6,
  &(vtc_G11x14y2[0]), // expected_vtbl_contents
  &(vtt_G11x14y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G11x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x14y2),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x14y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names407,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x14y3  : virtual E11x14 , virtual F1 {
  int ff;
  ~G11x14y3(); // tgen
  G11x14y3(); // tgen
};
//SIG(1 G11x14y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G11x14y3 ::~G11x14y3(){ note_dtor("G11x14y3", this);} // tgen
G11x14y3 ::G11x14y3(){ note_ctor("G11x14y3", this);} // tgen

static void Test_G11x14y3()
{
  extern Class_Descriptor cd_G11x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G11x14y3, buf);
    G11x14y3 *dp, &lv = *(dp=new (buf) G11x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G11x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x14y3)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x14*), ABISELECT(32,20), "G11x14y3");
    check_base_class_offset(lv, (B0*)(C11*)(E11x14*), ABISELECT(44,28), "G11x14y3");
    check_base_class_offset(lv, (C11*)(E11x14*), ABISELECT(16,8), "G11x14y3");
    check_base_class_offset(lv, (D0*)(E11x14*), ABISELECT(48,32), "G11x14y3");
    check_base_class_offset(lv, (E11x14*), ABISELECT(16,8), "G11x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G11x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G11x14y3.ff");
    test_class_info(&lv, &cd_G11x14y3);
    dp->~G11x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x14y3(Test_G11x14y3, "G11x14y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G11x14y3C1Ev();
extern void _ZN8G11x14y3D1Ev();
Name_Map name_map_G11x14y3[] = {
  NSPAIR(_ZN8G11x14y3C1Ev),
  NSPAIR(_ZN8G11x14y3D1Ev),
  {0,0}
};
extern Class_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_E11x14;
extern VTBL_ENTRY _ZTI6E11x14[];
extern  VTBL_ENTRY _ZTV6E11x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x14y3[] = {
  // 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_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_E11x14,    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 _ZTI8G11x14y3[];
extern void _ZN6E11x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv)();
extern void ABISELECT(_ZThn16_N6E11x143fooEv,_ZThn12_N6E11x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G11x14y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x14y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G11x14y3[0]),
  (VTBL_ENTRY)&_ZN6E11x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G11x14y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G11x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G11x14y3[];
extern void _ZN6E11x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x14__8G11x14y3[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x14[0]),
  (VTBL_ENTRY)&_ZN6E11x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C116E11x14__8G11x14y3[] = {
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C116E11x14__8G11x14y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv)();
extern void ABISELECT(_ZThn16_N6E11x143fooEv,_ZThn12_N6E11x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x14__8G11x14y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E11x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv),
};
static  VTT_ENTRY vtt_G11x14y3[] = {
  {&(_ZTV8G11x14y3[7]),  7,22},
  {&(_ZTV8G11x14y3[13]),  13,22},
  {&(_ZTV8G11x14y3[17]),  17,22},
  {&(_ZTV8G11x14y3[21]),  21,22},
  {&(_tg__ZTV6E11x14__8G11x14y3[5]),  5,6},
  {&(_tg__ZTV3C116E11x14__8G11x14y3[4]),  4,4},
  {&(_tg__ZTV2A1__3C116E11x14__8G11x14y3[3]),  3,4},
  {&(_tg__ZTV2A1__6E11x14__8G11x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x14y3[];
extern  VTBL_ENTRY _ZTV8G11x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x14y3[];
static VTBL_ENTRY alt_thunk_names408[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E11x143fooEv,_ZThn12_N6E11x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E11x143fooEv,_ZThn12_N6E11x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x14y3 = {  "G11x14y3", // class name
  bases_G11x14y3, 6,
  &(vtc_G11x14y3[0]), // expected_vtbl_contents
  &(vtt_G11x14y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G11x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x14y3),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x14y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names408,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x14y4  : E11x14 , F0 {
  int ff;
  ~G11x14y4(); // tgen
  G11x14y4(); // tgen
};
//SIG(1 G11x14y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G11x14y4 ::~G11x14y4(){ note_dtor("G11x14y4", this);} // tgen
G11x14y4 ::G11x14y4(){ note_ctor("G11x14y4", this);} // tgen

static void Test_G11x14y4()
{
  extern Class_Descriptor cd_G11x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G11x14y4, buf);
    G11x14y4 *dp, &lv = *(dp=new (buf) G11x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G11x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x14y4)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x14*), ABISELECT(24,20), "G11x14y4");
    check_base_class_offset(lv, (B0*)(C11*)(E11x14*), ABISELECT(36,28), "G11x14y4");
    check_base_class_offset(lv, (C11*)(E11x14*), 0, "G11x14y4");
    check_base_class_offset(lv, (D0*)(E11x14*), ABISELECT(40,32), "G11x14y4");
    check_base_class_offset(lv, (E11x14*), 0, "G11x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G11x14y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G11x14y4.ff");
    test_class_info(&lv, &cd_G11x14y4);
    dp->~G11x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x14y4(Test_G11x14y4, "G11x14y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G11x14y4C1Ev();
extern void _ZN8G11x14y4D1Ev();
Name_Map name_map_G11x14y4[] = {
  NSPAIR(_ZN8G11x14y4C1Ev),
  NSPAIR(_ZN8G11x14y4D1Ev),
  {0,0}
};
extern Class_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_E11x14;
extern VTBL_ENTRY _ZTI6E11x14[];
extern  VTBL_ENTRY _ZTV6E11x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x14y4[] = {
  // 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_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_E11x14,    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 _ZTI8G11x14y4[];
extern void _ZN6E11x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv)();
extern void ABISELECT(_ZThn24_N6E11x143fooEv,_ZThn20_N6E11x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x14y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x14y4[0]),
  (VTBL_ENTRY)&_ZN6E11x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G11x14y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv),
};
extern VTBL_ENTRY _ZTV8G11x14y4[];
extern void _ZN6E11x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x14__8G11x14y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x14[0]),
  (VTBL_ENTRY)&_ZN6E11x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C116E11x14__8G11x14y4[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C116E11x14__8G11x14y4[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv)();
extern void ABISELECT(_ZThn24_N6E11x143fooEv,_ZThn20_N6E11x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x14__8G11x14y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E11x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv),
};
static  VTT_ENTRY vtt_G11x14y4[] = {
  {&(_ZTV8G11x14y4[5]),  5,10},
  {&(_tg__ZTV6E11x14__8G11x14y4[5]),  5,6},
  {&(_tg__ZTV3C116E11x14__8G11x14y4[4]),  4,4},
  {&(_tg__ZTV2A1__3C116E11x14__8G11x14y4[3]),  3,4},
  {&(_tg__ZTV2A1__6E11x14__8G11x14y4[3]),  3,4},
  {&(_ZTV8G11x14y4[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G11x14y4[];
extern  VTBL_ENTRY _ZTV8G11x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x14y4[];
static VTBL_ENTRY alt_thunk_names409[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E11x143fooEv,_ZThn20_N6E11x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E11x143fooEv,_ZThn20_N6E11x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x14y4 = {  "G11x14y4", // class name
  bases_G11x14y4, 6,
  &(vtc_G11x14y4[0]), // expected_vtbl_contents
  &(vtt_G11x14y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G11x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x14y4),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x14y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names409,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x14y5  : virtual E11x14 , F0 {
  int ff;
  ~G11x14y5(); // tgen
  G11x14y5(); // tgen
};
//SIG(1 G11x14y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G11x14y5 ::~G11x14y5(){ note_dtor("G11x14y5", this);} // tgen
G11x14y5 ::G11x14y5(){ note_ctor("G11x14y5", this);} // tgen

static void Test_G11x14y5()
{
  extern Class_Descriptor cd_G11x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x14y5, buf);
    G11x14y5 *dp, &lv = *(dp=new (buf) G11x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x14y5)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x14*), ABISELECT(32,24), "G11x14y5");
    check_base_class_offset(lv, (B0*)(C11*)(E11x14*), ABISELECT(44,32), "G11x14y5");
    check_base_class_offset(lv, (C11*)(E11x14*), ABISELECT(16,12), "G11x14y5");
    check_base_class_offset(lv, (D0*)(E11x14*), ABISELECT(48,36), "G11x14y5");
    check_base_class_offset(lv, (E11x14*), ABISELECT(16,12), "G11x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G11x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x14y5.ff");
    test_class_info(&lv, &cd_G11x14y5);
    dp->~G11x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x14y5(Test_G11x14y5, "G11x14y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G11x14y5C1Ev();
extern void _ZN8G11x14y5D1Ev();
Name_Map name_map_G11x14y5[] = {
  NSPAIR(_ZN8G11x14y5C1Ev),
  NSPAIR(_ZN8G11x14y5D1Ev),
  {0,0}
};
extern Class_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_E11x14;
extern VTBL_ENTRY _ZTI6E11x14[];
extern  VTBL_ENTRY _ZTV6E11x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x14y5[] = {
  // 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_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_E11x14,    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 _ZTI8G11x14y5[];
extern void _ZN6E11x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv)();
extern void ABISELECT(_ZThn16_N6E11x143fooEv,_ZThn12_N6E11x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x14y5[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x14y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G11x14y5[0]),
  (VTBL_ENTRY)&_ZN6E11x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G11x14y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv),
};
extern VTBL_ENTRY _ZTV8G11x14y5[];
extern void _ZN6E11x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x14__8G11x14y5[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x14[0]),
  (VTBL_ENTRY)&_ZN6E11x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C116E11x14__8G11x14y5[] = {
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C116E11x14__8G11x14y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv)();
extern void ABISELECT(_ZThn16_N6E11x143fooEv,_ZThn12_N6E11x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x14__8G11x14y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E11x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv),
};
static  VTT_ENTRY vtt_G11x14y5[] = {
  {&(_ZTV8G11x14y5[6]),  6,17},
  {&(_ZTV8G11x14y5[12]),  12,17},
  {&(_ZTV8G11x14y5[16]),  16,17},
  {&(_tg__ZTV6E11x14__8G11x14y5[5]),  5,6},
  {&(_tg__ZTV3C116E11x14__8G11x14y5[4]),  4,4},
  {&(_tg__ZTV2A1__3C116E11x14__8G11x14y5[3]),  3,4},
  {&(_tg__ZTV2A1__6E11x14__8G11x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x14y5[];
extern  VTBL_ENTRY _ZTV8G11x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x14y5[];
static VTBL_ENTRY alt_thunk_names410[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E11x143fooEv,_ZThn12_N6E11x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E11x143fooEv,_ZThn12_N6E11x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x14y5 = {  "G11x14y5", // class name
  bases_G11x14y5, 6,
  &(vtc_G11x14y5[0]), // expected_vtbl_contents
  &(vtt_G11x14y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G11x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x14y5),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x14y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names410,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x14y6  : E11x14 , virtual F0 {
  int ff;
  ~G11x14y6(); // tgen
  G11x14y6(); // tgen
};
//SIG(1 G11x14y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G11x14y6 ::~G11x14y6(){ note_dtor("G11x14y6", this);} // tgen
G11x14y6 ::G11x14y6(){ note_ctor("G11x14y6", this);} // tgen

static void Test_G11x14y6()
{
  extern Class_Descriptor cd_G11x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G11x14y6, buf);
    G11x14y6 *dp, &lv = *(dp=new (buf) G11x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G11x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x14y6)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x14*), ABISELECT(24,16), "G11x14y6");
    check_base_class_offset(lv, (B0*)(C11*)(E11x14*), ABISELECT(36,24), "G11x14y6");
    check_base_class_offset(lv, (C11*)(E11x14*), 0, "G11x14y6");
    check_base_class_offset(lv, (D0*)(E11x14*), ABISELECT(40,28), "G11x14y6");
    check_base_class_offset(lv, (E11x14*), 0, "G11x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G11x14y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G11x14y6.ff");
    test_class_info(&lv, &cd_G11x14y6);
    dp->~G11x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x14y6(Test_G11x14y6, "G11x14y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G11x14y6C1Ev();
extern void _ZN8G11x14y6D1Ev();
Name_Map name_map_G11x14y6[] = {
  NSPAIR(_ZN8G11x14y6C1Ev),
  NSPAIR(_ZN8G11x14y6D1Ev),
  {0,0}
};
extern Class_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_E11x14;
extern VTBL_ENTRY _ZTI6E11x14[];
extern  VTBL_ENTRY _ZTV6E11x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x14y6[] = {
  // 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_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_E11x14,    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 _ZTI8G11x14y6[];
extern void _ZN6E11x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv)();
extern void ABISELECT(_ZThn24_N6E11x143fooEv,_ZThn16_N6E11x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x14y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x14y6[0]),
  (VTBL_ENTRY)&_ZN6E11x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G11x14y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv),
};
extern VTBL_ENTRY _ZTV8G11x14y6[];
extern void _ZN6E11x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x14__8G11x14y6[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x14[0]),
  (VTBL_ENTRY)&_ZN6E11x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C116E11x14__8G11x14y6[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C116E11x14__8G11x14y6[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv)();
extern void ABISELECT(_ZThn24_N6E11x143fooEv,_ZThn16_N6E11x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x14__8G11x14y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E11x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv),
};
static  VTT_ENTRY vtt_G11x14y6[] = {
  {&(_ZTV8G11x14y6[6]),  6,11},
  {&(_tg__ZTV6E11x14__8G11x14y6[5]),  5,6},
  {&(_tg__ZTV3C116E11x14__8G11x14y6[4]),  4,4},
  {&(_tg__ZTV2A1__3C116E11x14__8G11x14y6[3]),  3,4},
  {&(_tg__ZTV2A1__6E11x14__8G11x14y6[3]),  3,4},
  {&(_ZTV8G11x14y6[10]),  10,11},
};
extern VTBL_ENTRY _ZTI8G11x14y6[];
extern  VTBL_ENTRY _ZTV8G11x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x14y6[];
static VTBL_ENTRY alt_thunk_names411[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E11x143fooEv,_ZThn16_N6E11x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E11x143fooEv,_ZThn16_N6E11x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x14y6 = {  "G11x14y6", // class name
  bases_G11x14y6, 6,
  &(vtc_G11x14y6[0]), // expected_vtbl_contents
  &(vtt_G11x14y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G11x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x14y6),11, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x14y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names411,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x14y7  : virtual E11x14 , virtual F0 {
  int ff;
  ~G11x14y7(); // tgen
  G11x14y7(); // tgen
};
//SIG(1 G11x14y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G11x14y7 ::~G11x14y7(){ note_dtor("G11x14y7", this);} // tgen
G11x14y7 ::G11x14y7(){ note_ctor("G11x14y7", this);} // tgen

static void Test_G11x14y7()
{
  extern Class_Descriptor cd_G11x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x14y7, buf);
    G11x14y7 *dp, &lv = *(dp=new (buf) G11x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x14y7)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x14*), ABISELECT(32,20), "G11x14y7");
    check_base_class_offset(lv, (B0*)(C11*)(E11x14*), ABISELECT(44,28), "G11x14y7");
    check_base_class_offset(lv, (C11*)(E11x14*), ABISELECT(16,8), "G11x14y7");
    check_base_class_offset(lv, (D0*)(E11x14*), ABISELECT(48,32), "G11x14y7");
    check_base_class_offset(lv, (E11x14*), ABISELECT(16,8), "G11x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G11x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G11x14y7.ff");
    test_class_info(&lv, &cd_G11x14y7);
    dp->~G11x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x14y7(Test_G11x14y7, "G11x14y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G11x14y7C1Ev();
extern void _ZN8G11x14y7D1Ev();
Name_Map name_map_G11x14y7[] = {
  NSPAIR(_ZN8G11x14y7C1Ev),
  NSPAIR(_ZN8G11x14y7D1Ev),
  {0,0}
};
extern Class_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_E11x14;
extern VTBL_ENTRY _ZTI6E11x14[];
extern  VTBL_ENTRY _ZTV6E11x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x14y7[] = {
  // 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_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_E11x14,    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 _ZTI8G11x14y7[];
extern void _ZN6E11x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv)();
extern void ABISELECT(_ZThn16_N6E11x143fooEv,_ZThn12_N6E11x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x14y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x14y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G11x14y7[0]),
  (VTBL_ENTRY)&_ZN6E11x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G11x14y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv),
};
extern VTBL_ENTRY _ZTV8G11x14y7[];
extern void _ZN6E11x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x14__8G11x14y7[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x14[0]),
  (VTBL_ENTRY)&_ZN6E11x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C116E11x14__8G11x14y7[] = {
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C116E11x14__8G11x14y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv)();
extern void ABISELECT(_ZThn16_N6E11x143fooEv,_ZThn12_N6E11x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x14__8G11x14y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E11x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv),
};
static  VTT_ENTRY vtt_G11x14y7[] = {
  {&(_ZTV8G11x14y7[7]),  7,18},
  {&(_ZTV8G11x14y7[13]),  13,18},
  {&(_ZTV8G11x14y7[17]),  17,18},
  {&(_tg__ZTV6E11x14__8G11x14y7[5]),  5,6},
  {&(_tg__ZTV3C116E11x14__8G11x14y7[4]),  4,4},
  {&(_tg__ZTV2A1__3C116E11x14__8G11x14y7[3]),  3,4},
  {&(_tg__ZTV2A1__6E11x14__8G11x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x14y7[];
extern  VTBL_ENTRY _ZTV8G11x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x14y7[];
static VTBL_ENTRY alt_thunk_names412[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x143fooEv,_ZTv0_n12_N6E11x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E11x143fooEv,_ZThn12_N6E11x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E11x143fooEv,_ZThn12_N6E11x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x14y7 = {  "G11x14y7", // class name
  bases_G11x14y7, 6,
  &(vtc_G11x14y7[0]), // expected_vtbl_contents
  &(vtt_G11x14y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G11x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x14y7),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x14y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names412,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E12x14  : C12 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E12x143fooEv
  ~E12x14(); // tgen
  E12x14(); // tgen
};
//SIG(-1 E12x14) C1{ BC2{ BC3{ Fi} VBC4{ v1 Fi} Fi} VBC5{ Fi} v1 Fi}


void  E12x14 ::foo(){vfunc_called(this, "_ZN6E12x143fooEv");}
E12x14 ::~E12x14(){ note_dtor("E12x14", this);} // tgen
E12x14 ::E12x14(){ note_ctor("E12x14", this);} // tgen

static void Test_E12x14()
{
  extern Class_Descriptor cd_E12x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E12x14, buf);
    E12x14 *dp, &lv = *(dp=new (buf) E12x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E12x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E12x14)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(8,4), "E12x14");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(24,16), "E12x14");
    check_base_class_offset(lv, (C12*), 0, "E12x14");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E12x14");
    check_field_offset(lv, fd, ABISELECT(16,12), "E12x14.fd");
    test_class_info(&lv, &cd_E12x14);
    dp->~E12x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE12x14(Test_E12x14, "E12x14", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E12x14C1Ev();
extern void _ZN6E12x14D1Ev();
Name_Map name_map_E12x14[] = {
  NSPAIR(_ZN6E12x14C1Ev),
  NSPAIR(_ZN6E12x14D1Ev),
  {0,0}
};
extern Class_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_E12x14[] = {
  // 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_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 _ZTI6E12x14[];
extern void _ZN6E12x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv)();
extern void ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn16_N6E12x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E12x14[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x14[0]),
  (VTBL_ENTRY)&_ZN6E12x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E12x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv),
};
extern VTBL_ENTRY _ZTV6E12x14[];
static  VTBL_ENTRY _tg__ZTV3C12__6E12x14[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__6E12x14[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E12x14[] = {
  {&(_ZTV6E12x14[4]),  4,9},
  {&(_tg__ZTV3C12__6E12x14[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__6E12x14[3]),  3,4},
  {&(_ZTV6E12x14[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6E12x14[];
extern  VTBL_ENTRY _ZTV6E12x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x14[];
static VTBL_ENTRY alt_thunk_names413[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn16_N6E12x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E12x14 = {  "E12x14", // class name
  bases_E12x14, 4,
  &(vtc_E12x14[0]), // expected_vtbl_contents
  &(vtt_E12x14[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E12x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E12x14),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E12x14),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names413,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x14y0  : E12x14 , F1 {
  int ff;
  ~G12x14y0(); // tgen
  G12x14y0(); // tgen
};
//SIG(1 G12x14y0) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G12x14y0 ::~G12x14y0(){ note_dtor("G12x14y0", this);} // tgen
G12x14y0 ::G12x14y0(){ note_ctor("G12x14y0", this);} // tgen

static void Test_G12x14y0()
{
  extern Class_Descriptor cd_G12x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x14y0, buf);
    G12x14y0 *dp, &lv = *(dp=new (buf) G12x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x14y0)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x14*), ABISELECT(8,4), "G12x14y0");
    check_base_class_offset(lv, (B1*)(C12*)(E12x14*), ABISELECT(40,28), "G12x14y0");
    check_base_class_offset(lv, (C12*)(E12x14*), 0, "G12x14y0");
    check_base_class_offset(lv, (D0*)(E12x14*), ABISELECT(52,36), "G12x14y0");
    check_base_class_offset(lv, (E12x14*), 0, "G12x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G12x14y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G12x14y0.ff");
    test_class_info(&lv, &cd_G12x14y0);
    dp->~G12x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x14y0(Test_G12x14y0, "G12x14y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G12x14y0C1Ev();
extern void _ZN8G12x14y0D1Ev();
Name_Map name_map_G12x14y0[] = {
  NSPAIR(_ZN8G12x14y0C1Ev),
  NSPAIR(_ZN8G12x14y0D1Ev),
  {0,0}
};
extern Class_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_E12x14;
extern VTBL_ENTRY _ZTI6E12x14[];
extern  VTBL_ENTRY _ZTV6E12x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x14y0[] = {
  // 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_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_E12x14,    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 _ZTI8G12x14y0[];
extern void _ZN6E12x143fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv)();
extern void ABISELECT(_ZThn40_N6E12x143fooEv,_ZThn28_N6E12x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x14y0[0]),
  (VTBL_ENTRY)&_ZN6E12x143fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G12x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G12x14y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv),
};
extern VTBL_ENTRY _ZTV8G12x14y0[];
extern void _ZN6E12x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x14__8G12x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x14[0]),
  (VTBL_ENTRY)&_ZN6E12x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C126E12x14__8G12x14y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C126E12x14__8G12x14y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv)();
extern void ABISELECT(_ZThn40_N6E12x143fooEv,_ZThn28_N6E12x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x14__8G12x14y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E12x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv),
};
static  VTT_ENTRY vtt_G12x14y0[] = {
  {&(_ZTV8G12x14y0[4]),  4,12},
  {&(_tg__ZTV6E12x14__8G12x14y0[4]),  4,5},
  {&(_tg__ZTV3C126E12x14__8G12x14y0[3]),  3,3},
  {&(_tg__ZTV2B1__3C126E12x14__8G12x14y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E12x14__8G12x14y0[3]),  3,4},
  {&(_ZTV8G12x14y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI8G12x14y0[];
extern  VTBL_ENTRY _ZTV8G12x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x14y0[];
static VTBL_ENTRY alt_thunk_names414[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E12x143fooEv,_ZThn28_N6E12x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E12x143fooEv,_ZThn28_N6E12x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x14y0 = {  "G12x14y0", // class name
  bases_G12x14y0, 6,
  &(vtc_G12x14y0[0]), // expected_vtbl_contents
  &(vtt_G12x14y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G12x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x14y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x14y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names414,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x14y1  : virtual E12x14 , F1 {
  int ff;
  ~G12x14y1(); // tgen
  G12x14y1(); // tgen
};
//SIG(1 G12x14y1) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G12x14y1 ::~G12x14y1(){ note_dtor("G12x14y1", this);} // tgen
G12x14y1 ::G12x14y1(){ note_ctor("G12x14y1", this);} // tgen

static void Test_G12x14y1()
{
  extern Class_Descriptor cd_G12x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x14y1, buf);
    G12x14y1 *dp, &lv = *(dp=new (buf) G12x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x14y1)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x14*), ABISELECT(24,16), "G12x14y1");
    check_base_class_offset(lv, (B1*)(C12*)(E12x14*), ABISELECT(40,28), "G12x14y1");
    check_base_class_offset(lv, (C12*)(E12x14*), ABISELECT(16,12), "G12x14y1");
    check_base_class_offset(lv, (D0*)(E12x14*), ABISELECT(52,36), "G12x14y1");
    check_base_class_offset(lv, (E12x14*), ABISELECT(16,12), "G12x14y1");
    check_base_class_offset(lv, (F1*), 0, "G12x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x14y1.ff");
    test_class_info(&lv, &cd_G12x14y1);
    dp->~G12x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x14y1(Test_G12x14y1, "G12x14y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G12x14y1C1Ev();
extern void _ZN8G12x14y1D1Ev();
Name_Map name_map_G12x14y1[] = {
  NSPAIR(_ZN8G12x14y1C1Ev),
  NSPAIR(_ZN8G12x14y1D1Ev),
  {0,0}
};
extern Class_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_E12x14;
extern VTBL_ENTRY _ZTI6E12x14[];
extern  VTBL_ENTRY _ZTV6E12x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x14y1[] = {
  // 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_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_E12x14,    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 _ZTI8G12x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E12x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv)();
extern void ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn16_N6E12x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x14y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G12x14y1[0]),
  (VTBL_ENTRY)&_ZN6E12x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G12x14y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv),
};
extern VTBL_ENTRY _ZTV8G12x14y1[];
extern void _ZN6E12x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x14__8G12x14y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x14[0]),
  (VTBL_ENTRY)&_ZN6E12x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C126E12x14__8G12x14y1[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C126E12x14__8G12x14y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv)();
extern void ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn16_N6E12x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x14__8G12x14y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E12x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv),
};
static  VTT_ENTRY vtt_G12x14y1[] = {
  {&(_ZTV8G12x14y1[5]),  5,16},
  {&(_ZTV8G12x14y1[11]),  11,16},
  {&(_ZTV8G12x14y1[15]),  15,16},
  {&(_tg__ZTV6E12x14__8G12x14y1[4]),  4,5},
  {&(_tg__ZTV3C126E12x14__8G12x14y1[3]),  3,3},
  {&(_tg__ZTV2B1__3C126E12x14__8G12x14y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E12x14__8G12x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x14y1[];
extern  VTBL_ENTRY _ZTV8G12x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x14y1[];
static VTBL_ENTRY alt_thunk_names415[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn16_N6E12x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn16_N6E12x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x14y1 = {  "G12x14y1", // class name
  bases_G12x14y1, 6,
  &(vtc_G12x14y1[0]), // expected_vtbl_contents
  &(vtt_G12x14y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G12x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x14y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x14y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names415,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x14y2  : E12x14 , virtual F1 {
  int ff;
  ~G12x14y2(); // tgen
  G12x14y2(); // tgen
};
//SIG(1 G12x14y2) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G12x14y2 ::~G12x14y2(){ note_dtor("G12x14y2", this);} // tgen
G12x14y2 ::G12x14y2(){ note_ctor("G12x14y2", this);} // tgen

static void Test_G12x14y2()
{
  extern Class_Descriptor cd_G12x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x14y2, buf);
    G12x14y2 *dp, &lv = *(dp=new (buf) G12x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x14y2)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x14*), ABISELECT(8,4), "G12x14y2");
    check_base_class_offset(lv, (B1*)(C12*)(E12x14*), ABISELECT(24,20), "G12x14y2");
    check_base_class_offset(lv, (C12*)(E12x14*), 0, "G12x14y2");
    check_base_class_offset(lv, (D0*)(E12x14*), ABISELECT(36,28), "G12x14y2");
    check_base_class_offset(lv, (E12x14*), 0, "G12x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G12x14y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G12x14y2.ff");
    test_class_info(&lv, &cd_G12x14y2);
    dp->~G12x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x14y2(Test_G12x14y2, "G12x14y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G12x14y2C1Ev();
extern void _ZN8G12x14y2D1Ev();
Name_Map name_map_G12x14y2[] = {
  NSPAIR(_ZN8G12x14y2C1Ev),
  NSPAIR(_ZN8G12x14y2D1Ev),
  {0,0}
};
extern Class_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_E12x14;
extern VTBL_ENTRY _ZTI6E12x14[];
extern  VTBL_ENTRY _ZTV6E12x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x14y2[] = {
  // 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_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_E12x14,    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 _ZTI8G12x14y2[];
extern void _ZN6E12x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv)();
extern void ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn20_N6E12x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G12x14y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x14y2[0]),
  (VTBL_ENTRY)&_ZN6E12x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G12x14y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G12x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G12x14y2[];
extern void _ZN6E12x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x14__8G12x14y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x14[0]),
  (VTBL_ENTRY)&_ZN6E12x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C126E12x14__8G12x14y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C126E12x14__8G12x14y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv)();
extern void ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn20_N6E12x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x14__8G12x14y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E12x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv),
};
static  VTT_ENTRY vtt_G12x14y2[] = {
  {&(_ZTV8G12x14y2[5]),  5,14},
  {&(_tg__ZTV6E12x14__8G12x14y2[4]),  4,5},
  {&(_tg__ZTV3C126E12x14__8G12x14y2[3]),  3,3},
  {&(_tg__ZTV2B1__3C126E12x14__8G12x14y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E12x14__8G12x14y2[3]),  3,4},
  {&(_ZTV8G12x14y2[9]),  9,14},
  {&(_ZTV8G12x14y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI8G12x14y2[];
extern  VTBL_ENTRY _ZTV8G12x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x14y2[];
static VTBL_ENTRY alt_thunk_names416[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn20_N6E12x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn20_N6E12x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x14y2 = {  "G12x14y2", // class name
  bases_G12x14y2, 6,
  &(vtc_G12x14y2[0]), // expected_vtbl_contents
  &(vtt_G12x14y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G12x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x14y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x14y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names416,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x14y3  : virtual E12x14 , virtual F1 {
  int ff;
  ~G12x14y3(); // tgen
  G12x14y3(); // tgen
};
//SIG(1 G12x14y3) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G12x14y3 ::~G12x14y3(){ note_dtor("G12x14y3", this);} // tgen
G12x14y3 ::G12x14y3(){ note_ctor("G12x14y3", this);} // tgen

static void Test_G12x14y3()
{
  extern Class_Descriptor cd_G12x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G12x14y3, buf);
    G12x14y3 *dp, &lv = *(dp=new (buf) G12x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G12x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x14y3)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x14*), ABISELECT(24,12), "G12x14y3");
    check_base_class_offset(lv, (B1*)(C12*)(E12x14*), ABISELECT(40,24), "G12x14y3");
    check_base_class_offset(lv, (C12*)(E12x14*), ABISELECT(16,8), "G12x14y3");
    check_base_class_offset(lv, (D0*)(E12x14*), ABISELECT(52,32), "G12x14y3");
    check_base_class_offset(lv, (E12x14*), ABISELECT(16,8), "G12x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G12x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G12x14y3.ff");
    test_class_info(&lv, &cd_G12x14y3);
    dp->~G12x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x14y3(Test_G12x14y3, "G12x14y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G12x14y3C1Ev();
extern void _ZN8G12x14y3D1Ev();
Name_Map name_map_G12x14y3[] = {
  NSPAIR(_ZN8G12x14y3C1Ev),
  NSPAIR(_ZN8G12x14y3D1Ev),
  {0,0}
};
extern Class_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_E12x14;
extern VTBL_ENTRY _ZTI6E12x14[];
extern  VTBL_ENTRY _ZTV6E12x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x14y3[] = {
  // 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_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_E12x14,    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 _ZTI8G12x14y3[];
extern void _ZN6E12x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv)();
extern void ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn16_N6E12x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G12x14y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x14y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G12x14y3[0]),
  (VTBL_ENTRY)&_ZN6E12x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G12x14y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G12x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G12x14y3[];
extern void _ZN6E12x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x14__8G12x14y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x14[0]),
  (VTBL_ENTRY)&_ZN6E12x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C126E12x14__8G12x14y3[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C126E12x14__8G12x14y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv)();
extern void ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn16_N6E12x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x14__8G12x14y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E12x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv),
};
static  VTT_ENTRY vtt_G12x14y3[] = {
  {&(_ZTV8G12x14y3[6]),  6,20},
  {&(_ZTV8G12x14y3[11]),  11,20},
  {&(_ZTV8G12x14y3[15]),  15,20},
  {&(_ZTV8G12x14y3[19]),  19,20},
  {&(_tg__ZTV6E12x14__8G12x14y3[4]),  4,5},
  {&(_tg__ZTV3C126E12x14__8G12x14y3[3]),  3,3},
  {&(_tg__ZTV2B1__3C126E12x14__8G12x14y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E12x14__8G12x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x14y3[];
extern  VTBL_ENTRY _ZTV8G12x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x14y3[];
static VTBL_ENTRY alt_thunk_names417[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn16_N6E12x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn16_N6E12x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x14y3 = {  "G12x14y3", // class name
  bases_G12x14y3, 6,
  &(vtc_G12x14y3[0]), // expected_vtbl_contents
  &(vtt_G12x14y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G12x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x14y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x14y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names417,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x14y4  : E12x14 , F0 {
  int ff;
  ~G12x14y4(); // tgen
  G12x14y4(); // tgen
};
//SIG(1 G12x14y4) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G12x14y4 ::~G12x14y4(){ note_dtor("G12x14y4", this);} // tgen
G12x14y4 ::G12x14y4(){ note_ctor("G12x14y4", this);} // tgen

static void Test_G12x14y4()
{
  extern Class_Descriptor cd_G12x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G12x14y4, buf);
    G12x14y4 *dp, &lv = *(dp=new (buf) G12x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G12x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x14y4)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x14*), ABISELECT(8,4), "G12x14y4");
    check_base_class_offset(lv, (B1*)(C12*)(E12x14*), ABISELECT(32,24), "G12x14y4");
    check_base_class_offset(lv, (C12*)(E12x14*), 0, "G12x14y4");
    check_base_class_offset(lv, (D0*)(E12x14*), ABISELECT(44,32), "G12x14y4");
    check_base_class_offset(lv, (E12x14*), 0, "G12x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G12x14y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G12x14y4.ff");
    test_class_info(&lv, &cd_G12x14y4);
    dp->~G12x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x14y4(Test_G12x14y4, "G12x14y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G12x14y4C1Ev();
extern void _ZN8G12x14y4D1Ev();
Name_Map name_map_G12x14y4[] = {
  NSPAIR(_ZN8G12x14y4C1Ev),
  NSPAIR(_ZN8G12x14y4D1Ev),
  {0,0}
};
extern Class_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_E12x14;
extern VTBL_ENTRY _ZTI6E12x14[];
extern  VTBL_ENTRY _ZTV6E12x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x14y4[] = {
  // 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_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_E12x14,    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 _ZTI8G12x14y4[];
extern void _ZN6E12x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv)();
extern void ABISELECT(_ZThn32_N6E12x143fooEv,_ZThn24_N6E12x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x14y4[0]),
  (VTBL_ENTRY)&_ZN6E12x143fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G12x14y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv),
};
extern VTBL_ENTRY _ZTV8G12x14y4[];
extern void _ZN6E12x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x14__8G12x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x14[0]),
  (VTBL_ENTRY)&_ZN6E12x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C126E12x14__8G12x14y4[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C126E12x14__8G12x14y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv)();
extern void ABISELECT(_ZThn32_N6E12x143fooEv,_ZThn24_N6E12x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x14__8G12x14y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E12x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv),
};
static  VTT_ENTRY vtt_G12x14y4[] = {
  {&(_ZTV8G12x14y4[4]),  4,9},
  {&(_tg__ZTV6E12x14__8G12x14y4[4]),  4,5},
  {&(_tg__ZTV3C126E12x14__8G12x14y4[3]),  3,3},
  {&(_tg__ZTV2B1__3C126E12x14__8G12x14y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E12x14__8G12x14y4[3]),  3,4},
  {&(_ZTV8G12x14y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G12x14y4[];
extern  VTBL_ENTRY _ZTV8G12x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x14y4[];
static VTBL_ENTRY alt_thunk_names418[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x143fooEv,_ZThn24_N6E12x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x143fooEv,_ZThn24_N6E12x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x14y4 = {  "G12x14y4", // class name
  bases_G12x14y4, 6,
  &(vtc_G12x14y4[0]), // expected_vtbl_contents
  &(vtt_G12x14y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G12x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x14y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x14y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names418,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x14y5  : virtual E12x14 , F0 {
  int ff;
  ~G12x14y5(); // tgen
  G12x14y5(); // tgen
};
//SIG(1 G12x14y5) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G12x14y5 ::~G12x14y5(){ note_dtor("G12x14y5", this);} // tgen
G12x14y5 ::G12x14y5(){ note_ctor("G12x14y5", this);} // tgen

static void Test_G12x14y5()
{
  extern Class_Descriptor cd_G12x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x14y5, buf);
    G12x14y5 *dp, &lv = *(dp=new (buf) G12x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x14y5)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x14*), ABISELECT(24,16), "G12x14y5");
    check_base_class_offset(lv, (B1*)(C12*)(E12x14*), ABISELECT(40,28), "G12x14y5");
    check_base_class_offset(lv, (C12*)(E12x14*), ABISELECT(16,12), "G12x14y5");
    check_base_class_offset(lv, (D0*)(E12x14*), ABISELECT(52,36), "G12x14y5");
    check_base_class_offset(lv, (E12x14*), ABISELECT(16,12), "G12x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G12x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x14y5.ff");
    test_class_info(&lv, &cd_G12x14y5);
    dp->~G12x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x14y5(Test_G12x14y5, "G12x14y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G12x14y5C1Ev();
extern void _ZN8G12x14y5D1Ev();
Name_Map name_map_G12x14y5[] = {
  NSPAIR(_ZN8G12x14y5C1Ev),
  NSPAIR(_ZN8G12x14y5D1Ev),
  {0,0}
};
extern Class_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_E12x14;
extern VTBL_ENTRY _ZTI6E12x14[];
extern  VTBL_ENTRY _ZTV6E12x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x14y5[] = {
  // 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_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_E12x14,    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 _ZTI8G12x14y5[];
extern void _ZN6E12x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv)();
extern void ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn16_N6E12x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x14y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x14y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G12x14y5[0]),
  (VTBL_ENTRY)&_ZN6E12x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G12x14y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv),
};
extern VTBL_ENTRY _ZTV8G12x14y5[];
extern void _ZN6E12x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x14__8G12x14y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x14[0]),
  (VTBL_ENTRY)&_ZN6E12x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C126E12x14__8G12x14y5[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C126E12x14__8G12x14y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv)();
extern void ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn16_N6E12x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x14__8G12x14y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E12x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv),
};
static  VTT_ENTRY vtt_G12x14y5[] = {
  {&(_ZTV8G12x14y5[5]),  5,15},
  {&(_ZTV8G12x14y5[10]),  10,15},
  {&(_ZTV8G12x14y5[14]),  14,15},
  {&(_tg__ZTV6E12x14__8G12x14y5[4]),  4,5},
  {&(_tg__ZTV3C126E12x14__8G12x14y5[3]),  3,3},
  {&(_tg__ZTV2B1__3C126E12x14__8G12x14y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E12x14__8G12x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x14y5[];
extern  VTBL_ENTRY _ZTV8G12x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x14y5[];
static VTBL_ENTRY alt_thunk_names419[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn16_N6E12x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn16_N6E12x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x14y5 = {  "G12x14y5", // class name
  bases_G12x14y5, 6,
  &(vtc_G12x14y5[0]), // expected_vtbl_contents
  &(vtt_G12x14y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G12x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x14y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x14y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names419,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x14y6  : E12x14 , virtual F0 {
  int ff;
  ~G12x14y6(); // tgen
  G12x14y6(); // tgen
};
//SIG(1 G12x14y6) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G12x14y6 ::~G12x14y6(){ note_dtor("G12x14y6", this);} // tgen
G12x14y6 ::G12x14y6(){ note_ctor("G12x14y6", this);} // tgen

static void Test_G12x14y6()
{
  extern Class_Descriptor cd_G12x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G12x14y6, buf);
    G12x14y6 *dp, &lv = *(dp=new (buf) G12x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G12x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x14y6)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x14*), ABISELECT(8,4), "G12x14y6");
    check_base_class_offset(lv, (B1*)(C12*)(E12x14*), ABISELECT(24,20), "G12x14y6");
    check_base_class_offset(lv, (C12*)(E12x14*), 0, "G12x14y6");
    check_base_class_offset(lv, (D0*)(E12x14*), ABISELECT(36,28), "G12x14y6");
    check_base_class_offset(lv, (E12x14*), 0, "G12x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G12x14y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G12x14y6.ff");
    test_class_info(&lv, &cd_G12x14y6);
    dp->~G12x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x14y6(Test_G12x14y6, "G12x14y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G12x14y6C1Ev();
extern void _ZN8G12x14y6D1Ev();
Name_Map name_map_G12x14y6[] = {
  NSPAIR(_ZN8G12x14y6C1Ev),
  NSPAIR(_ZN8G12x14y6D1Ev),
  {0,0}
};
extern Class_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_E12x14;
extern VTBL_ENTRY _ZTI6E12x14[];
extern  VTBL_ENTRY _ZTV6E12x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x14y6[] = {
  // 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_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_E12x14,    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 _ZTI8G12x14y6[];
extern void _ZN6E12x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv)();
extern void ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn20_N6E12x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x14y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x14y6[0]),
  (VTBL_ENTRY)&_ZN6E12x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G12x14y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv),
};
extern VTBL_ENTRY _ZTV8G12x14y6[];
extern void _ZN6E12x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x14__8G12x14y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x14[0]),
  (VTBL_ENTRY)&_ZN6E12x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C126E12x14__8G12x14y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C126E12x14__8G12x14y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv)();
extern void ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn20_N6E12x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x14__8G12x14y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E12x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv),
};
static  VTT_ENTRY vtt_G12x14y6[] = {
  {&(_ZTV8G12x14y6[5]),  5,10},
  {&(_tg__ZTV6E12x14__8G12x14y6[4]),  4,5},
  {&(_tg__ZTV3C126E12x14__8G12x14y6[3]),  3,3},
  {&(_tg__ZTV2B1__3C126E12x14__8G12x14y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E12x14__8G12x14y6[3]),  3,4},
  {&(_ZTV8G12x14y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G12x14y6[];
extern  VTBL_ENTRY _ZTV8G12x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x14y6[];
static VTBL_ENTRY alt_thunk_names420[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn20_N6E12x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn20_N6E12x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x14y6 = {  "G12x14y6", // class name
  bases_G12x14y6, 6,
  &(vtc_G12x14y6[0]), // expected_vtbl_contents
  &(vtt_G12x14y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G12x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x14y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x14y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names420,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x14y7  : virtual E12x14 , virtual F0 {
  int ff;
  ~G12x14y7(); // tgen
  G12x14y7(); // tgen
};
//SIG(1 G12x14y7) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G12x14y7 ::~G12x14y7(){ note_dtor("G12x14y7", this);} // tgen
G12x14y7 ::G12x14y7(){ note_ctor("G12x14y7", this);} // tgen

static void Test_G12x14y7()
{
  extern Class_Descriptor cd_G12x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G12x14y7, buf);
    G12x14y7 *dp, &lv = *(dp=new (buf) G12x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G12x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x14y7)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x14*), ABISELECT(24,12), "G12x14y7");
    check_base_class_offset(lv, (B1*)(C12*)(E12x14*), ABISELECT(40,24), "G12x14y7");
    check_base_class_offset(lv, (C12*)(E12x14*), ABISELECT(16,8), "G12x14y7");
    check_base_class_offset(lv, (D0*)(E12x14*), ABISELECT(52,32), "G12x14y7");
    check_base_class_offset(lv, (E12x14*), ABISELECT(16,8), "G12x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G12x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G12x14y7.ff");
    test_class_info(&lv, &cd_G12x14y7);
    dp->~G12x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x14y7(Test_G12x14y7, "G12x14y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G12x14y7C1Ev();
extern void _ZN8G12x14y7D1Ev();
Name_Map name_map_G12x14y7[] = {
  NSPAIR(_ZN8G12x14y7C1Ev),
  NSPAIR(_ZN8G12x14y7D1Ev),
  {0,0}
};
extern Class_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_E12x14;
extern VTBL_ENTRY _ZTI6E12x14[];
extern  VTBL_ENTRY _ZTV6E12x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x14y7[] = {
  // 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_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_E12x14,    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 _ZTI8G12x14y7[];
extern void _ZN6E12x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv)();
extern void ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn16_N6E12x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x14y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x14y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G12x14y7[0]),
  (VTBL_ENTRY)&_ZN6E12x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G12x14y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv),
};
extern VTBL_ENTRY _ZTV8G12x14y7[];
extern void _ZN6E12x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x14__8G12x14y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x14[0]),
  (VTBL_ENTRY)&_ZN6E12x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C126E12x14__8G12x14y7[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C126E12x14__8G12x14y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv)();
extern void ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn16_N6E12x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x14__8G12x14y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E12x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv),
};
static  VTT_ENTRY vtt_G12x14y7[] = {
  {&(_ZTV8G12x14y7[6]),  6,16},
  {&(_ZTV8G12x14y7[11]),  11,16},
  {&(_ZTV8G12x14y7[15]),  15,16},
  {&(_tg__ZTV6E12x14__8G12x14y7[4]),  4,5},
  {&(_tg__ZTV3C126E12x14__8G12x14y7[3]),  3,3},
  {&(_tg__ZTV2B1__3C126E12x14__8G12x14y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E12x14__8G12x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x14y7[];
extern  VTBL_ENTRY _ZTV8G12x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x14y7[];
static VTBL_ENTRY alt_thunk_names421[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x143fooEv,_ZTv0_n12_N6E12x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn16_N6E12x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E12x143fooEv,_ZThn16_N6E12x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x14y7 = {  "G12x14y7", // class name
  bases_G12x14y7, 6,
  &(vtc_G12x14y7[0]), // expected_vtbl_contents
  &(vtt_G12x14y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G12x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x14y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x14y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names421,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E13x14  : C13 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E13x143fooEv
  ~E13x14(); // tgen
  E13x14(); // tgen
};
//SIG(-1 E13x14) C1{ BC2{ BC3{ v1 Fi} VBC4{ v1 Fi} Fi} VBC5{ Fi} v1 Fi}


void  E13x14 ::foo(){vfunc_called(this, "_ZN6E13x143fooEv");}
E13x14 ::~E13x14(){ note_dtor("E13x14", this);} // tgen
E13x14 ::E13x14(){ note_ctor("E13x14", this);} // tgen

static void Test_E13x14()
{
  extern Class_Descriptor cd_E13x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E13x14, buf);
    E13x14 *dp, &lv = *(dp=new (buf) E13x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E13x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E13x14)");
    check_base_class_offset(lv, (A1*)(C13*), 0, "E13x14");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(24,16), "E13x14");
    check_base_class_offset(lv, (C13*), 0, "E13x14");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E13x14");
    check_field_offset(lv, fd, ABISELECT(16,12), "E13x14.fd");
    test_class_info(&lv, &cd_E13x14);
    dp->~E13x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE13x14(Test_E13x14, "E13x14", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E13x14C1Ev();
extern void _ZN6E13x14D1Ev();
Name_Map name_map_E13x14[] = {
  NSPAIR(_ZN6E13x14C1Ev),
  NSPAIR(_ZN6E13x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x14[] = {
  // 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 _ZTI6E13x14[];
extern void _ZN6E13x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv)();
extern void ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn16_N6E13x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E13x14[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x14[0]),
  (VTBL_ENTRY)&_ZN6E13x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E13x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv),
};
extern VTBL_ENTRY _ZTV6E13x14[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__6E13x14[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__6E13x14[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E13x14[] = {
  {&(_ZTV6E13x14[4]),  4,9},
  {&(_tg__ZTV3C13__6E13x14[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__6E13x14[3]),  3,4},
  {&(_ZTV6E13x14[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6E13x14[];
extern  VTBL_ENTRY _ZTV6E13x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x14[];
static VTBL_ENTRY alt_thunk_names422[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn16_N6E13x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E13x14 = {  "E13x14", // class name
  bases_E13x14, 4,
  &(vtc_E13x14[0]), // expected_vtbl_contents
  &(vtt_E13x14[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E13x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E13x14),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E13x14),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names422,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x14y0  : E13x14 , F1 {
  int ff;
  ~G13x14y0(); // tgen
  G13x14y0(); // tgen
};
//SIG(1 G13x14y0) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G13x14y0 ::~G13x14y0(){ note_dtor("G13x14y0", this);} // tgen
G13x14y0 ::G13x14y0(){ note_ctor("G13x14y0", this);} // tgen

static void Test_G13x14y0()
{
  extern Class_Descriptor cd_G13x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x14y0, buf);
    G13x14y0 *dp, &lv = *(dp=new (buf) G13x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x14y0)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x14*), 0, "G13x14y0");
    check_base_class_offset(lv, (B1*)(C13*)(E13x14*), ABISELECT(40,28), "G13x14y0");
    check_base_class_offset(lv, (C13*)(E13x14*), 0, "G13x14y0");
    check_base_class_offset(lv, (D0*)(E13x14*), ABISELECT(52,36), "G13x14y0");
    check_base_class_offset(lv, (E13x14*), 0, "G13x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G13x14y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G13x14y0.ff");
    test_class_info(&lv, &cd_G13x14y0);
    dp->~G13x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x14y0(Test_G13x14y0, "G13x14y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G13x14y0C1Ev();
extern void _ZN8G13x14y0D1Ev();
Name_Map name_map_G13x14y0[] = {
  NSPAIR(_ZN8G13x14y0C1Ev),
  NSPAIR(_ZN8G13x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x14;
extern VTBL_ENTRY _ZTI6E13x14[];
extern  VTBL_ENTRY _ZTV6E13x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x14y0[] = {
  // 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_E13x14,    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 _ZTI8G13x14y0[];
extern void _ZN6E13x143fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv)();
extern void ABISELECT(_ZThn40_N6E13x143fooEv,_ZThn28_N6E13x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x14y0[0]),
  (VTBL_ENTRY)&_ZN6E13x143fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G13x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G13x14y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv),
};
extern VTBL_ENTRY _ZTV8G13x14y0[];
extern void _ZN6E13x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x14__8G13x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x14[0]),
  (VTBL_ENTRY)&_ZN6E13x143fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C136E13x14__8G13x14y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C136E13x14__8G13x14y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv)();
extern void ABISELECT(_ZThn40_N6E13x143fooEv,_ZThn28_N6E13x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x14__8G13x14y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E13x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv),
};
static  VTT_ENTRY vtt_G13x14y0[] = {
  {&(_ZTV8G13x14y0[4]),  4,12},
  {&(_tg__ZTV6E13x14__8G13x14y0[4]),  4,5},
  {&(_tg__ZTV3C136E13x14__8G13x14y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C136E13x14__8G13x14y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E13x14__8G13x14y0[3]),  3,4},
  {&(_ZTV8G13x14y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI8G13x14y0[];
extern  VTBL_ENTRY _ZTV8G13x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x14y0[];
static VTBL_ENTRY alt_thunk_names423[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E13x143fooEv,_ZThn28_N6E13x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E13x143fooEv,_ZThn28_N6E13x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x14y0 = {  "G13x14y0", // class name
  bases_G13x14y0, 6,
  &(vtc_G13x14y0[0]), // expected_vtbl_contents
  &(vtt_G13x14y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G13x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x14y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x14y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names423,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x14y1  : virtual E13x14 , F1 {
  int ff;
  ~G13x14y1(); // tgen
  G13x14y1(); // tgen
};
//SIG(1 G13x14y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G13x14y1 ::~G13x14y1(){ note_dtor("G13x14y1", this);} // tgen
G13x14y1 ::G13x14y1(){ note_ctor("G13x14y1", this);} // tgen

static void Test_G13x14y1()
{
  extern Class_Descriptor cd_G13x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x14y1, buf);
    G13x14y1 *dp, &lv = *(dp=new (buf) G13x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x14y1)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x14*), ABISELECT(16,12), "G13x14y1");
    check_base_class_offset(lv, (B1*)(C13*)(E13x14*), ABISELECT(40,28), "G13x14y1");
    check_base_class_offset(lv, (C13*)(E13x14*), ABISELECT(16,12), "G13x14y1");
    check_base_class_offset(lv, (D0*)(E13x14*), ABISELECT(52,36), "G13x14y1");
    check_base_class_offset(lv, (E13x14*), ABISELECT(16,12), "G13x14y1");
    check_base_class_offset(lv, (F1*), 0, "G13x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x14y1.ff");
    test_class_info(&lv, &cd_G13x14y1);
    dp->~G13x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x14y1(Test_G13x14y1, "G13x14y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G13x14y1C1Ev();
extern void _ZN8G13x14y1D1Ev();
Name_Map name_map_G13x14y1[] = {
  NSPAIR(_ZN8G13x14y1C1Ev),
  NSPAIR(_ZN8G13x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x14;
extern VTBL_ENTRY _ZTI6E13x14[];
extern  VTBL_ENTRY _ZTV6E13x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x14y1[] = {
  // 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_E13x14,    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 _ZTI8G13x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E13x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv)();
extern void ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn16_N6E13x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x14y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G13x14y1[0]),
  (VTBL_ENTRY)&_ZN6E13x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G13x14y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv),
};
extern VTBL_ENTRY _ZTV8G13x14y1[];
extern void _ZN6E13x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x14__8G13x14y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x14[0]),
  (VTBL_ENTRY)&_ZN6E13x143fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C136E13x14__8G13x14y1[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C136E13x14__8G13x14y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv)();
extern void ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn16_N6E13x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x14__8G13x14y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E13x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv),
};
static  VTT_ENTRY vtt_G13x14y1[] = {
  {&(_ZTV8G13x14y1[5]),  5,16},
  {&(_ZTV8G13x14y1[11]),  11,16},
  {&(_ZTV8G13x14y1[15]),  15,16},
  {&(_tg__ZTV6E13x14__8G13x14y1[4]),  4,5},
  {&(_tg__ZTV3C136E13x14__8G13x14y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C136E13x14__8G13x14y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E13x14__8G13x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x14y1[];
extern  VTBL_ENTRY _ZTV8G13x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x14y1[];
static VTBL_ENTRY alt_thunk_names424[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn16_N6E13x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn16_N6E13x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x14y1 = {  "G13x14y1", // class name
  bases_G13x14y1, 6,
  &(vtc_G13x14y1[0]), // expected_vtbl_contents
  &(vtt_G13x14y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G13x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x14y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x14y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names424,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x14y2  : E13x14 , virtual F1 {
  int ff;
  ~G13x14y2(); // tgen
  G13x14y2(); // tgen
};
//SIG(1 G13x14y2) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G13x14y2 ::~G13x14y2(){ note_dtor("G13x14y2", this);} // tgen
G13x14y2 ::G13x14y2(){ note_ctor("G13x14y2", this);} // tgen

static void Test_G13x14y2()
{
  extern Class_Descriptor cd_G13x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x14y2, buf);
    G13x14y2 *dp, &lv = *(dp=new (buf) G13x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x14y2)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x14*), 0, "G13x14y2");
    check_base_class_offset(lv, (B1*)(C13*)(E13x14*), ABISELECT(24,20), "G13x14y2");
    check_base_class_offset(lv, (C13*)(E13x14*), 0, "G13x14y2");
    check_base_class_offset(lv, (D0*)(E13x14*), ABISELECT(36,28), "G13x14y2");
    check_base_class_offset(lv, (E13x14*), 0, "G13x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G13x14y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G13x14y2.ff");
    test_class_info(&lv, &cd_G13x14y2);
    dp->~G13x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x14y2(Test_G13x14y2, "G13x14y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G13x14y2C1Ev();
extern void _ZN8G13x14y2D1Ev();
Name_Map name_map_G13x14y2[] = {
  NSPAIR(_ZN8G13x14y2C1Ev),
  NSPAIR(_ZN8G13x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x14;
extern VTBL_ENTRY _ZTI6E13x14[];
extern  VTBL_ENTRY _ZTV6E13x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x14y2[] = {
  // 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_E13x14,    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 _ZTI8G13x14y2[];
extern void _ZN6E13x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv)();
extern void ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn20_N6E13x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G13x14y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x14y2[0]),
  (VTBL_ENTRY)&_ZN6E13x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G13x14y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G13x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G13x14y2[];
extern void _ZN6E13x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x14__8G13x14y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x14[0]),
  (VTBL_ENTRY)&_ZN6E13x143fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C136E13x14__8G13x14y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C136E13x14__8G13x14y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv)();
extern void ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn20_N6E13x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x14__8G13x14y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E13x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv),
};
static  VTT_ENTRY vtt_G13x14y2[] = {
  {&(_ZTV8G13x14y2[5]),  5,14},
  {&(_tg__ZTV6E13x14__8G13x14y2[4]),  4,5},
  {&(_tg__ZTV3C136E13x14__8G13x14y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C136E13x14__8G13x14y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E13x14__8G13x14y2[3]),  3,4},
  {&(_ZTV8G13x14y2[9]),  9,14},
  {&(_ZTV8G13x14y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI8G13x14y2[];
extern  VTBL_ENTRY _ZTV8G13x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x14y2[];
static VTBL_ENTRY alt_thunk_names425[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn20_N6E13x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn20_N6E13x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x14y2 = {  "G13x14y2", // class name
  bases_G13x14y2, 6,
  &(vtc_G13x14y2[0]), // expected_vtbl_contents
  &(vtt_G13x14y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G13x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x14y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x14y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names425,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x14y3  : virtual E13x14 , virtual F1 {
  int ff;
  ~G13x14y3(); // tgen
  G13x14y3(); // tgen
};
//SIG(1 G13x14y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G13x14y3 ::~G13x14y3(){ note_dtor("G13x14y3", this);} // tgen
G13x14y3 ::G13x14y3(){ note_ctor("G13x14y3", this);} // tgen

static void Test_G13x14y3()
{
  extern Class_Descriptor cd_G13x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G13x14y3, buf);
    G13x14y3 *dp, &lv = *(dp=new (buf) G13x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G13x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x14y3)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x14*), ABISELECT(16,8), "G13x14y3");
    check_base_class_offset(lv, (B1*)(C13*)(E13x14*), ABISELECT(40,24), "G13x14y3");
    check_base_class_offset(lv, (C13*)(E13x14*), ABISELECT(16,8), "G13x14y3");
    check_base_class_offset(lv, (D0*)(E13x14*), ABISELECT(52,32), "G13x14y3");
    check_base_class_offset(lv, (E13x14*), ABISELECT(16,8), "G13x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G13x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G13x14y3.ff");
    test_class_info(&lv, &cd_G13x14y3);
    dp->~G13x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x14y3(Test_G13x14y3, "G13x14y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G13x14y3C1Ev();
extern void _ZN8G13x14y3D1Ev();
Name_Map name_map_G13x14y3[] = {
  NSPAIR(_ZN8G13x14y3C1Ev),
  NSPAIR(_ZN8G13x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x14;
extern VTBL_ENTRY _ZTI6E13x14[];
extern  VTBL_ENTRY _ZTV6E13x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x14y3[] = {
  // 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_E13x14,    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 _ZTI8G13x14y3[];
extern void _ZN6E13x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv)();
extern void ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn16_N6E13x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G13x14y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x14y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G13x14y3[0]),
  (VTBL_ENTRY)&_ZN6E13x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G13x14y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G13x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G13x14y3[];
extern void _ZN6E13x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x14__8G13x14y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x14[0]),
  (VTBL_ENTRY)&_ZN6E13x143fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C136E13x14__8G13x14y3[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C136E13x14__8G13x14y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv)();
extern void ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn16_N6E13x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x14__8G13x14y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E13x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv),
};
static  VTT_ENTRY vtt_G13x14y3[] = {
  {&(_ZTV8G13x14y3[6]),  6,20},
  {&(_ZTV8G13x14y3[11]),  11,20},
  {&(_ZTV8G13x14y3[15]),  15,20},
  {&(_ZTV8G13x14y3[19]),  19,20},
  {&(_tg__ZTV6E13x14__8G13x14y3[4]),  4,5},
  {&(_tg__ZTV3C136E13x14__8G13x14y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C136E13x14__8G13x14y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E13x14__8G13x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x14y3[];
extern  VTBL_ENTRY _ZTV8G13x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x14y3[];
static VTBL_ENTRY alt_thunk_names426[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn16_N6E13x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn16_N6E13x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x14y3 = {  "G13x14y3", // class name
  bases_G13x14y3, 6,
  &(vtc_G13x14y3[0]), // expected_vtbl_contents
  &(vtt_G13x14y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G13x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x14y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x14y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names426,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x14y4  : E13x14 , F0 {
  int ff;
  ~G13x14y4(); // tgen
  G13x14y4(); // tgen
};
//SIG(1 G13x14y4) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G13x14y4 ::~G13x14y4(){ note_dtor("G13x14y4", this);} // tgen
G13x14y4 ::G13x14y4(){ note_ctor("G13x14y4", this);} // tgen

static void Test_G13x14y4()
{
  extern Class_Descriptor cd_G13x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G13x14y4, buf);
    G13x14y4 *dp, &lv = *(dp=new (buf) G13x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G13x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x14y4)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x14*), 0, "G13x14y4");
    check_base_class_offset(lv, (B1*)(C13*)(E13x14*), ABISELECT(32,24), "G13x14y4");
    check_base_class_offset(lv, (C13*)(E13x14*), 0, "G13x14y4");
    check_base_class_offset(lv, (D0*)(E13x14*), ABISELECT(44,32), "G13x14y4");
    check_base_class_offset(lv, (E13x14*), 0, "G13x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G13x14y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G13x14y4.ff");
    test_class_info(&lv, &cd_G13x14y4);
    dp->~G13x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x14y4(Test_G13x14y4, "G13x14y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G13x14y4C1Ev();
extern void _ZN8G13x14y4D1Ev();
Name_Map name_map_G13x14y4[] = {
  NSPAIR(_ZN8G13x14y4C1Ev),
  NSPAIR(_ZN8G13x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x14;
extern VTBL_ENTRY _ZTI6E13x14[];
extern  VTBL_ENTRY _ZTV6E13x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x14y4[] = {
  // 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_E13x14,    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 _ZTI8G13x14y4[];
extern void _ZN6E13x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv)();
extern void ABISELECT(_ZThn32_N6E13x143fooEv,_ZThn24_N6E13x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x14y4[0]),
  (VTBL_ENTRY)&_ZN6E13x143fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G13x14y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv),
};
extern VTBL_ENTRY _ZTV8G13x14y4[];
extern void _ZN6E13x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x14__8G13x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x14[0]),
  (VTBL_ENTRY)&_ZN6E13x143fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C136E13x14__8G13x14y4[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C136E13x14__8G13x14y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv)();
extern void ABISELECT(_ZThn32_N6E13x143fooEv,_ZThn24_N6E13x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x14__8G13x14y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E13x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv),
};
static  VTT_ENTRY vtt_G13x14y4[] = {
  {&(_ZTV8G13x14y4[4]),  4,9},
  {&(_tg__ZTV6E13x14__8G13x14y4[4]),  4,5},
  {&(_tg__ZTV3C136E13x14__8G13x14y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C136E13x14__8G13x14y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E13x14__8G13x14y4[3]),  3,4},
  {&(_ZTV8G13x14y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G13x14y4[];
extern  VTBL_ENTRY _ZTV8G13x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x14y4[];
static VTBL_ENTRY alt_thunk_names427[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x143fooEv,_ZThn24_N6E13x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x143fooEv,_ZThn24_N6E13x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x14y4 = {  "G13x14y4", // class name
  bases_G13x14y4, 6,
  &(vtc_G13x14y4[0]), // expected_vtbl_contents
  &(vtt_G13x14y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G13x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x14y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x14y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names427,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x14y5  : virtual E13x14 , F0 {
  int ff;
  ~G13x14y5(); // tgen
  G13x14y5(); // tgen
};
//SIG(1 G13x14y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G13x14y5 ::~G13x14y5(){ note_dtor("G13x14y5", this);} // tgen
G13x14y5 ::G13x14y5(){ note_ctor("G13x14y5", this);} // tgen

static void Test_G13x14y5()
{
  extern Class_Descriptor cd_G13x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x14y5, buf);
    G13x14y5 *dp, &lv = *(dp=new (buf) G13x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x14y5)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x14*), ABISELECT(16,12), "G13x14y5");
    check_base_class_offset(lv, (B1*)(C13*)(E13x14*), ABISELECT(40,28), "G13x14y5");
    check_base_class_offset(lv, (C13*)(E13x14*), ABISELECT(16,12), "G13x14y5");
    check_base_class_offset(lv, (D0*)(E13x14*), ABISELECT(52,36), "G13x14y5");
    check_base_class_offset(lv, (E13x14*), ABISELECT(16,12), "G13x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G13x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x14y5.ff");
    test_class_info(&lv, &cd_G13x14y5);
    dp->~G13x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x14y5(Test_G13x14y5, "G13x14y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G13x14y5C1Ev();
extern void _ZN8G13x14y5D1Ev();
Name_Map name_map_G13x14y5[] = {
  NSPAIR(_ZN8G13x14y5C1Ev),
  NSPAIR(_ZN8G13x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x14;
extern VTBL_ENTRY _ZTI6E13x14[];
extern  VTBL_ENTRY _ZTV6E13x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x14y5[] = {
  // 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_E13x14,    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 _ZTI8G13x14y5[];
extern void _ZN6E13x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv)();
extern void ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn16_N6E13x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x14y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x14y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G13x14y5[0]),
  (VTBL_ENTRY)&_ZN6E13x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G13x14y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv),
};
extern VTBL_ENTRY _ZTV8G13x14y5[];
extern void _ZN6E13x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x14__8G13x14y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x14[0]),
  (VTBL_ENTRY)&_ZN6E13x143fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C136E13x14__8G13x14y5[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C136E13x14__8G13x14y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv)();
extern void ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn16_N6E13x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x14__8G13x14y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E13x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv),
};
static  VTT_ENTRY vtt_G13x14y5[] = {
  {&(_ZTV8G13x14y5[5]),  5,15},
  {&(_ZTV8G13x14y5[10]),  10,15},
  {&(_ZTV8G13x14y5[14]),  14,15},
  {&(_tg__ZTV6E13x14__8G13x14y5[4]),  4,5},
  {&(_tg__ZTV3C136E13x14__8G13x14y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C136E13x14__8G13x14y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E13x14__8G13x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x14y5[];
extern  VTBL_ENTRY _ZTV8G13x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x14y5[];
static VTBL_ENTRY alt_thunk_names428[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn16_N6E13x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn16_N6E13x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x14y5 = {  "G13x14y5", // class name
  bases_G13x14y5, 6,
  &(vtc_G13x14y5[0]), // expected_vtbl_contents
  &(vtt_G13x14y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G13x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x14y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x14y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names428,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x14y6  : E13x14 , virtual F0 {
  int ff;
  ~G13x14y6(); // tgen
  G13x14y6(); // tgen
};
//SIG(1 G13x14y6) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G13x14y6 ::~G13x14y6(){ note_dtor("G13x14y6", this);} // tgen
G13x14y6 ::G13x14y6(){ note_ctor("G13x14y6", this);} // tgen

static void Test_G13x14y6()
{
  extern Class_Descriptor cd_G13x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G13x14y6, buf);
    G13x14y6 *dp, &lv = *(dp=new (buf) G13x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G13x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x14y6)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x14*), 0, "G13x14y6");
    check_base_class_offset(lv, (B1*)(C13*)(E13x14*), ABISELECT(24,20), "G13x14y6");
    check_base_class_offset(lv, (C13*)(E13x14*), 0, "G13x14y6");
    check_base_class_offset(lv, (D0*)(E13x14*), ABISELECT(36,28), "G13x14y6");
    check_base_class_offset(lv, (E13x14*), 0, "G13x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G13x14y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G13x14y6.ff");
    test_class_info(&lv, &cd_G13x14y6);
    dp->~G13x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x14y6(Test_G13x14y6, "G13x14y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G13x14y6C1Ev();
extern void _ZN8G13x14y6D1Ev();
Name_Map name_map_G13x14y6[] = {
  NSPAIR(_ZN8G13x14y6C1Ev),
  NSPAIR(_ZN8G13x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x14;
extern VTBL_ENTRY _ZTI6E13x14[];
extern  VTBL_ENTRY _ZTV6E13x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x14y6[] = {
  // 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_E13x14,    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 _ZTI8G13x14y6[];
extern void _ZN6E13x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv)();
extern void ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn20_N6E13x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x14y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x14y6[0]),
  (VTBL_ENTRY)&_ZN6E13x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G13x14y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv),
};
extern VTBL_ENTRY _ZTV8G13x14y6[];
extern void _ZN6E13x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x14__8G13x14y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x14[0]),
  (VTBL_ENTRY)&_ZN6E13x143fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C136E13x14__8G13x14y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C136E13x14__8G13x14y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv)();
extern void ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn20_N6E13x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x14__8G13x14y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E13x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv),
};
static  VTT_ENTRY vtt_G13x14y6[] = {
  {&(_ZTV8G13x14y6[5]),  5,10},
  {&(_tg__ZTV6E13x14__8G13x14y6[4]),  4,5},
  {&(_tg__ZTV3C136E13x14__8G13x14y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C136E13x14__8G13x14y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E13x14__8G13x14y6[3]),  3,4},
  {&(_ZTV8G13x14y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G13x14y6[];
extern  VTBL_ENTRY _ZTV8G13x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x14y6[];
static VTBL_ENTRY alt_thunk_names429[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn20_N6E13x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn20_N6E13x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x14y6 = {  "G13x14y6", // class name
  bases_G13x14y6, 6,
  &(vtc_G13x14y6[0]), // expected_vtbl_contents
  &(vtt_G13x14y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G13x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x14y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x14y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names429,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x14y7  : virtual E13x14 , virtual F0 {
  int ff;
  ~G13x14y7(); // tgen
  G13x14y7(); // tgen
};
//SIG(1 G13x14y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G13x14y7 ::~G13x14y7(){ note_dtor("G13x14y7", this);} // tgen
G13x14y7 ::G13x14y7(){ note_ctor("G13x14y7", this);} // tgen

static void Test_G13x14y7()
{
  extern Class_Descriptor cd_G13x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G13x14y7, buf);
    G13x14y7 *dp, &lv = *(dp=new (buf) G13x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G13x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x14y7)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x14*), ABISELECT(16,8), "G13x14y7");
    check_base_class_offset(lv, (B1*)(C13*)(E13x14*), ABISELECT(40,24), "G13x14y7");
    check_base_class_offset(lv, (C13*)(E13x14*), ABISELECT(16,8), "G13x14y7");
    check_base_class_offset(lv, (D0*)(E13x14*), ABISELECT(52,32), "G13x14y7");
    check_base_class_offset(lv, (E13x14*), ABISELECT(16,8), "G13x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G13x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G13x14y7.ff");
    test_class_info(&lv, &cd_G13x14y7);
    dp->~G13x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x14y7(Test_G13x14y7, "G13x14y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G13x14y7C1Ev();
extern void _ZN8G13x14y7D1Ev();
Name_Map name_map_G13x14y7[] = {
  NSPAIR(_ZN8G13x14y7C1Ev),
  NSPAIR(_ZN8G13x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x14;
extern VTBL_ENTRY _ZTI6E13x14[];
extern  VTBL_ENTRY _ZTV6E13x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x14y7[] = {
  // 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_E13x14,    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 _ZTI8G13x14y7[];
extern void _ZN6E13x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv)();
extern void ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn16_N6E13x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x14y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x14y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G13x14y7[0]),
  (VTBL_ENTRY)&_ZN6E13x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G13x14y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv),
};
extern VTBL_ENTRY _ZTV8G13x14y7[];
extern void _ZN6E13x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x14__8G13x14y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x14[0]),
  (VTBL_ENTRY)&_ZN6E13x143fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C136E13x14__8G13x14y7[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C136E13x14__8G13x14y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv)();
extern void ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn16_N6E13x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x14__8G13x14y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E13x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv),
};
static  VTT_ENTRY vtt_G13x14y7[] = {
  {&(_ZTV8G13x14y7[6]),  6,16},
  {&(_ZTV8G13x14y7[11]),  11,16},
  {&(_ZTV8G13x14y7[15]),  15,16},
  {&(_tg__ZTV6E13x14__8G13x14y7[4]),  4,5},
  {&(_tg__ZTV3C136E13x14__8G13x14y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C136E13x14__8G13x14y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E13x14__8G13x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x14y7[];
extern  VTBL_ENTRY _ZTV8G13x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x14y7[];
static VTBL_ENTRY alt_thunk_names430[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x143fooEv,_ZTv0_n12_N6E13x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn16_N6E13x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x143fooEv,_ZThn16_N6E13x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x14y7 = {  "G13x14y7", // class name
  bases_G13x14y7, 6,
  &(vtc_G13x14y7[0]), // expected_vtbl_contents
  &(vtt_G13x14y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G13x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x14y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x14y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names430,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E14x14  : C14 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E14x143fooEv
  ~E14x14(); // tgen
  E14x14(); // tgen
};
//SIG(-1 E14x14) C1{ BC2{ VBC3{ Fi} VBC4{ v1 Fi} Fi} VBC5{ Fi} v1 Fi}


void  E14x14 ::foo(){vfunc_called(this, "_ZN6E14x143fooEv");}
E14x14 ::~E14x14(){ note_dtor("E14x14", this);} // tgen
E14x14 ::E14x14(){ note_ctor("E14x14", this);} // tgen

static void Test_E14x14()
{
  extern Class_Descriptor cd_E14x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E14x14, buf);
    E14x14 *dp, &lv = *(dp=new (buf) E14x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E14x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E14x14)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(16,12), "E14x14");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(24,16), "E14x14");
    check_base_class_offset(lv, (C14*), 0, "E14x14");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E14x14");
    check_field_offset(lv, fd, ABISELECT(12,8), "E14x14.fd");
    test_class_info(&lv, &cd_E14x14);
    dp->~E14x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE14x14(Test_E14x14, "E14x14", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E14x14C1Ev();
extern void _ZN6E14x14D1Ev();
Name_Map name_map_E14x14[] = {
  NSPAIR(_ZN6E14x14C1Ev),
  NSPAIR(_ZN6E14x14D1Ev),
  {0,0}
};
extern Class_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_E14x14[] = {
  // 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_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 _ZTI6E14x14[];
extern void _ZN6E14x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv)();
extern void ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn16_N6E14x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E14x14[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x14[0]),
  (VTBL_ENTRY)&_ZN6E14x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E14x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv),
};
extern VTBL_ENTRY _ZTV6E14x14[];
static  VTBL_ENTRY _tg__ZTV3C14__6E14x14[] = {
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__6E14x14[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E14x14[] = {
  {&(_ZTV6E14x14[5]),  5,10},
  {&(_tg__ZTV3C14__6E14x14[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__6E14x14[3]),  3,4},
  {&(_ZTV6E14x14[9]),  9,10},
};
extern VTBL_ENTRY _ZTI6E14x14[];
extern  VTBL_ENTRY _ZTV6E14x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x14[];
static VTBL_ENTRY alt_thunk_names431[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn16_N6E14x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E14x14 = {  "E14x14", // class name
  bases_E14x14, 4,
  &(vtc_E14x14[0]), // expected_vtbl_contents
  &(vtt_E14x14[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E14x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E14x14),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E14x14),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names431,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x14y0  : E14x14 , F1 {
  int ff;
  ~G14x14y0(); // tgen
  G14x14y0(); // tgen
};
//SIG(1 G14x14y0) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G14x14y0 ::~G14x14y0(){ note_dtor("G14x14y0", this);} // tgen
G14x14y0 ::G14x14y0(){ note_ctor("G14x14y0", this);} // tgen

static void Test_G14x14y0()
{
  extern Class_Descriptor cd_G14x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x14y0, buf);
    G14x14y0 *dp, &lv = *(dp=new (buf) G14x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x14y0)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x14*), ABISELECT(32,24), "G14x14y0");
    check_base_class_offset(lv, (B1*)(C14*)(E14x14*), ABISELECT(40,28), "G14x14y0");
    check_base_class_offset(lv, (C14*)(E14x14*), 0, "G14x14y0");
    check_base_class_offset(lv, (D0*)(E14x14*), ABISELECT(52,36), "G14x14y0");
    check_base_class_offset(lv, (E14x14*), 0, "G14x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G14x14y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G14x14y0.ff");
    test_class_info(&lv, &cd_G14x14y0);
    dp->~G14x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x14y0(Test_G14x14y0, "G14x14y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G14x14y0C1Ev();
extern void _ZN8G14x14y0D1Ev();
Name_Map name_map_G14x14y0[] = {
  NSPAIR(_ZN8G14x14y0C1Ev),
  NSPAIR(_ZN8G14x14y0D1Ev),
  {0,0}
};
extern Class_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_E14x14;
extern VTBL_ENTRY _ZTI6E14x14[];
extern  VTBL_ENTRY _ZTV6E14x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x14y0[] = {
  // 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_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_E14x14,    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 _ZTI8G14x14y0[];
extern void _ZN6E14x143fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv)();
extern void ABISELECT(_ZThn40_N6E14x143fooEv,_ZThn28_N6E14x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x14y0[0]),
  (VTBL_ENTRY)&_ZN6E14x143fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G14x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G14x14y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv),
};
extern VTBL_ENTRY _ZTV8G14x14y0[];
extern void _ZN6E14x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x14__8G14x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x14[0]),
  (VTBL_ENTRY)&_ZN6E14x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C146E14x14__8G14x14y0[] = {
  ABISELECT(40,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C146E14x14__8G14x14y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv)();
extern void ABISELECT(_ZThn40_N6E14x143fooEv,_ZThn28_N6E14x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x14__8G14x14y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E14x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv),
};
static  VTT_ENTRY vtt_G14x14y0[] = {
  {&(_ZTV8G14x14y0[5]),  5,13},
  {&(_tg__ZTV6E14x14__8G14x14y0[5]),  5,6},
  {&(_tg__ZTV3C146E14x14__8G14x14y0[4]),  4,4},
  {&(_tg__ZTV2B1__3C146E14x14__8G14x14y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E14x14__8G14x14y0[3]),  3,4},
  {&(_ZTV8G14x14y0[12]),  12,13},
};
extern VTBL_ENTRY _ZTI8G14x14y0[];
extern  VTBL_ENTRY _ZTV8G14x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x14y0[];
static VTBL_ENTRY alt_thunk_names432[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E14x143fooEv,_ZThn28_N6E14x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E14x143fooEv,_ZThn28_N6E14x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x14y0 = {  "G14x14y0", // class name
  bases_G14x14y0, 6,
  &(vtc_G14x14y0[0]), // expected_vtbl_contents
  &(vtt_G14x14y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G14x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x14y0),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x14y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names432,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x14y1  : virtual E14x14 , F1 {
  int ff;
  ~G14x14y1(); // tgen
  G14x14y1(); // tgen
};
//SIG(1 G14x14y1) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G14x14y1 ::~G14x14y1(){ note_dtor("G14x14y1", this);} // tgen
G14x14y1 ::G14x14y1(){ note_ctor("G14x14y1", this);} // tgen

static void Test_G14x14y1()
{
  extern Class_Descriptor cd_G14x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x14y1, buf);
    G14x14y1 *dp, &lv = *(dp=new (buf) G14x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x14y1)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x14*), ABISELECT(32,24), "G14x14y1");
    check_base_class_offset(lv, (B1*)(C14*)(E14x14*), ABISELECT(40,28), "G14x14y1");
    check_base_class_offset(lv, (C14*)(E14x14*), ABISELECT(16,12), "G14x14y1");
    check_base_class_offset(lv, (D0*)(E14x14*), ABISELECT(52,36), "G14x14y1");
    check_base_class_offset(lv, (E14x14*), ABISELECT(16,12), "G14x14y1");
    check_base_class_offset(lv, (F1*), 0, "G14x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x14y1.ff");
    test_class_info(&lv, &cd_G14x14y1);
    dp->~G14x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x14y1(Test_G14x14y1, "G14x14y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G14x14y1C1Ev();
extern void _ZN8G14x14y1D1Ev();
Name_Map name_map_G14x14y1[] = {
  NSPAIR(_ZN8G14x14y1C1Ev),
  NSPAIR(_ZN8G14x14y1D1Ev),
  {0,0}
};
extern Class_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_E14x14;
extern VTBL_ENTRY _ZTI6E14x14[];
extern  VTBL_ENTRY _ZTV6E14x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x14y1[] = {
  // 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_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_E14x14,    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 _ZTI8G14x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E14x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv)();
extern void ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn16_N6E14x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x14y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G14x14y1[0]),
  (VTBL_ENTRY)&_ZN6E14x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G14x14y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv),
};
extern VTBL_ENTRY _ZTV8G14x14y1[];
extern void _ZN6E14x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x14__8G14x14y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x14[0]),
  (VTBL_ENTRY)&_ZN6E14x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C146E14x14__8G14x14y1[] = {
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C146E14x14__8G14x14y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv)();
extern void ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn16_N6E14x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x14__8G14x14y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E14x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv),
};
static  VTT_ENTRY vtt_G14x14y1[] = {
  {&(_ZTV8G14x14y1[6]),  6,18},
  {&(_ZTV8G14x14y1[13]),  13,18},
  {&(_ZTV8G14x14y1[17]),  17,18},
  {&(_tg__ZTV6E14x14__8G14x14y1[5]),  5,6},
  {&(_tg__ZTV3C146E14x14__8G14x14y1[4]),  4,4},
  {&(_tg__ZTV2B1__3C146E14x14__8G14x14y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E14x14__8G14x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x14y1[];
extern  VTBL_ENTRY _ZTV8G14x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x14y1[];
static VTBL_ENTRY alt_thunk_names433[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn16_N6E14x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn16_N6E14x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x14y1 = {  "G14x14y1", // class name
  bases_G14x14y1, 6,
  &(vtc_G14x14y1[0]), // expected_vtbl_contents
  &(vtt_G14x14y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G14x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x14y1),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x14y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names433,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x14y2  : E14x14 , virtual F1 {
  int ff;
  ~G14x14y2(); // tgen
  G14x14y2(); // tgen
};
//SIG(1 G14x14y2) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G14x14y2 ::~G14x14y2(){ note_dtor("G14x14y2", this);} // tgen
G14x14y2 ::G14x14y2(){ note_ctor("G14x14y2", this);} // tgen

static void Test_G14x14y2()
{
  extern Class_Descriptor cd_G14x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x14y2, buf);
    G14x14y2 *dp, &lv = *(dp=new (buf) G14x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x14y2)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x14*), ABISELECT(20,16), "G14x14y2");
    check_base_class_offset(lv, (B1*)(C14*)(E14x14*), ABISELECT(24,20), "G14x14y2");
    check_base_class_offset(lv, (C14*)(E14x14*), 0, "G14x14y2");
    check_base_class_offset(lv, (D0*)(E14x14*), ABISELECT(36,28), "G14x14y2");
    check_base_class_offset(lv, (E14x14*), 0, "G14x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G14x14y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G14x14y2.ff");
    test_class_info(&lv, &cd_G14x14y2);
    dp->~G14x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x14y2(Test_G14x14y2, "G14x14y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G14x14y2C1Ev();
extern void _ZN8G14x14y2D1Ev();
Name_Map name_map_G14x14y2[] = {
  NSPAIR(_ZN8G14x14y2C1Ev),
  NSPAIR(_ZN8G14x14y2D1Ev),
  {0,0}
};
extern Class_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_E14x14;
extern VTBL_ENTRY _ZTI6E14x14[];
extern  VTBL_ENTRY _ZTV6E14x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x14y2[] = {
  // 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_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_E14x14,    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 _ZTI8G14x14y2[];
extern void _ZN6E14x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv)();
extern void ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn20_N6E14x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G14x14y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x14y2[0]),
  (VTBL_ENTRY)&_ZN6E14x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G14x14y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G14x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G14x14y2[];
extern void _ZN6E14x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x14__8G14x14y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x14[0]),
  (VTBL_ENTRY)&_ZN6E14x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C146E14x14__8G14x14y2[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C146E14x14__8G14x14y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv)();
extern void ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn20_N6E14x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x14__8G14x14y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E14x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv),
};
static  VTT_ENTRY vtt_G14x14y2[] = {
  {&(_ZTV8G14x14y2[6]),  6,15},
  {&(_tg__ZTV6E14x14__8G14x14y2[5]),  5,6},
  {&(_tg__ZTV3C146E14x14__8G14x14y2[4]),  4,4},
  {&(_tg__ZTV2B1__3C146E14x14__8G14x14y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E14x14__8G14x14y2[3]),  3,4},
  {&(_ZTV8G14x14y2[10]),  10,15},
  {&(_ZTV8G14x14y2[14]),  14,15},
};
extern VTBL_ENTRY _ZTI8G14x14y2[];
extern  VTBL_ENTRY _ZTV8G14x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x14y2[];
static VTBL_ENTRY alt_thunk_names434[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn20_N6E14x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn20_N6E14x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x14y2 = {  "G14x14y2", // class name
  bases_G14x14y2, 6,
  &(vtc_G14x14y2[0]), // expected_vtbl_contents
  &(vtt_G14x14y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G14x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x14y2),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x14y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names434,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x14y3  : virtual E14x14 , virtual F1 {
  int ff;
  ~G14x14y3(); // tgen
  G14x14y3(); // tgen
};
//SIG(1 G14x14y3) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G14x14y3 ::~G14x14y3(){ note_dtor("G14x14y3", this);} // tgen
G14x14y3 ::G14x14y3(){ note_ctor("G14x14y3", this);} // tgen

static void Test_G14x14y3()
{
  extern Class_Descriptor cd_G14x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G14x14y3, buf);
    G14x14y3 *dp, &lv = *(dp=new (buf) G14x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G14x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x14y3)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x14*), ABISELECT(32,20), "G14x14y3");
    check_base_class_offset(lv, (B1*)(C14*)(E14x14*), ABISELECT(40,24), "G14x14y3");
    check_base_class_offset(lv, (C14*)(E14x14*), ABISELECT(16,8), "G14x14y3");
    check_base_class_offset(lv, (D0*)(E14x14*), ABISELECT(52,32), "G14x14y3");
    check_base_class_offset(lv, (E14x14*), ABISELECT(16,8), "G14x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G14x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G14x14y3.ff");
    test_class_info(&lv, &cd_G14x14y3);
    dp->~G14x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x14y3(Test_G14x14y3, "G14x14y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G14x14y3C1Ev();
extern void _ZN8G14x14y3D1Ev();
Name_Map name_map_G14x14y3[] = {
  NSPAIR(_ZN8G14x14y3C1Ev),
  NSPAIR(_ZN8G14x14y3D1Ev),
  {0,0}
};
extern Class_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_E14x14;
extern VTBL_ENTRY _ZTI6E14x14[];
extern  VTBL_ENTRY _ZTV6E14x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x14y3[] = {
  // 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_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_E14x14,    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 _ZTI8G14x14y3[];
extern void _ZN6E14x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv)();
extern void ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn16_N6E14x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G14x14y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x14y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G14x14y3[0]),
  (VTBL_ENTRY)&_ZN6E14x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G14x14y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G14x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G14x14y3[];
extern void _ZN6E14x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x14__8G14x14y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x14[0]),
  (VTBL_ENTRY)&_ZN6E14x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C146E14x14__8G14x14y3[] = {
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C146E14x14__8G14x14y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv)();
extern void ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn16_N6E14x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x14__8G14x14y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E14x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv),
};
static  VTT_ENTRY vtt_G14x14y3[] = {
  {&(_ZTV8G14x14y3[7]),  7,22},
  {&(_ZTV8G14x14y3[13]),  13,22},
  {&(_ZTV8G14x14y3[17]),  17,22},
  {&(_ZTV8G14x14y3[21]),  21,22},
  {&(_tg__ZTV6E14x14__8G14x14y3[5]),  5,6},
  {&(_tg__ZTV3C146E14x14__8G14x14y3[4]),  4,4},
  {&(_tg__ZTV2B1__3C146E14x14__8G14x14y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E14x14__8G14x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x14y3[];
extern  VTBL_ENTRY _ZTV8G14x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x14y3[];
static VTBL_ENTRY alt_thunk_names435[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn16_N6E14x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn16_N6E14x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x14y3 = {  "G14x14y3", // class name
  bases_G14x14y3, 6,
  &(vtc_G14x14y3[0]), // expected_vtbl_contents
  &(vtt_G14x14y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G14x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x14y3),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x14y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names435,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x14y4  : E14x14 , F0 {
  int ff;
  ~G14x14y4(); // tgen
  G14x14y4(); // tgen
};
//SIG(1 G14x14y4) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G14x14y4 ::~G14x14y4(){ note_dtor("G14x14y4", this);} // tgen
G14x14y4 ::G14x14y4(){ note_ctor("G14x14y4", this);} // tgen

static void Test_G14x14y4()
{
  extern Class_Descriptor cd_G14x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G14x14y4, buf);
    G14x14y4 *dp, &lv = *(dp=new (buf) G14x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G14x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x14y4)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x14*), ABISELECT(24,20), "G14x14y4");
    check_base_class_offset(lv, (B1*)(C14*)(E14x14*), ABISELECT(32,24), "G14x14y4");
    check_base_class_offset(lv, (C14*)(E14x14*), 0, "G14x14y4");
    check_base_class_offset(lv, (D0*)(E14x14*), ABISELECT(44,32), "G14x14y4");
    check_base_class_offset(lv, (E14x14*), 0, "G14x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G14x14y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G14x14y4.ff");
    test_class_info(&lv, &cd_G14x14y4);
    dp->~G14x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x14y4(Test_G14x14y4, "G14x14y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G14x14y4C1Ev();
extern void _ZN8G14x14y4D1Ev();
Name_Map name_map_G14x14y4[] = {
  NSPAIR(_ZN8G14x14y4C1Ev),
  NSPAIR(_ZN8G14x14y4D1Ev),
  {0,0}
};
extern Class_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_E14x14;
extern VTBL_ENTRY _ZTI6E14x14[];
extern  VTBL_ENTRY _ZTV6E14x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x14y4[] = {
  // 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_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_E14x14,    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 _ZTI8G14x14y4[];
extern void _ZN6E14x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv)();
extern void ABISELECT(_ZThn32_N6E14x143fooEv,_ZThn24_N6E14x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x14y4[0]),
  (VTBL_ENTRY)&_ZN6E14x143fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G14x14y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv),
};
extern VTBL_ENTRY _ZTV8G14x14y4[];
extern void _ZN6E14x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x14__8G14x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x14[0]),
  (VTBL_ENTRY)&_ZN6E14x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C146E14x14__8G14x14y4[] = {
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C146E14x14__8G14x14y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv)();
extern void ABISELECT(_ZThn32_N6E14x143fooEv,_ZThn24_N6E14x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x14__8G14x14y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E14x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv),
};
static  VTT_ENTRY vtt_G14x14y4[] = {
  {&(_ZTV8G14x14y4[5]),  5,10},
  {&(_tg__ZTV6E14x14__8G14x14y4[5]),  5,6},
  {&(_tg__ZTV3C146E14x14__8G14x14y4[4]),  4,4},
  {&(_tg__ZTV2B1__3C146E14x14__8G14x14y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E14x14__8G14x14y4[3]),  3,4},
  {&(_ZTV8G14x14y4[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G14x14y4[];
extern  VTBL_ENTRY _ZTV8G14x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x14y4[];
static VTBL_ENTRY alt_thunk_names436[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x143fooEv,_ZThn24_N6E14x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x143fooEv,_ZThn24_N6E14x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x14y4 = {  "G14x14y4", // class name
  bases_G14x14y4, 6,
  &(vtc_G14x14y4[0]), // expected_vtbl_contents
  &(vtt_G14x14y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G14x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x14y4),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x14y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names436,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x14y5  : virtual E14x14 , F0 {
  int ff;
  ~G14x14y5(); // tgen
  G14x14y5(); // tgen
};
//SIG(1 G14x14y5) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G14x14y5 ::~G14x14y5(){ note_dtor("G14x14y5", this);} // tgen
G14x14y5 ::G14x14y5(){ note_ctor("G14x14y5", this);} // tgen

static void Test_G14x14y5()
{
  extern Class_Descriptor cd_G14x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x14y5, buf);
    G14x14y5 *dp, &lv = *(dp=new (buf) G14x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x14y5)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x14*), ABISELECT(32,24), "G14x14y5");
    check_base_class_offset(lv, (B1*)(C14*)(E14x14*), ABISELECT(40,28), "G14x14y5");
    check_base_class_offset(lv, (C14*)(E14x14*), ABISELECT(16,12), "G14x14y5");
    check_base_class_offset(lv, (D0*)(E14x14*), ABISELECT(52,36), "G14x14y5");
    check_base_class_offset(lv, (E14x14*), ABISELECT(16,12), "G14x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G14x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x14y5.ff");
    test_class_info(&lv, &cd_G14x14y5);
    dp->~G14x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x14y5(Test_G14x14y5, "G14x14y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G14x14y5C1Ev();
extern void _ZN8G14x14y5D1Ev();
Name_Map name_map_G14x14y5[] = {
  NSPAIR(_ZN8G14x14y5C1Ev),
  NSPAIR(_ZN8G14x14y5D1Ev),
  {0,0}
};
extern Class_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_E14x14;
extern VTBL_ENTRY _ZTI6E14x14[];
extern  VTBL_ENTRY _ZTV6E14x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x14y5[] = {
  // 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_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_E14x14,    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 _ZTI8G14x14y5[];
extern void _ZN6E14x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv)();
extern void ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn16_N6E14x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x14y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x14y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G14x14y5[0]),
  (VTBL_ENTRY)&_ZN6E14x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G14x14y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv),
};
extern VTBL_ENTRY _ZTV8G14x14y5[];
extern void _ZN6E14x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x14__8G14x14y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x14[0]),
  (VTBL_ENTRY)&_ZN6E14x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C146E14x14__8G14x14y5[] = {
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C146E14x14__8G14x14y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv)();
extern void ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn16_N6E14x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x14__8G14x14y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E14x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv),
};
static  VTT_ENTRY vtt_G14x14y5[] = {
  {&(_ZTV8G14x14y5[6]),  6,17},
  {&(_ZTV8G14x14y5[12]),  12,17},
  {&(_ZTV8G14x14y5[16]),  16,17},
  {&(_tg__ZTV6E14x14__8G14x14y5[5]),  5,6},
  {&(_tg__ZTV3C146E14x14__8G14x14y5[4]),  4,4},
  {&(_tg__ZTV2B1__3C146E14x14__8G14x14y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E14x14__8G14x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x14y5[];
extern  VTBL_ENTRY _ZTV8G14x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x14y5[];
static VTBL_ENTRY alt_thunk_names437[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn16_N6E14x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn16_N6E14x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x14y5 = {  "G14x14y5", // class name
  bases_G14x14y5, 6,
  &(vtc_G14x14y5[0]), // expected_vtbl_contents
  &(vtt_G14x14y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G14x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x14y5),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x14y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names437,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x14y6  : E14x14 , virtual F0 {
  int ff;
  ~G14x14y6(); // tgen
  G14x14y6(); // tgen
};
//SIG(1 G14x14y6) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G14x14y6 ::~G14x14y6(){ note_dtor("G14x14y6", this);} // tgen
G14x14y6 ::G14x14y6(){ note_ctor("G14x14y6", this);} // tgen

static void Test_G14x14y6()
{
  extern Class_Descriptor cd_G14x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G14x14y6, buf);
    G14x14y6 *dp, &lv = *(dp=new (buf) G14x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G14x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x14y6)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x14*), ABISELECT(20,16), "G14x14y6");
    check_base_class_offset(lv, (B1*)(C14*)(E14x14*), ABISELECT(24,20), "G14x14y6");
    check_base_class_offset(lv, (C14*)(E14x14*), 0, "G14x14y6");
    check_base_class_offset(lv, (D0*)(E14x14*), ABISELECT(36,28), "G14x14y6");
    check_base_class_offset(lv, (E14x14*), 0, "G14x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G14x14y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G14x14y6.ff");
    test_class_info(&lv, &cd_G14x14y6);
    dp->~G14x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x14y6(Test_G14x14y6, "G14x14y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G14x14y6C1Ev();
extern void _ZN8G14x14y6D1Ev();
Name_Map name_map_G14x14y6[] = {
  NSPAIR(_ZN8G14x14y6C1Ev),
  NSPAIR(_ZN8G14x14y6D1Ev),
  {0,0}
};
extern Class_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_E14x14;
extern VTBL_ENTRY _ZTI6E14x14[];
extern  VTBL_ENTRY _ZTV6E14x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x14y6[] = {
  // 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_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_E14x14,    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 _ZTI8G14x14y6[];
extern void _ZN6E14x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv)();
extern void ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn20_N6E14x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x14y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x14y6[0]),
  (VTBL_ENTRY)&_ZN6E14x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G14x14y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv),
};
extern VTBL_ENTRY _ZTV8G14x14y6[];
extern void _ZN6E14x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x14__8G14x14y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x14[0]),
  (VTBL_ENTRY)&_ZN6E14x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C146E14x14__8G14x14y6[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C146E14x14__8G14x14y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv)();
extern void ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn20_N6E14x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x14__8G14x14y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E14x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv),
};
static  VTT_ENTRY vtt_G14x14y6[] = {
  {&(_ZTV8G14x14y6[6]),  6,11},
  {&(_tg__ZTV6E14x14__8G14x14y6[5]),  5,6},
  {&(_tg__ZTV3C146E14x14__8G14x14y6[4]),  4,4},
  {&(_tg__ZTV2B1__3C146E14x14__8G14x14y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E14x14__8G14x14y6[3]),  3,4},
  {&(_ZTV8G14x14y6[10]),  10,11},
};
extern VTBL_ENTRY _ZTI8G14x14y6[];
extern  VTBL_ENTRY _ZTV8G14x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x14y6[];
static VTBL_ENTRY alt_thunk_names438[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn20_N6E14x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn20_N6E14x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x14y6 = {  "G14x14y6", // class name
  bases_G14x14y6, 6,
  &(vtc_G14x14y6[0]), // expected_vtbl_contents
  &(vtt_G14x14y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G14x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x14y6),11, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x14y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names438,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x14y7  : virtual E14x14 , virtual F0 {
  int ff;
  ~G14x14y7(); // tgen
  G14x14y7(); // tgen
};
//SIG(1 G14x14y7) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G14x14y7 ::~G14x14y7(){ note_dtor("G14x14y7", this);} // tgen
G14x14y7 ::G14x14y7(){ note_ctor("G14x14y7", this);} // tgen

static void Test_G14x14y7()
{
  extern Class_Descriptor cd_G14x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G14x14y7, buf);
    G14x14y7 *dp, &lv = *(dp=new (buf) G14x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G14x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x14y7)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x14*), ABISELECT(32,20), "G14x14y7");
    check_base_class_offset(lv, (B1*)(C14*)(E14x14*), ABISELECT(40,24), "G14x14y7");
    check_base_class_offset(lv, (C14*)(E14x14*), ABISELECT(16,8), "G14x14y7");
    check_base_class_offset(lv, (D0*)(E14x14*), ABISELECT(52,32), "G14x14y7");
    check_base_class_offset(lv, (E14x14*), ABISELECT(16,8), "G14x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G14x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G14x14y7.ff");
    test_class_info(&lv, &cd_G14x14y7);
    dp->~G14x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x14y7(Test_G14x14y7, "G14x14y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G14x14y7C1Ev();
extern void _ZN8G14x14y7D1Ev();
Name_Map name_map_G14x14y7[] = {
  NSPAIR(_ZN8G14x14y7C1Ev),
  NSPAIR(_ZN8G14x14y7D1Ev),
  {0,0}
};
extern Class_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_E14x14;
extern VTBL_ENTRY _ZTI6E14x14[];
extern  VTBL_ENTRY _ZTV6E14x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x14y7[] = {
  // 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_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_E14x14,    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 _ZTI8G14x14y7[];
extern void _ZN6E14x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv)();
extern void ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn16_N6E14x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x14y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x14y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G14x14y7[0]),
  (VTBL_ENTRY)&_ZN6E14x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G14x14y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv),
};
extern VTBL_ENTRY _ZTV8G14x14y7[];
extern void _ZN6E14x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x14__8G14x14y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x14[0]),
  (VTBL_ENTRY)&_ZN6E14x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C146E14x14__8G14x14y7[] = {
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C146E14x14__8G14x14y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv)();
extern void ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn16_N6E14x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x14__8G14x14y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E14x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv),
};
static  VTT_ENTRY vtt_G14x14y7[] = {
  {&(_ZTV8G14x14y7[7]),  7,18},
  {&(_ZTV8G14x14y7[13]),  13,18},
  {&(_ZTV8G14x14y7[17]),  17,18},
  {&(_tg__ZTV6E14x14__8G14x14y7[5]),  5,6},
  {&(_tg__ZTV3C146E14x14__8G14x14y7[4]),  4,4},
  {&(_tg__ZTV2B1__3C146E14x14__8G14x14y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E14x14__8G14x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x14y7[];
extern  VTBL_ENTRY _ZTV8G14x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x14y7[];
static VTBL_ENTRY alt_thunk_names439[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x143fooEv,_ZTv0_n12_N6E14x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn16_N6E14x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E14x143fooEv,_ZThn16_N6E14x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x14y7 = {  "G14x14y7", // class name
  bases_G14x14y7, 6,
  &(vtc_G14x14y7[0]), // expected_vtbl_contents
  &(vtt_G14x14y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G14x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x14y7),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x14y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names439,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E15x14  : C15 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E15x143fooEv
  ~E15x14(); // tgen
  E15x14(); // tgen
};
//SIG(-1 E15x14) C1{ BC2{ VBC3{ v1 Fi} VBC4{ v1 Fi} Fi} VBC5{ Fi} v1 Fi}


void  E15x14 ::foo(){vfunc_called(this, "_ZN6E15x143fooEv");}
E15x14 ::~E15x14(){ note_dtor("E15x14", this);} // tgen
E15x14 ::E15x14(){ note_ctor("E15x14", this);} // tgen

static void Test_E15x14()
{
  extern Class_Descriptor cd_E15x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E15x14, buf);
    E15x14 *dp, &lv = *(dp=new (buf) E15x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E15x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E15x14)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(16,12), "E15x14");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(32,20), "E15x14");
    check_base_class_offset(lv, (C15*), 0, "E15x14");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E15x14");
    check_field_offset(lv, fd, ABISELECT(12,8), "E15x14.fd");
    test_class_info(&lv, &cd_E15x14);
    dp->~E15x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE15x14(Test_E15x14, "E15x14", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E15x14C1Ev();
extern void _ZN6E15x14D1Ev();
Name_Map name_map_E15x14[] = {
  NSPAIR(_ZN6E15x14C1Ev),
  NSPAIR(_ZN6E15x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x14[] = {
  // 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_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 _ZTI6E15x14[];
extern void _ZN6E15x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn16_N6E15x143fooEv,_ZThn12_N6E15x143fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn20_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E15x14[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&_ZN6E15x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
extern VTBL_ENTRY _ZTV6E15x14[];
static  VTBL_ENTRY _tg__ZTV3C15__6E15x14[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__6E15x14[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__6E15x14[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E15x14[] = {
  {&(_ZTV6E15x14[5]),  5,14},
  {&(_tg__ZTV3C15__6E15x14[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__6E15x14[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__6E15x14[3]),  3,4},
  {&(_ZTV6E15x14[9]),  9,14},
  {&(_ZTV6E15x14[13]),  13,14},
};
extern VTBL_ENTRY _ZTI6E15x14[];
extern  VTBL_ENTRY _ZTV6E15x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x14[];
static VTBL_ENTRY alt_thunk_names440[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn20_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E15x143fooEv,_ZThn12_N6E15x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E15x14 = {  "E15x14", // class name
  bases_E15x14, 4,
  &(vtc_E15x14[0]), // expected_vtbl_contents
  &(vtt_E15x14[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E15x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E15x14),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E15x14),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names440,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x14y0  : E15x14 , F1 {
  int ff;
  ~G15x14y0(); // tgen
  G15x14y0(); // tgen
};
//SIG(1 G15x14y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G15x14y0 ::~G15x14y0(){ note_dtor("G15x14y0", this);} // tgen
G15x14y0 ::G15x14y0(){ note_ctor("G15x14y0", this);} // tgen

static void Test_G15x14y0()
{
  extern Class_Descriptor cd_G15x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G15x14y0, buf);
    G15x14y0 *dp, &lv = *(dp=new (buf) G15x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G15x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x14y0)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x14*), ABISELECT(32,24), "G15x14y0");
    check_base_class_offset(lv, (B1*)(C15*)(E15x14*), ABISELECT(48,32), "G15x14y0");
    check_base_class_offset(lv, (C15*)(E15x14*), 0, "G15x14y0");
    check_base_class_offset(lv, (D0*)(E15x14*), ABISELECT(60,40), "G15x14y0");
    check_base_class_offset(lv, (E15x14*), 0, "G15x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G15x14y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G15x14y0.ff");
    test_class_info(&lv, &cd_G15x14y0);
    dp->~G15x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x14y0(Test_G15x14y0, "G15x14y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G15x14y0C1Ev();
extern void _ZN8G15x14y0D1Ev();
Name_Map name_map_G15x14y0[] = {
  NSPAIR(_ZN8G15x14y0C1Ev),
  NSPAIR(_ZN8G15x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x14;
extern VTBL_ENTRY _ZTI6E15x14[];
extern  VTBL_ENTRY _ZTV6E15x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x14y0[] = {
  // 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_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_E15x14,    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 _ZTI8G15x14y0[];
extern void _ZN6E15x143fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn24_N6E15x143fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn48_N6E15x143fooEv,_ZThn32_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x14y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x14y0[0]),
  (VTBL_ENTRY)&_ZN6E15x143fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G15x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G15x14y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G15x14y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
extern VTBL_ENTRY _ZTV8G15x14y0[];
extern void _ZN6E15x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x14__8G15x14y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&_ZN6E15x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C156E15x14__8G15x14y0[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C156E15x14__8G15x14y0[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C156E15x14__8G15x14y0[] = {
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn24_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x14__8G15x14y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn48_N6E15x143fooEv,_ZThn32_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x14__8G15x14y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
static  VTT_ENTRY vtt_G15x14y0[] = {
  {&(_ZTV8G15x14y0[5]),  5,17},
  {&(_tg__ZTV6E15x14__8G15x14y0[5]),  5,6},
  {&(_tg__ZTV3C156E15x14__8G15x14y0[4]),  4,4},
  {&(_tg__ZTV2A1__3C156E15x14__8G15x14y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C156E15x14__8G15x14y0[3]),  3,4},
  {&(_tg__ZTV2A1__6E15x14__8G15x14y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x14__8G15x14y0[3]),  3,4},
  {&(_ZTV8G15x14y0[12]),  12,17},
  {&(_ZTV8G15x14y0[16]),  16,17},
};
extern VTBL_ENTRY _ZTI8G15x14y0[];
extern  VTBL_ENTRY _ZTV8G15x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x14y0[];
static VTBL_ENTRY alt_thunk_names441[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x143fooEv,_ZThn32_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn24_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x143fooEv,_ZThn32_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn24_N6E15x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x14y0 = {  "G15x14y0", // class name
  bases_G15x14y0, 6,
  &(vtc_G15x14y0[0]), // expected_vtbl_contents
  &(vtt_G15x14y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G15x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x14y0),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x14y0),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names441,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x14y1  : virtual E15x14 , F1 {
  int ff;
  ~G15x14y1(); // tgen
  G15x14y1(); // tgen
};
//SIG(1 G15x14y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G15x14y1 ::~G15x14y1(){ note_dtor("G15x14y1", this);} // tgen
G15x14y1 ::G15x14y1(){ note_ctor("G15x14y1", this);} // tgen

static void Test_G15x14y1()
{
  extern Class_Descriptor cd_G15x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G15x14y1, buf);
    G15x14y1 *dp, &lv = *(dp=new (buf) G15x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G15x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x14y1)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x14*), ABISELECT(32,24), "G15x14y1");
    check_base_class_offset(lv, (B1*)(C15*)(E15x14*), ABISELECT(48,32), "G15x14y1");
    check_base_class_offset(lv, (C15*)(E15x14*), ABISELECT(16,12), "G15x14y1");
    check_base_class_offset(lv, (D0*)(E15x14*), ABISELECT(60,40), "G15x14y1");
    check_base_class_offset(lv, (E15x14*), ABISELECT(16,12), "G15x14y1");
    check_base_class_offset(lv, (F1*), 0, "G15x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x14y1.ff");
    test_class_info(&lv, &cd_G15x14y1);
    dp->~G15x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x14y1(Test_G15x14y1, "G15x14y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G15x14y1C1Ev();
extern void _ZN8G15x14y1D1Ev();
Name_Map name_map_G15x14y1[] = {
  NSPAIR(_ZN8G15x14y1C1Ev),
  NSPAIR(_ZN8G15x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x14;
extern VTBL_ENTRY _ZTI6E15x14[];
extern  VTBL_ENTRY _ZTV6E15x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x14y1[] = {
  // 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_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_E15x14,    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 _ZTI8G15x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E15x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn16_N6E15x143fooEv,_ZThn12_N6E15x143fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn20_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x14y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G15x14y1[0]),
  (VTBL_ENTRY)&_ZN6E15x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G15x14y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G15x14y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
extern VTBL_ENTRY _ZTV8G15x14y1[];
extern void _ZN6E15x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x14__8G15x14y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&_ZN6E15x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C156E15x14__8G15x14y1[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C156E15x14__8G15x14y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C156E15x14__8G15x14y1[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn16_N6E15x143fooEv,_ZThn12_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x14__8G15x14y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn20_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x14__8G15x14y1[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
static  VTT_ENTRY vtt_G15x14y1[] = {
  {&(_ZTV8G15x14y1[6]),  6,22},
  {&(_ZTV8G15x14y1[13]),  13,22},
  {&(_ZTV8G15x14y1[17]),  17,22},
  {&(_ZTV8G15x14y1[21]),  21,22},
  {&(_tg__ZTV6E15x14__8G15x14y1[5]),  5,6},
  {&(_tg__ZTV3C156E15x14__8G15x14y1[4]),  4,4},
  {&(_tg__ZTV2A1__3C156E15x14__8G15x14y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C156E15x14__8G15x14y1[3]),  3,4},
  {&(_tg__ZTV2A1__6E15x14__8G15x14y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x14__8G15x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x14y1[];
extern  VTBL_ENTRY _ZTV8G15x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x14y1[];
static VTBL_ENTRY alt_thunk_names442[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn20_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E15x143fooEv,_ZThn12_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn20_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E15x143fooEv,_ZThn12_N6E15x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x14y1 = {  "G15x14y1", // class name
  bases_G15x14y1, 6,
  &(vtc_G15x14y1[0]), // expected_vtbl_contents
  &(vtt_G15x14y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G15x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x14y1),22, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x14y1),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names442,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x14y2  : E15x14 , virtual F1 {
  int ff;
  ~G15x14y2(); // tgen
  G15x14y2(); // tgen
};
//SIG(1 G15x14y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G15x14y2 ::~G15x14y2(){ note_dtor("G15x14y2", this);} // tgen
G15x14y2 ::G15x14y2(){ note_ctor("G15x14y2", this);} // tgen

static void Test_G15x14y2()
{
  extern Class_Descriptor cd_G15x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x14y2, buf);
    G15x14y2 *dp, &lv = *(dp=new (buf) G15x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x14y2)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x14*), ABISELECT(24,16), "G15x14y2");
    check_base_class_offset(lv, (B1*)(C15*)(E15x14*), ABISELECT(40,24), "G15x14y2");
    check_base_class_offset(lv, (C15*)(E15x14*), 0, "G15x14y2");
    check_base_class_offset(lv, (D0*)(E15x14*), ABISELECT(52,32), "G15x14y2");
    check_base_class_offset(lv, (E15x14*), 0, "G15x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G15x14y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G15x14y2.ff");
    test_class_info(&lv, &cd_G15x14y2);
    dp->~G15x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x14y2(Test_G15x14y2, "G15x14y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G15x14y2C1Ev();
extern void _ZN8G15x14y2D1Ev();
Name_Map name_map_G15x14y2[] = {
  NSPAIR(_ZN8G15x14y2C1Ev),
  NSPAIR(_ZN8G15x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x14;
extern VTBL_ENTRY _ZTI6E15x14[];
extern  VTBL_ENTRY _ZTV6E15x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x14y2[] = {
  // 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_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_E15x14,    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 _ZTI8G15x14y2[];
extern void _ZN6E15x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn24_N6E15x143fooEv,_ZThn16_N6E15x143fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn40_N6E15x143fooEv,_ZThn24_N6E15x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G15x14y2[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x14y2[0]),
  (VTBL_ENTRY)&_ZN6E15x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G15x14y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G15x14y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G15x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G15x14y2[];
extern void _ZN6E15x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x14__8G15x14y2[] = {
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&_ZN6E15x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C156E15x14__8G15x14y2[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C156E15x14__8G15x14y2[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C156E15x14__8G15x14y2[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn24_N6E15x143fooEv,_ZThn16_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x14__8G15x14y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn40_N6E15x143fooEv,_ZThn24_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x14__8G15x14y2[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
static  VTT_ENTRY vtt_G15x14y2[] = {
  {&(_ZTV8G15x14y2[6]),  6,19},
  {&(_tg__ZTV6E15x14__8G15x14y2[5]),  5,6},
  {&(_tg__ZTV3C156E15x14__8G15x14y2[4]),  4,4},
  {&(_tg__ZTV2A1__3C156E15x14__8G15x14y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C156E15x14__8G15x14y2[3]),  3,4},
  {&(_tg__ZTV2A1__6E15x14__8G15x14y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x14__8G15x14y2[3]),  3,4},
  {&(_ZTV8G15x14y2[10]),  10,19},
  {&(_ZTV8G15x14y2[14]),  14,19},
  {&(_ZTV8G15x14y2[18]),  18,19},
};
extern VTBL_ENTRY _ZTI8G15x14y2[];
extern  VTBL_ENTRY _ZTV8G15x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x14y2[];
static VTBL_ENTRY alt_thunk_names443[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x143fooEv,_ZThn24_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E15x143fooEv,_ZThn16_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x143fooEv,_ZThn24_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E15x143fooEv,_ZThn16_N6E15x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x14y2 = {  "G15x14y2", // class name
  bases_G15x14y2, 6,
  &(vtc_G15x14y2[0]), // expected_vtbl_contents
  &(vtt_G15x14y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G15x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x14y2),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x14y2),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names443,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x14y3  : virtual E15x14 , virtual F1 {
  int ff;
  ~G15x14y3(); // tgen
  G15x14y3(); // tgen
};
//SIG(1 G15x14y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G15x14y3 ::~G15x14y3(){ note_dtor("G15x14y3", this);} // tgen
G15x14y3 ::G15x14y3(){ note_ctor("G15x14y3", this);} // tgen

static void Test_G15x14y3()
{
  extern Class_Descriptor cd_G15x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G15x14y3, buf);
    G15x14y3 *dp, &lv = *(dp=new (buf) G15x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G15x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x14y3)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x14*), ABISELECT(32,20), "G15x14y3");
    check_base_class_offset(lv, (B1*)(C15*)(E15x14*), ABISELECT(48,28), "G15x14y3");
    check_base_class_offset(lv, (C15*)(E15x14*), ABISELECT(16,8), "G15x14y3");
    check_base_class_offset(lv, (D0*)(E15x14*), ABISELECT(60,36), "G15x14y3");
    check_base_class_offset(lv, (E15x14*), ABISELECT(16,8), "G15x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G15x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G15x14y3.ff");
    test_class_info(&lv, &cd_G15x14y3);
    dp->~G15x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x14y3(Test_G15x14y3, "G15x14y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G15x14y3C1Ev();
extern void _ZN8G15x14y3D1Ev();
Name_Map name_map_G15x14y3[] = {
  NSPAIR(_ZN8G15x14y3C1Ev),
  NSPAIR(_ZN8G15x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x14;
extern VTBL_ENTRY _ZTI6E15x14[];
extern  VTBL_ENTRY _ZTV6E15x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x14y3[] = {
  // 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_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_E15x14,    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 _ZTI8G15x14y3[];
extern void _ZN6E15x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn16_N6E15x143fooEv,_ZThn12_N6E15x143fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn20_N6E15x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G15x14y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x14y3[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G15x14y3[0]),
  (VTBL_ENTRY)&_ZN6E15x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G15x14y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G15x14y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G15x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G15x14y3[];
extern void _ZN6E15x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x14__8G15x14y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&_ZN6E15x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C156E15x14__8G15x14y3[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C156E15x14__8G15x14y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C156E15x14__8G15x14y3[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn16_N6E15x143fooEv,_ZThn12_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x14__8G15x14y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn20_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x14__8G15x14y3[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
static  VTT_ENTRY vtt_G15x14y3[] = {
  {&(_ZTV8G15x14y3[7]),  7,26},
  {&(_ZTV8G15x14y3[13]),  13,26},
  {&(_ZTV8G15x14y3[17]),  17,26},
  {&(_ZTV8G15x14y3[21]),  21,26},
  {&(_ZTV8G15x14y3[25]),  25,26},
  {&(_tg__ZTV6E15x14__8G15x14y3[5]),  5,6},
  {&(_tg__ZTV3C156E15x14__8G15x14y3[4]),  4,4},
  {&(_tg__ZTV2A1__3C156E15x14__8G15x14y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C156E15x14__8G15x14y3[3]),  3,4},
  {&(_tg__ZTV2A1__6E15x14__8G15x14y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x14__8G15x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x14y3[];
extern  VTBL_ENTRY _ZTV8G15x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x14y3[];
static VTBL_ENTRY alt_thunk_names444[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn20_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E15x143fooEv,_ZThn12_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn20_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E15x143fooEv,_ZThn12_N6E15x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x14y3 = {  "G15x14y3", // class name
  bases_G15x14y3, 6,
  &(vtc_G15x14y3[0]), // expected_vtbl_contents
  &(vtt_G15x14y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G15x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x14y3),26, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x14y3),11, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names444,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x14y4  : E15x14 , F0 {
  int ff;
  ~G15x14y4(); // tgen
  G15x14y4(); // tgen
};
//SIG(1 G15x14y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G15x14y4 ::~G15x14y4(){ note_dtor("G15x14y4", this);} // tgen
G15x14y4 ::G15x14y4(){ note_ctor("G15x14y4", this);} // tgen

static void Test_G15x14y4()
{
  extern Class_Descriptor cd_G15x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G15x14y4, buf);
    G15x14y4 *dp, &lv = *(dp=new (buf) G15x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G15x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x14y4)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x14*), ABISELECT(24,20), "G15x14y4");
    check_base_class_offset(lv, (B1*)(C15*)(E15x14*), ABISELECT(40,28), "G15x14y4");
    check_base_class_offset(lv, (C15*)(E15x14*), 0, "G15x14y4");
    check_base_class_offset(lv, (D0*)(E15x14*), ABISELECT(52,36), "G15x14y4");
    check_base_class_offset(lv, (E15x14*), 0, "G15x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G15x14y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G15x14y4.ff");
    test_class_info(&lv, &cd_G15x14y4);
    dp->~G15x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x14y4(Test_G15x14y4, "G15x14y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G15x14y4C1Ev();
extern void _ZN8G15x14y4D1Ev();
Name_Map name_map_G15x14y4[] = {
  NSPAIR(_ZN8G15x14y4C1Ev),
  NSPAIR(_ZN8G15x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x14;
extern VTBL_ENTRY _ZTI6E15x14[];
extern  VTBL_ENTRY _ZTV6E15x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x14y4[] = {
  // 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_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_E15x14,    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 _ZTI8G15x14y4[];
extern void _ZN6E15x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn24_N6E15x143fooEv,_ZThn20_N6E15x143fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn40_N6E15x143fooEv,_ZThn28_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x14y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x14y4[0]),
  (VTBL_ENTRY)&_ZN6E15x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G15x14y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G15x14y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
extern VTBL_ENTRY _ZTV8G15x14y4[];
extern void _ZN6E15x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x14__8G15x14y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&_ZN6E15x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C156E15x14__8G15x14y4[] = {
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C156E15x14__8G15x14y4[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C156E15x14__8G15x14y4[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn24_N6E15x143fooEv,_ZThn20_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x14__8G15x14y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn40_N6E15x143fooEv,_ZThn28_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x14__8G15x14y4[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
static  VTT_ENTRY vtt_G15x14y4[] = {
  {&(_ZTV8G15x14y4[5]),  5,14},
  {&(_tg__ZTV6E15x14__8G15x14y4[5]),  5,6},
  {&(_tg__ZTV3C156E15x14__8G15x14y4[4]),  4,4},
  {&(_tg__ZTV2A1__3C156E15x14__8G15x14y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C156E15x14__8G15x14y4[3]),  3,4},
  {&(_tg__ZTV2A1__6E15x14__8G15x14y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x14__8G15x14y4[3]),  3,4},
  {&(_ZTV8G15x14y4[9]),  9,14},
  {&(_ZTV8G15x14y4[13]),  13,14},
};
extern VTBL_ENTRY _ZTI8G15x14y4[];
extern  VTBL_ENTRY _ZTV8G15x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x14y4[];
static VTBL_ENTRY alt_thunk_names445[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x143fooEv,_ZThn28_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E15x143fooEv,_ZThn20_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x143fooEv,_ZThn28_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E15x143fooEv,_ZThn20_N6E15x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x14y4 = {  "G15x14y4", // class name
  bases_G15x14y4, 6,
  &(vtc_G15x14y4[0]), // expected_vtbl_contents
  &(vtt_G15x14y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G15x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x14y4),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x14y4),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names445,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x14y5  : virtual E15x14 , F0 {
  int ff;
  ~G15x14y5(); // tgen
  G15x14y5(); // tgen
};
//SIG(1 G15x14y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G15x14y5 ::~G15x14y5(){ note_dtor("G15x14y5", this);} // tgen
G15x14y5 ::G15x14y5(){ note_ctor("G15x14y5", this);} // tgen

static void Test_G15x14y5()
{
  extern Class_Descriptor cd_G15x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G15x14y5, buf);
    G15x14y5 *dp, &lv = *(dp=new (buf) G15x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G15x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x14y5)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x14*), ABISELECT(32,24), "G15x14y5");
    check_base_class_offset(lv, (B1*)(C15*)(E15x14*), ABISELECT(48,32), "G15x14y5");
    check_base_class_offset(lv, (C15*)(E15x14*), ABISELECT(16,12), "G15x14y5");
    check_base_class_offset(lv, (D0*)(E15x14*), ABISELECT(60,40), "G15x14y5");
    check_base_class_offset(lv, (E15x14*), ABISELECT(16,12), "G15x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G15x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x14y5.ff");
    test_class_info(&lv, &cd_G15x14y5);
    dp->~G15x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x14y5(Test_G15x14y5, "G15x14y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G15x14y5C1Ev();
extern void _ZN8G15x14y5D1Ev();
Name_Map name_map_G15x14y5[] = {
  NSPAIR(_ZN8G15x14y5C1Ev),
  NSPAIR(_ZN8G15x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x14;
extern VTBL_ENTRY _ZTI6E15x14[];
extern  VTBL_ENTRY _ZTV6E15x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x14y5[] = {
  // 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_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_E15x14,    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 _ZTI8G15x14y5[];
extern void _ZN6E15x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn16_N6E15x143fooEv,_ZThn12_N6E15x143fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn20_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x14y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x14y5[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G15x14y5[0]),
  (VTBL_ENTRY)&_ZN6E15x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G15x14y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G15x14y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
extern VTBL_ENTRY _ZTV8G15x14y5[];
extern void _ZN6E15x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x14__8G15x14y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&_ZN6E15x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C156E15x14__8G15x14y5[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C156E15x14__8G15x14y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C156E15x14__8G15x14y5[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn16_N6E15x143fooEv,_ZThn12_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x14__8G15x14y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn20_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x14__8G15x14y5[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
static  VTT_ENTRY vtt_G15x14y5[] = {
  {&(_ZTV8G15x14y5[6]),  6,21},
  {&(_ZTV8G15x14y5[12]),  12,21},
  {&(_ZTV8G15x14y5[16]),  16,21},
  {&(_ZTV8G15x14y5[20]),  20,21},
  {&(_tg__ZTV6E15x14__8G15x14y5[5]),  5,6},
  {&(_tg__ZTV3C156E15x14__8G15x14y5[4]),  4,4},
  {&(_tg__ZTV2A1__3C156E15x14__8G15x14y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C156E15x14__8G15x14y5[3]),  3,4},
  {&(_tg__ZTV2A1__6E15x14__8G15x14y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x14__8G15x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x14y5[];
extern  VTBL_ENTRY _ZTV8G15x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x14y5[];
static VTBL_ENTRY alt_thunk_names446[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn20_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E15x143fooEv,_ZThn12_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn20_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E15x143fooEv,_ZThn12_N6E15x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x14y5 = {  "G15x14y5", // class name
  bases_G15x14y5, 6,
  &(vtc_G15x14y5[0]), // expected_vtbl_contents
  &(vtt_G15x14y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G15x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x14y5),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x14y5),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names446,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x14y6  : E15x14 , virtual F0 {
  int ff;
  ~G15x14y6(); // tgen
  G15x14y6(); // tgen
};
//SIG(1 G15x14y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G15x14y6 ::~G15x14y6(){ note_dtor("G15x14y6", this);} // tgen
G15x14y6 ::G15x14y6(){ note_ctor("G15x14y6", this);} // tgen

static void Test_G15x14y6()
{
  extern Class_Descriptor cd_G15x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G15x14y6, buf);
    G15x14y6 *dp, &lv = *(dp=new (buf) G15x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G15x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x14y6)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x14*), ABISELECT(24,16), "G15x14y6");
    check_base_class_offset(lv, (B1*)(C15*)(E15x14*), ABISELECT(40,24), "G15x14y6");
    check_base_class_offset(lv, (C15*)(E15x14*), 0, "G15x14y6");
    check_base_class_offset(lv, (D0*)(E15x14*), ABISELECT(52,32), "G15x14y6");
    check_base_class_offset(lv, (E15x14*), 0, "G15x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G15x14y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G15x14y6.ff");
    test_class_info(&lv, &cd_G15x14y6);
    dp->~G15x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x14y6(Test_G15x14y6, "G15x14y6", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G15x14y6C1Ev();
extern void _ZN8G15x14y6D1Ev();
Name_Map name_map_G15x14y6[] = {
  NSPAIR(_ZN8G15x14y6C1Ev),
  NSPAIR(_ZN8G15x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x14;
extern VTBL_ENTRY _ZTI6E15x14[];
extern  VTBL_ENTRY _ZTV6E15x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x14y6[] = {
  // 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_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_E15x14,    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 _ZTI8G15x14y6[];
extern void _ZN6E15x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn24_N6E15x143fooEv,_ZThn16_N6E15x143fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn40_N6E15x143fooEv,_ZThn24_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x14y6[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x14y6[0]),
  (VTBL_ENTRY)&_ZN6E15x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G15x14y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G15x14y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
extern VTBL_ENTRY _ZTV8G15x14y6[];
extern void _ZN6E15x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x14__8G15x14y6[] = {
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&_ZN6E15x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C156E15x14__8G15x14y6[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C156E15x14__8G15x14y6[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C156E15x14__8G15x14y6[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn24_N6E15x143fooEv,_ZThn16_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x14__8G15x14y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn40_N6E15x143fooEv,_ZThn24_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x14__8G15x14y6[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
static  VTT_ENTRY vtt_G15x14y6[] = {
  {&(_ZTV8G15x14y6[6]),  6,15},
  {&(_tg__ZTV6E15x14__8G15x14y6[5]),  5,6},
  {&(_tg__ZTV3C156E15x14__8G15x14y6[4]),  4,4},
  {&(_tg__ZTV2A1__3C156E15x14__8G15x14y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C156E15x14__8G15x14y6[3]),  3,4},
  {&(_tg__ZTV2A1__6E15x14__8G15x14y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x14__8G15x14y6[3]),  3,4},
  {&(_ZTV8G15x14y6[10]),  10,15},
  {&(_ZTV8G15x14y6[14]),  14,15},
};
extern VTBL_ENTRY _ZTI8G15x14y6[];
extern  VTBL_ENTRY _ZTV8G15x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x14y6[];
static VTBL_ENTRY alt_thunk_names447[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x143fooEv,_ZThn24_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E15x143fooEv,_ZThn16_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x143fooEv,_ZThn24_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E15x143fooEv,_ZThn16_N6E15x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x14y6 = {  "G15x14y6", // class name
  bases_G15x14y6, 6,
  &(vtc_G15x14y6[0]), // expected_vtbl_contents
  &(vtt_G15x14y6[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G15x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x14y6),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x14y6),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names447,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x14y7  : virtual E15x14 , virtual F0 {
  int ff;
  ~G15x14y7(); // tgen
  G15x14y7(); // tgen
};
//SIG(1 G15x14y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G15x14y7 ::~G15x14y7(){ note_dtor("G15x14y7", this);} // tgen
G15x14y7 ::G15x14y7(){ note_ctor("G15x14y7", this);} // tgen

static void Test_G15x14y7()
{
  extern Class_Descriptor cd_G15x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x14y7, buf);
    G15x14y7 *dp, &lv = *(dp=new (buf) G15x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x14y7)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x14*), ABISELECT(32,20), "G15x14y7");
    check_base_class_offset(lv, (B1*)(C15*)(E15x14*), ABISELECT(48,28), "G15x14y7");
    check_base_class_offset(lv, (C15*)(E15x14*), ABISELECT(16,8), "G15x14y7");
    check_base_class_offset(lv, (D0*)(E15x14*), ABISELECT(60,36), "G15x14y7");
    check_base_class_offset(lv, (E15x14*), ABISELECT(16,8), "G15x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G15x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G15x14y7.ff");
    test_class_info(&lv, &cd_G15x14y7);
    dp->~G15x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x14y7(Test_G15x14y7, "G15x14y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G15x14y7C1Ev();
extern void _ZN8G15x14y7D1Ev();
Name_Map name_map_G15x14y7[] = {
  NSPAIR(_ZN8G15x14y7C1Ev),
  NSPAIR(_ZN8G15x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x14;
extern VTBL_ENTRY _ZTI6E15x14[];
extern  VTBL_ENTRY _ZTV6E15x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x14y7[] = {
  // 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_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_E15x14,    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 _ZTI8G15x14y7[];
extern void _ZN6E15x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn16_N6E15x143fooEv,_ZThn12_N6E15x143fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn20_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x14y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x14y7[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G15x14y7[0]),
  (VTBL_ENTRY)&_ZN6E15x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G15x14y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G15x14y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
extern VTBL_ENTRY _ZTV8G15x14y7[];
extern void _ZN6E15x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x14__8G15x14y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&_ZN6E15x143fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C156E15x14__8G15x14y7[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C156E15x14__8G15x14y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C156E15x14__8G15x14y7[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn16_N6E15x143fooEv,_ZThn12_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x14__8G15x14y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv)();
extern void ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn20_N6E15x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x14__8G15x14y7[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E15x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv),
};
static  VTT_ENTRY vtt_G15x14y7[] = {
  {&(_ZTV8G15x14y7[7]),  7,22},
  {&(_ZTV8G15x14y7[13]),  13,22},
  {&(_ZTV8G15x14y7[17]),  17,22},
  {&(_ZTV8G15x14y7[21]),  21,22},
  {&(_tg__ZTV6E15x14__8G15x14y7[5]),  5,6},
  {&(_tg__ZTV3C156E15x14__8G15x14y7[4]),  4,4},
  {&(_tg__ZTV2A1__3C156E15x14__8G15x14y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C156E15x14__8G15x14y7[3]),  3,4},
  {&(_tg__ZTV2A1__6E15x14__8G15x14y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x14__8G15x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x14y7[];
extern  VTBL_ENTRY _ZTV8G15x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x14y7[];
static VTBL_ENTRY alt_thunk_names448[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x143fooEv,_ZTv0_n12_N6E15x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn20_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E15x143fooEv,_ZThn12_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x143fooEv,_ZThn20_N6E15x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E15x143fooEv,_ZThn12_N6E15x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x14y7 = {  "G15x14y7", // class name
  bases_G15x14y7, 6,
  &(vtc_G15x14y7[0]), // expected_vtbl_contents
  &(vtt_G15x14y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G15x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x14y7),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x14y7),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names448,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E16x14  : C16 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E16x143fooEv
  ~E16x14(); // tgen
  E16x14(); // tgen
};
//SIG(-1 E16x14) C1{ BC2{ BC3{ Fi} BC4{ Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E16x14 ::foo(){vfunc_called(this, "_ZN6E16x143fooEv");}
E16x14 ::~E16x14(){ note_dtor("E16x14", this);} // tgen
E16x14 ::E16x14(){ note_ctor("E16x14", this);} // tgen

static void Test_E16x14()
{
  extern Class_Descriptor cd_E16x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E16x14, buf);
    E16x14 *dp, &lv = *(dp=new (buf) E16x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E16x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E16x14)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(8,4), "E16x14");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(12,8), "E16x14");
    check_base_class_offset(lv, (C16*), 0, "E16x14");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E16x14");
    check_field_offset(lv, fd, ABISELECT(20,16), "E16x14.fd");
    test_class_info(&lv, &cd_E16x14);
    dp->~E16x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE16x14(Test_E16x14, "E16x14", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6E16x14C1Ev();
extern void _ZN6E16x14D1Ev();
Name_Map name_map_E16x14[] = {
  NSPAIR(_ZN6E16x14C1Ev),
  NSPAIR(_ZN6E16x14D1Ev),
  {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_E16x14[] = {
  // 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 _ZTI6E16x14[];
extern void _ZN6E16x143fooEv();
static  VTBL_ENTRY vtc_E16x14[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x14[0]),
  (VTBL_ENTRY)&_ZN6E16x143fooEv,
};
extern VTBL_ENTRY _ZTV6E16x14[];
static  VTT_ENTRY vtt_E16x14[] = {
  {&(_ZTV6E16x14[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E16x14[];
extern  VTBL_ENTRY _ZTV6E16x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x14[];
Class_Descriptor cd_E16x14 = {  "E16x14", // class name
  bases_E16x14, 4,
  &(vtc_E16x14[0]), // expected_vtbl_contents
  &(vtt_E16x14[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6E16x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E16x14),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E16x14),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  G16x14y0  : E16x14 , F1 {
  int ff;
  ~G16x14y0(); // tgen
  G16x14y0(); // tgen
};
//SIG(1 G16x14y0) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G16x14y0 ::~G16x14y0(){ note_dtor("G16x14y0", this);} // tgen
G16x14y0 ::G16x14y0(){ note_ctor("G16x14y0", this);} // tgen

static void Test_G16x14y0()
{
  extern Class_Descriptor cd_G16x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x14y0, buf);
    G16x14y0 *dp, &lv = *(dp=new (buf) G16x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x14y0)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x14*), ABISELECT(8,4), "G16x14y0");
    check_base_class_offset(lv, (B0*)(C16*)(E16x14*), ABISELECT(12,8), "G16x14y0");
    check_base_class_offset(lv, (C16*)(E16x14*), 0, "G16x14y0");
    check_base_class_offset(lv, (D0*)(E16x14*), ABISELECT(40,32), "G16x14y0");
    check_base_class_offset(lv, (E16x14*), 0, "G16x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G16x14y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G16x14y0.ff");
    test_class_info(&lv, &cd_G16x14y0);
    dp->~G16x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x14y0(Test_G16x14y0, "G16x14y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G16x14y0C1Ev();
extern void _ZN8G16x14y0D1Ev();
Name_Map name_map_G16x14y0[] = {
  NSPAIR(_ZN8G16x14y0C1Ev),
  NSPAIR(_ZN8G16x14y0D1Ev),
  {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_E16x14;
extern VTBL_ENTRY _ZTI6E16x14[];
extern  VTBL_ENTRY _ZTV6E16x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x14y0[] = {
  // 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_E16x14,    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 _ZTI8G16x14y0[];
extern void _ZN6E16x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x14y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x14y0[0]),
  (VTBL_ENTRY)&_ZN6E16x143fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G16x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G16x14y0[];
extern void _ZN6E16x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x14__8G16x14y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x14[0]),
  (VTBL_ENTRY)&_ZN6E16x143fooEv,
};
static  VTT_ENTRY vtt_G16x14y0[] = {
  {&(_ZTV8G16x14y0[3]),  3,7},
  {&(_tg__ZTV6E16x14__8G16x14y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G16x14y0[];
extern  VTBL_ENTRY _ZTV8G16x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x14y0[];
Class_Descriptor cd_G16x14y0 = {  "G16x14y0", // class name
  bases_G16x14y0, 6,
  &(vtc_G16x14y0[0]), // expected_vtbl_contents
  &(vtt_G16x14y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G16x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x14y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x14y0),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  G16x14y1  : virtual E16x14 , F1 {
  int ff;
  ~G16x14y1(); // tgen
  G16x14y1(); // tgen
};
//SIG(1 G16x14y1) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G16x14y1 ::~G16x14y1(){ note_dtor("G16x14y1", this);} // tgen
G16x14y1 ::G16x14y1(){ note_ctor("G16x14y1", this);} // tgen

static void Test_G16x14y1()
{
  extern Class_Descriptor cd_G16x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x14y1, buf);
    G16x14y1 *dp, &lv = *(dp=new (buf) G16x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x14y1)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x14*), ABISELECT(24,16), "G16x14y1");
    check_base_class_offset(lv, (B0*)(C16*)(E16x14*), ABISELECT(28,20), "G16x14y1");
    check_base_class_offset(lv, (C16*)(E16x14*), ABISELECT(16,12), "G16x14y1");
    check_base_class_offset(lv, (D0*)(E16x14*), ABISELECT(40,32), "G16x14y1");
    check_base_class_offset(lv, (E16x14*), ABISELECT(16,12), "G16x14y1");
    check_base_class_offset(lv, (F1*), 0, "G16x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x14y1.ff");
    test_class_info(&lv, &cd_G16x14y1);
    dp->~G16x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x14y1(Test_G16x14y1, "G16x14y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G16x14y1C1Ev();
extern void _ZN8G16x14y1D1Ev();
Name_Map name_map_G16x14y1[] = {
  NSPAIR(_ZN8G16x14y1C1Ev),
  NSPAIR(_ZN8G16x14y1D1Ev),
  {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_E16x14;
extern VTBL_ENTRY _ZTI6E16x14[];
extern  VTBL_ENTRY _ZTV6E16x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x14y1[] = {
  // 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_E16x14,    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 _ZTI8G16x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E16x143fooEv();
static  VTBL_ENTRY vtc_G16x14y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G16x14y1[0]),
  (VTBL_ENTRY)&_ZN6E16x143fooEv,
};
extern VTBL_ENTRY _ZTV8G16x14y1[];
extern void _ZN6E16x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x14__8G16x14y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x14[0]),
  (VTBL_ENTRY)&_ZN6E16x143fooEv,
};
static  VTT_ENTRY vtt_G16x14y1[] = {
  {&(_ZTV8G16x14y1[4]),  4,10},
  {&(_ZTV8G16x14y1[9]),  9,10},
  {&(_tg__ZTV6E16x14__8G16x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G16x14y1[];
extern  VTBL_ENTRY _ZTV8G16x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x14y1[];
Class_Descriptor cd_G16x14y1 = {  "G16x14y1", // class name
  bases_G16x14y1, 6,
  &(vtc_G16x14y1[0]), // expected_vtbl_contents
  &(vtt_G16x14y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G16x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x14y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x14y1),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  G16x14y2  : E16x14 , virtual F1 {
  int ff;
  ~G16x14y2(); // tgen
  G16x14y2(); // tgen
};
//SIG(1 G16x14y2) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G16x14y2 ::~G16x14y2(){ note_dtor("G16x14y2", this);} // tgen
G16x14y2 ::G16x14y2(){ note_ctor("G16x14y2", this);} // tgen

static void Test_G16x14y2()
{
  extern Class_Descriptor cd_G16x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x14y2, buf);
    G16x14y2 *dp, &lv = *(dp=new (buf) G16x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x14y2)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x14*), ABISELECT(8,4), "G16x14y2");
    check_base_class_offset(lv, (B0*)(C16*)(E16x14*), ABISELECT(12,8), "G16x14y2");
    check_base_class_offset(lv, (C16*)(E16x14*), 0, "G16x14y2");
    check_base_class_offset(lv, (D0*)(E16x14*), ABISELECT(28,24), "G16x14y2");
    check_base_class_offset(lv, (E16x14*), 0, "G16x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G16x14y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G16x14y2.ff");
    test_class_info(&lv, &cd_G16x14y2);
    dp->~G16x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x14y2(Test_G16x14y2, "G16x14y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G16x14y2C1Ev();
extern void _ZN8G16x14y2D1Ev();
Name_Map name_map_G16x14y2[] = {
  NSPAIR(_ZN8G16x14y2C1Ev),
  NSPAIR(_ZN8G16x14y2D1Ev),
  {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_E16x14;
extern VTBL_ENTRY _ZTI6E16x14[];
extern  VTBL_ENTRY _ZTV6E16x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x14y2[] = {
  // 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_E16x14,    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 _ZTI8G16x14y2[];
extern void _ZN6E16x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x14y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x14y2[0]),
  (VTBL_ENTRY)&_ZN6E16x143fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G16x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G16x14y2[];
extern void _ZN6E16x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x14__8G16x14y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x14[0]),
  (VTBL_ENTRY)&_ZN6E16x143fooEv,
};
static  VTT_ENTRY vtt_G16x14y2[] = {
  {&(_ZTV8G16x14y2[4]),  4,9},
  {&(_tg__ZTV6E16x14__8G16x14y2[3]),  3,4},
  {&(_ZTV8G16x14y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G16x14y2[];
extern  VTBL_ENTRY _ZTV8G16x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x14y2[];
Class_Descriptor cd_G16x14y2 = {  "G16x14y2", // class name
  bases_G16x14y2, 6,
  &(vtc_G16x14y2[0]), // expected_vtbl_contents
  &(vtt_G16x14y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G16x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x14y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x14y2),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  G16x14y3  : virtual E16x14 , virtual F1 {
  int ff;
  ~G16x14y3(); // tgen
  G16x14y3(); // tgen
};
//SIG(1 G16x14y3) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G16x14y3 ::~G16x14y3(){ note_dtor("G16x14y3", this);} // tgen
G16x14y3 ::G16x14y3(){ note_ctor("G16x14y3", this);} // tgen

static void Test_G16x14y3()
{
  extern Class_Descriptor cd_G16x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G16x14y3, buf);
    G16x14y3 *dp, &lv = *(dp=new (buf) G16x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G16x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x14y3)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x14*), ABISELECT(24,12), "G16x14y3");
    check_base_class_offset(lv, (B0*)(C16*)(E16x14*), ABISELECT(28,16), "G16x14y3");
    check_base_class_offset(lv, (C16*)(E16x14*), ABISELECT(16,8), "G16x14y3");
    check_base_class_offset(lv, (D0*)(E16x14*), ABISELECT(40,28), "G16x14y3");
    check_base_class_offset(lv, (E16x14*), ABISELECT(16,8), "G16x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G16x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G16x14y3.ff");
    test_class_info(&lv, &cd_G16x14y3);
    dp->~G16x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x14y3(Test_G16x14y3, "G16x14y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G16x14y3C1Ev();
extern void _ZN8G16x14y3D1Ev();
Name_Map name_map_G16x14y3[] = {
  NSPAIR(_ZN8G16x14y3C1Ev),
  NSPAIR(_ZN8G16x14y3D1Ev),
  {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_E16x14;
extern VTBL_ENTRY _ZTI6E16x14[];
extern  VTBL_ENTRY _ZTV6E16x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x14y3[] = {
  // 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_E16x14,    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 _ZTI8G16x14y3[];
extern void _ZN6E16x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x14y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x14y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G16x14y3[0]),
  (VTBL_ENTRY)&_ZN6E16x143fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G16x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G16x14y3[];
extern void _ZN6E16x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x14__8G16x14y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x14[0]),
  (VTBL_ENTRY)&_ZN6E16x143fooEv,
};
static  VTT_ENTRY vtt_G16x14y3[] = {
  {&(_ZTV8G16x14y3[5]),  5,14},
  {&(_ZTV8G16x14y3[9]),  9,14},
  {&(_ZTV8G16x14y3[13]),  13,14},
  {&(_tg__ZTV6E16x14__8G16x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G16x14y3[];
extern  VTBL_ENTRY _ZTV8G16x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x14y3[];
Class_Descriptor cd_G16x14y3 = {  "G16x14y3", // class name
  bases_G16x14y3, 6,
  &(vtc_G16x14y3[0]), // expected_vtbl_contents
  &(vtt_G16x14y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G16x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x14y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x14y3),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  G16x14y4  : E16x14 , F0 {
  int ff;
  ~G16x14y4(); // tgen
  G16x14y4(); // tgen
};
//SIG(1 G16x14y4) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G16x14y4 ::~G16x14y4(){ note_dtor("G16x14y4", this);} // tgen
G16x14y4 ::G16x14y4(){ note_ctor("G16x14y4", this);} // tgen

static void Test_G16x14y4()
{
  extern Class_Descriptor cd_G16x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G16x14y4, buf);
    G16x14y4 *dp, &lv = *(dp=new (buf) G16x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G16x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x14y4)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x14*), ABISELECT(8,4), "G16x14y4");
    check_base_class_offset(lv, (B0*)(C16*)(E16x14*), ABISELECT(12,8), "G16x14y4");
    check_base_class_offset(lv, (C16*)(E16x14*), 0, "G16x14y4");
    check_base_class_offset(lv, (D0*)(E16x14*), ABISELECT(32,28), "G16x14y4");
    check_base_class_offset(lv, (E16x14*), 0, "G16x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G16x14y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G16x14y4.ff");
    test_class_info(&lv, &cd_G16x14y4);
    dp->~G16x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x14y4(Test_G16x14y4, "G16x14y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G16x14y4C1Ev();
extern void _ZN8G16x14y4D1Ev();
Name_Map name_map_G16x14y4[] = {
  NSPAIR(_ZN8G16x14y4C1Ev),
  NSPAIR(_ZN8G16x14y4D1Ev),
  {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_E16x14;
extern VTBL_ENTRY _ZTI6E16x14[];
extern  VTBL_ENTRY _ZTV6E16x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x14y4[] = {
  // 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_E16x14,    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 _ZTI8G16x14y4[];
extern void _ZN6E16x143fooEv();
static  VTBL_ENTRY vtc_G16x14y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x14y4[0]),
  (VTBL_ENTRY)&_ZN6E16x143fooEv,
};
extern VTBL_ENTRY _ZTV8G16x14y4[];
extern void _ZN6E16x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x14__8G16x14y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x14[0]),
  (VTBL_ENTRY)&_ZN6E16x143fooEv,
};
static  VTT_ENTRY vtt_G16x14y4[] = {
  {&(_ZTV8G16x14y4[3]),  3,4},
  {&(_tg__ZTV6E16x14__8G16x14y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G16x14y4[];
extern  VTBL_ENTRY _ZTV8G16x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x14y4[];
Class_Descriptor cd_G16x14y4 = {  "G16x14y4", // class name
  bases_G16x14y4, 6,
  &(vtc_G16x14y4[0]), // expected_vtbl_contents
  &(vtt_G16x14y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G16x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x14y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x14y4),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  G16x14y5  : virtual E16x14 , F0 {
  int ff;
  ~G16x14y5(); // tgen
  G16x14y5(); // tgen
};
//SIG(1 G16x14y5) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G16x14y5 ::~G16x14y5(){ note_dtor("G16x14y5", this);} // tgen
G16x14y5 ::G16x14y5(){ note_ctor("G16x14y5", this);} // tgen

static void Test_G16x14y5()
{
  extern Class_Descriptor cd_G16x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x14y5, buf);
    G16x14y5 *dp, &lv = *(dp=new (buf) G16x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x14y5)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x14*), ABISELECT(24,16), "G16x14y5");
    check_base_class_offset(lv, (B0*)(C16*)(E16x14*), ABISELECT(28,20), "G16x14y5");
    check_base_class_offset(lv, (C16*)(E16x14*), ABISELECT(16,12), "G16x14y5");
    check_base_class_offset(lv, (D0*)(E16x14*), ABISELECT(40,32), "G16x14y5");
    check_base_class_offset(lv, (E16x14*), ABISELECT(16,12), "G16x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G16x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x14y5.ff");
    test_class_info(&lv, &cd_G16x14y5);
    dp->~G16x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x14y5(Test_G16x14y5, "G16x14y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G16x14y5C1Ev();
extern void _ZN8G16x14y5D1Ev();
Name_Map name_map_G16x14y5[] = {
  NSPAIR(_ZN8G16x14y5C1Ev),
  NSPAIR(_ZN8G16x14y5D1Ev),
  {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_E16x14;
extern VTBL_ENTRY _ZTI6E16x14[];
extern  VTBL_ENTRY _ZTV6E16x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x14y5[] = {
  // 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_E16x14,    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 _ZTI8G16x14y5[];
extern void _ZN6E16x143fooEv();
static  VTBL_ENTRY vtc_G16x14y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x14y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G16x14y5[0]),
  (VTBL_ENTRY)&_ZN6E16x143fooEv,
};
extern VTBL_ENTRY _ZTV8G16x14y5[];
extern void _ZN6E16x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x14__8G16x14y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x14[0]),
  (VTBL_ENTRY)&_ZN6E16x143fooEv,
};
static  VTT_ENTRY vtt_G16x14y5[] = {
  {&(_ZTV8G16x14y5[4]),  4,9},
  {&(_ZTV8G16x14y5[8]),  8,9},
  {&(_tg__ZTV6E16x14__8G16x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G16x14y5[];
extern  VTBL_ENTRY _ZTV8G16x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x14y5[];
Class_Descriptor cd_G16x14y5 = {  "G16x14y5", // class name
  bases_G16x14y5, 6,
  &(vtc_G16x14y5[0]), // expected_vtbl_contents
  &(vtt_G16x14y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G16x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x14y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x14y5),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  G16x14y6  : E16x14 , virtual F0 {
  int ff;
  ~G16x14y6(); // tgen
  G16x14y6(); // tgen
};
//SIG(1 G16x14y6) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G16x14y6 ::~G16x14y6(){ note_dtor("G16x14y6", this);} // tgen
G16x14y6 ::G16x14y6(){ note_ctor("G16x14y6", this);} // tgen

static void Test_G16x14y6()
{
  extern Class_Descriptor cd_G16x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G16x14y6, buf);
    G16x14y6 *dp, &lv = *(dp=new (buf) G16x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G16x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x14y6)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x14*), ABISELECT(8,4), "G16x14y6");
    check_base_class_offset(lv, (B0*)(C16*)(E16x14*), ABISELECT(12,8), "G16x14y6");
    check_base_class_offset(lv, (C16*)(E16x14*), 0, "G16x14y6");
    check_base_class_offset(lv, (D0*)(E16x14*), ABISELECT(28,24), "G16x14y6");
    check_base_class_offset(lv, (E16x14*), 0, "G16x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G16x14y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G16x14y6.ff");
    test_class_info(&lv, &cd_G16x14y6);
    dp->~G16x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x14y6(Test_G16x14y6, "G16x14y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G16x14y6C1Ev();
extern void _ZN8G16x14y6D1Ev();
Name_Map name_map_G16x14y6[] = {
  NSPAIR(_ZN8G16x14y6C1Ev),
  NSPAIR(_ZN8G16x14y6D1Ev),
  {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_E16x14;
extern VTBL_ENTRY _ZTI6E16x14[];
extern  VTBL_ENTRY _ZTV6E16x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x14y6[] = {
  // 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_E16x14,    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 _ZTI8G16x14y6[];
extern void _ZN6E16x143fooEv();
static  VTBL_ENTRY vtc_G16x14y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x14y6[0]),
  (VTBL_ENTRY)&_ZN6E16x143fooEv,
};
extern VTBL_ENTRY _ZTV8G16x14y6[];
extern void _ZN6E16x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x14__8G16x14y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x14[0]),
  (VTBL_ENTRY)&_ZN6E16x143fooEv,
};
static  VTT_ENTRY vtt_G16x14y6[] = {
  {&(_ZTV8G16x14y6[4]),  4,5},
  {&(_tg__ZTV6E16x14__8G16x14y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G16x14y6[];
extern  VTBL_ENTRY _ZTV8G16x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x14y6[];
Class_Descriptor cd_G16x14y6 = {  "G16x14y6", // class name
  bases_G16x14y6, 6,
  &(vtc_G16x14y6[0]), // expected_vtbl_contents
  &(vtt_G16x14y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G16x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x14y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x14y6),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  G16x14y7  : virtual E16x14 , virtual F0 {
  int ff;
  ~G16x14y7(); // tgen
  G16x14y7(); // tgen
};
//SIG(1 G16x14y7) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G16x14y7 ::~G16x14y7(){ note_dtor("G16x14y7", this);} // tgen
G16x14y7 ::G16x14y7(){ note_ctor("G16x14y7", this);} // tgen

static void Test_G16x14y7()
{
  extern Class_Descriptor cd_G16x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x14y7, buf);
    G16x14y7 *dp, &lv = *(dp=new (buf) G16x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x14y7)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x14*), ABISELECT(24,12), "G16x14y7");
    check_base_class_offset(lv, (B0*)(C16*)(E16x14*), ABISELECT(28,16), "G16x14y7");
    check_base_class_offset(lv, (C16*)(E16x14*), ABISELECT(16,8), "G16x14y7");
    check_base_class_offset(lv, (D0*)(E16x14*), ABISELECT(40,28), "G16x14y7");
    check_base_class_offset(lv, (E16x14*), ABISELECT(16,8), "G16x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G16x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G16x14y7.ff");
    test_class_info(&lv, &cd_G16x14y7);
    dp->~G16x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x14y7(Test_G16x14y7, "G16x14y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G16x14y7C1Ev();
extern void _ZN8G16x14y7D1Ev();
Name_Map name_map_G16x14y7[] = {
  NSPAIR(_ZN8G16x14y7C1Ev),
  NSPAIR(_ZN8G16x14y7D1Ev),
  {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_E16x14;
extern VTBL_ENTRY _ZTI6E16x14[];
extern  VTBL_ENTRY _ZTV6E16x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x14y7[] = {
  // 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_E16x14,    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 _ZTI8G16x14y7[];
extern void _ZN6E16x143fooEv();
static  VTBL_ENTRY vtc_G16x14y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x14y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G16x14y7[0]),
  (VTBL_ENTRY)&_ZN6E16x143fooEv,
};
extern VTBL_ENTRY _ZTV8G16x14y7[];
extern void _ZN6E16x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x14__8G16x14y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x14[0]),
  (VTBL_ENTRY)&_ZN6E16x143fooEv,
};
static  VTT_ENTRY vtt_G16x14y7[] = {
  {&(_ZTV8G16x14y7[5]),  5,10},
  {&(_ZTV8G16x14y7[9]),  9,10},
  {&(_tg__ZTV6E16x14__8G16x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G16x14y7[];
extern  VTBL_ENTRY _ZTV8G16x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x14y7[];
Class_Descriptor cd_G16x14y7 = {  "G16x14y7", // class name
  bases_G16x14y7, 6,
  &(vtc_G16x14y7[0]), // expected_vtbl_contents
  &(vtt_G16x14y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G16x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x14y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x14y7),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  E17x14  : C17 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E17x143fooEv
  ~E17x14(); // tgen
  E17x14(); // tgen
};
//SIG(-1 E17x14) C1{ BC2{ BC3{ v1 Fi} BC4{ Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E17x14 ::foo(){vfunc_called(this, "_ZN6E17x143fooEv");}
E17x14 ::~E17x14(){ note_dtor("E17x14", this);} // tgen
E17x14 ::E17x14(){ note_ctor("E17x14", this);} // tgen

static void Test_E17x14()
{
  extern Class_Descriptor cd_E17x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E17x14, buf);
    E17x14 *dp, &lv = *(dp=new (buf) E17x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E17x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E17x14)");
    check_base_class_offset(lv, (A1*)(C17*), 0, "E17x14");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(12,8), "E17x14");
    check_base_class_offset(lv, (C17*), 0, "E17x14");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E17x14");
    check_field_offset(lv, fd, ABISELECT(20,16), "E17x14.fd");
    test_class_info(&lv, &cd_E17x14);
    dp->~E17x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE17x14(Test_E17x14, "E17x14", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6E17x14C1Ev();
extern void _ZN6E17x14D1Ev();
Name_Map name_map_E17x14[] = {
  NSPAIR(_ZN6E17x14C1Ev),
  NSPAIR(_ZN6E17x14D1Ev),
  {0,0}
};
extern Class_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_E17x14[] = {
  // 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 _ZTI6E17x14[];
extern void _ZN6E17x143fooEv();
static  VTBL_ENTRY vtc_E17x14[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x14[0]),
  (VTBL_ENTRY)&_ZN6E17x143fooEv,
};
extern VTBL_ENTRY _ZTV6E17x14[];
static  VTT_ENTRY vtt_E17x14[] = {
  {&(_ZTV6E17x14[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E17x14[];
extern  VTBL_ENTRY _ZTV6E17x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x14[];
Class_Descriptor cd_E17x14 = {  "E17x14", // class name
  bases_E17x14, 4,
  &(vtc_E17x14[0]), // expected_vtbl_contents
  &(vtt_E17x14[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6E17x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E17x14),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E17x14),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  G17x14y0  : E17x14 , F1 {
  int ff;
  ~G17x14y0(); // tgen
  G17x14y0(); // tgen
};
//SIG(1 G17x14y0) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G17x14y0 ::~G17x14y0(){ note_dtor("G17x14y0", this);} // tgen
G17x14y0 ::G17x14y0(){ note_ctor("G17x14y0", this);} // tgen

static void Test_G17x14y0()
{
  extern Class_Descriptor cd_G17x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x14y0, buf);
    G17x14y0 *dp, &lv = *(dp=new (buf) G17x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x14y0)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x14*), 0, "G17x14y0");
    check_base_class_offset(lv, (B0*)(C17*)(E17x14*), ABISELECT(12,8), "G17x14y0");
    check_base_class_offset(lv, (C17*)(E17x14*), 0, "G17x14y0");
    check_base_class_offset(lv, (D0*)(E17x14*), ABISELECT(40,32), "G17x14y0");
    check_base_class_offset(lv, (E17x14*), 0, "G17x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G17x14y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G17x14y0.ff");
    test_class_info(&lv, &cd_G17x14y0);
    dp->~G17x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x14y0(Test_G17x14y0, "G17x14y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G17x14y0C1Ev();
extern void _ZN8G17x14y0D1Ev();
Name_Map name_map_G17x14y0[] = {
  NSPAIR(_ZN8G17x14y0C1Ev),
  NSPAIR(_ZN8G17x14y0D1Ev),
  {0,0}
};
extern Class_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_E17x14;
extern VTBL_ENTRY _ZTI6E17x14[];
extern  VTBL_ENTRY _ZTV6E17x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x14y0[] = {
  // 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_E17x14,    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 _ZTI8G17x14y0[];
extern void _ZN6E17x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x14y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x14y0[0]),
  (VTBL_ENTRY)&_ZN6E17x143fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G17x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G17x14y0[];
extern void _ZN6E17x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x14__8G17x14y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x14[0]),
  (VTBL_ENTRY)&_ZN6E17x143fooEv,
};
static  VTT_ENTRY vtt_G17x14y0[] = {
  {&(_ZTV8G17x14y0[3]),  3,7},
  {&(_tg__ZTV6E17x14__8G17x14y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G17x14y0[];
extern  VTBL_ENTRY _ZTV8G17x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x14y0[];
Class_Descriptor cd_G17x14y0 = {  "G17x14y0", // class name
  bases_G17x14y0, 6,
  &(vtc_G17x14y0[0]), // expected_vtbl_contents
  &(vtt_G17x14y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G17x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x14y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x14y0),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  G17x14y1  : virtual E17x14 , F1 {
  int ff;
  ~G17x14y1(); // tgen
  G17x14y1(); // tgen
};
//SIG(1 G17x14y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G17x14y1 ::~G17x14y1(){ note_dtor("G17x14y1", this);} // tgen
G17x14y1 ::G17x14y1(){ note_ctor("G17x14y1", this);} // tgen

static void Test_G17x14y1()
{
  extern Class_Descriptor cd_G17x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x14y1, buf);
    G17x14y1 *dp, &lv = *(dp=new (buf) G17x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x14y1)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x14*), ABISELECT(16,12), "G17x14y1");
    check_base_class_offset(lv, (B0*)(C17*)(E17x14*), ABISELECT(28,20), "G17x14y1");
    check_base_class_offset(lv, (C17*)(E17x14*), ABISELECT(16,12), "G17x14y1");
    check_base_class_offset(lv, (D0*)(E17x14*), ABISELECT(40,32), "G17x14y1");
    check_base_class_offset(lv, (E17x14*), ABISELECT(16,12), "G17x14y1");
    check_base_class_offset(lv, (F1*), 0, "G17x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x14y1.ff");
    test_class_info(&lv, &cd_G17x14y1);
    dp->~G17x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x14y1(Test_G17x14y1, "G17x14y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G17x14y1C1Ev();
extern void _ZN8G17x14y1D1Ev();
Name_Map name_map_G17x14y1[] = {
  NSPAIR(_ZN8G17x14y1C1Ev),
  NSPAIR(_ZN8G17x14y1D1Ev),
  {0,0}
};
extern Class_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_E17x14;
extern VTBL_ENTRY _ZTI6E17x14[];
extern  VTBL_ENTRY _ZTV6E17x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x14y1[] = {
  // 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_E17x14,    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 _ZTI8G17x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E17x143fooEv();
static  VTBL_ENTRY vtc_G17x14y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G17x14y1[0]),
  (VTBL_ENTRY)&_ZN6E17x143fooEv,
};
extern VTBL_ENTRY _ZTV8G17x14y1[];
extern void _ZN6E17x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x14__8G17x14y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x14[0]),
  (VTBL_ENTRY)&_ZN6E17x143fooEv,
};
static  VTT_ENTRY vtt_G17x14y1[] = {
  {&(_ZTV8G17x14y1[4]),  4,10},
  {&(_ZTV8G17x14y1[9]),  9,10},
  {&(_tg__ZTV6E17x14__8G17x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G17x14y1[];
extern  VTBL_ENTRY _ZTV8G17x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x14y1[];
Class_Descriptor cd_G17x14y1 = {  "G17x14y1", // class name
  bases_G17x14y1, 6,
  &(vtc_G17x14y1[0]), // expected_vtbl_contents
  &(vtt_G17x14y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G17x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x14y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x14y1),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  G17x14y2  : E17x14 , virtual F1 {
  int ff;
  ~G17x14y2(); // tgen
  G17x14y2(); // tgen
};
//SIG(1 G17x14y2) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G17x14y2 ::~G17x14y2(){ note_dtor("G17x14y2", this);} // tgen
G17x14y2 ::G17x14y2(){ note_ctor("G17x14y2", this);} // tgen

static void Test_G17x14y2()
{
  extern Class_Descriptor cd_G17x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x14y2, buf);
    G17x14y2 *dp, &lv = *(dp=new (buf) G17x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x14y2)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x14*), 0, "G17x14y2");
    check_base_class_offset(lv, (B0*)(C17*)(E17x14*), ABISELECT(12,8), "G17x14y2");
    check_base_class_offset(lv, (C17*)(E17x14*), 0, "G17x14y2");
    check_base_class_offset(lv, (D0*)(E17x14*), ABISELECT(28,24), "G17x14y2");
    check_base_class_offset(lv, (E17x14*), 0, "G17x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G17x14y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G17x14y2.ff");
    test_class_info(&lv, &cd_G17x14y2);
    dp->~G17x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x14y2(Test_G17x14y2, "G17x14y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G17x14y2C1Ev();
extern void _ZN8G17x14y2D1Ev();
Name_Map name_map_G17x14y2[] = {
  NSPAIR(_ZN8G17x14y2C1Ev),
  NSPAIR(_ZN8G17x14y2D1Ev),
  {0,0}
};
extern Class_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_E17x14;
extern VTBL_ENTRY _ZTI6E17x14[];
extern  VTBL_ENTRY _ZTV6E17x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x14y2[] = {
  // 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_E17x14,    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 _ZTI8G17x14y2[];
extern void _ZN6E17x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x14y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x14y2[0]),
  (VTBL_ENTRY)&_ZN6E17x143fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G17x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G17x14y2[];
extern void _ZN6E17x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x14__8G17x14y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x14[0]),
  (VTBL_ENTRY)&_ZN6E17x143fooEv,
};
static  VTT_ENTRY vtt_G17x14y2[] = {
  {&(_ZTV8G17x14y2[4]),  4,9},
  {&(_tg__ZTV6E17x14__8G17x14y2[3]),  3,4},
  {&(_ZTV8G17x14y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G17x14y2[];
extern  VTBL_ENTRY _ZTV8G17x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x14y2[];
Class_Descriptor cd_G17x14y2 = {  "G17x14y2", // class name
  bases_G17x14y2, 6,
  &(vtc_G17x14y2[0]), // expected_vtbl_contents
  &(vtt_G17x14y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G17x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x14y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x14y2),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  G17x14y3  : virtual E17x14 , virtual F1 {
  int ff;
  ~G17x14y3(); // tgen
  G17x14y3(); // tgen
};
//SIG(1 G17x14y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G17x14y3 ::~G17x14y3(){ note_dtor("G17x14y3", this);} // tgen
G17x14y3 ::G17x14y3(){ note_ctor("G17x14y3", this);} // tgen

static void Test_G17x14y3()
{
  extern Class_Descriptor cd_G17x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G17x14y3, buf);
    G17x14y3 *dp, &lv = *(dp=new (buf) G17x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G17x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x14y3)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x14*), ABISELECT(16,8), "G17x14y3");
    check_base_class_offset(lv, (B0*)(C17*)(E17x14*), ABISELECT(28,16), "G17x14y3");
    check_base_class_offset(lv, (C17*)(E17x14*), ABISELECT(16,8), "G17x14y3");
    check_base_class_offset(lv, (D0*)(E17x14*), ABISELECT(40,28), "G17x14y3");
    check_base_class_offset(lv, (E17x14*), ABISELECT(16,8), "G17x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G17x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G17x14y3.ff");
    test_class_info(&lv, &cd_G17x14y3);
    dp->~G17x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x14y3(Test_G17x14y3, "G17x14y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G17x14y3C1Ev();
extern void _ZN8G17x14y3D1Ev();
Name_Map name_map_G17x14y3[] = {
  NSPAIR(_ZN8G17x14y3C1Ev),
  NSPAIR(_ZN8G17x14y3D1Ev),
  {0,0}
};
extern Class_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_E17x14;
extern VTBL_ENTRY _ZTI6E17x14[];
extern  VTBL_ENTRY _ZTV6E17x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x14y3[] = {
  // 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_E17x14,    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 _ZTI8G17x14y3[];
extern void _ZN6E17x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x14y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x14y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G17x14y3[0]),
  (VTBL_ENTRY)&_ZN6E17x143fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G17x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G17x14y3[];
extern void _ZN6E17x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x14__8G17x14y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x14[0]),
  (VTBL_ENTRY)&_ZN6E17x143fooEv,
};
static  VTT_ENTRY vtt_G17x14y3[] = {
  {&(_ZTV8G17x14y3[5]),  5,14},
  {&(_ZTV8G17x14y3[9]),  9,14},
  {&(_ZTV8G17x14y3[13]),  13,14},
  {&(_tg__ZTV6E17x14__8G17x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G17x14y3[];
extern  VTBL_ENTRY _ZTV8G17x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x14y3[];
Class_Descriptor cd_G17x14y3 = {  "G17x14y3", // class name
  bases_G17x14y3, 6,
  &(vtc_G17x14y3[0]), // expected_vtbl_contents
  &(vtt_G17x14y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G17x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x14y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x14y3),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  G17x14y4  : E17x14 , F0 {
  int ff;
  ~G17x14y4(); // tgen
  G17x14y4(); // tgen
};
//SIG(1 G17x14y4) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G17x14y4 ::~G17x14y4(){ note_dtor("G17x14y4", this);} // tgen
G17x14y4 ::G17x14y4(){ note_ctor("G17x14y4", this);} // tgen

static void Test_G17x14y4()
{
  extern Class_Descriptor cd_G17x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G17x14y4, buf);
    G17x14y4 *dp, &lv = *(dp=new (buf) G17x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G17x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x14y4)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x14*), 0, "G17x14y4");
    check_base_class_offset(lv, (B0*)(C17*)(E17x14*), ABISELECT(12,8), "G17x14y4");
    check_base_class_offset(lv, (C17*)(E17x14*), 0, "G17x14y4");
    check_base_class_offset(lv, (D0*)(E17x14*), ABISELECT(32,28), "G17x14y4");
    check_base_class_offset(lv, (E17x14*), 0, "G17x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G17x14y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G17x14y4.ff");
    test_class_info(&lv, &cd_G17x14y4);
    dp->~G17x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x14y4(Test_G17x14y4, "G17x14y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G17x14y4C1Ev();
extern void _ZN8G17x14y4D1Ev();
Name_Map name_map_G17x14y4[] = {
  NSPAIR(_ZN8G17x14y4C1Ev),
  NSPAIR(_ZN8G17x14y4D1Ev),
  {0,0}
};
extern Class_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_E17x14;
extern VTBL_ENTRY _ZTI6E17x14[];
extern  VTBL_ENTRY _ZTV6E17x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x14y4[] = {
  // 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_E17x14,    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 _ZTI8G17x14y4[];
extern void _ZN6E17x143fooEv();
static  VTBL_ENTRY vtc_G17x14y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x14y4[0]),
  (VTBL_ENTRY)&_ZN6E17x143fooEv,
};
extern VTBL_ENTRY _ZTV8G17x14y4[];
extern void _ZN6E17x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x14__8G17x14y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x14[0]),
  (VTBL_ENTRY)&_ZN6E17x143fooEv,
};
static  VTT_ENTRY vtt_G17x14y4[] = {
  {&(_ZTV8G17x14y4[3]),  3,4},
  {&(_tg__ZTV6E17x14__8G17x14y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G17x14y4[];
extern  VTBL_ENTRY _ZTV8G17x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x14y4[];
Class_Descriptor cd_G17x14y4 = {  "G17x14y4", // class name
  bases_G17x14y4, 6,
  &(vtc_G17x14y4[0]), // expected_vtbl_contents
  &(vtt_G17x14y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G17x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x14y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x14y4),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  G17x14y5  : virtual E17x14 , F0 {
  int ff;
  ~G17x14y5(); // tgen
  G17x14y5(); // tgen
};
//SIG(1 G17x14y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G17x14y5 ::~G17x14y5(){ note_dtor("G17x14y5", this);} // tgen
G17x14y5 ::G17x14y5(){ note_ctor("G17x14y5", this);} // tgen

static void Test_G17x14y5()
{
  extern Class_Descriptor cd_G17x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x14y5, buf);
    G17x14y5 *dp, &lv = *(dp=new (buf) G17x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x14y5)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x14*), ABISELECT(16,12), "G17x14y5");
    check_base_class_offset(lv, (B0*)(C17*)(E17x14*), ABISELECT(28,20), "G17x14y5");
    check_base_class_offset(lv, (C17*)(E17x14*), ABISELECT(16,12), "G17x14y5");
    check_base_class_offset(lv, (D0*)(E17x14*), ABISELECT(40,32), "G17x14y5");
    check_base_class_offset(lv, (E17x14*), ABISELECT(16,12), "G17x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G17x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x14y5.ff");
    test_class_info(&lv, &cd_G17x14y5);
    dp->~G17x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x14y5(Test_G17x14y5, "G17x14y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G17x14y5C1Ev();
extern void _ZN8G17x14y5D1Ev();
Name_Map name_map_G17x14y5[] = {
  NSPAIR(_ZN8G17x14y5C1Ev),
  NSPAIR(_ZN8G17x14y5D1Ev),
  {0,0}
};
extern Class_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_E17x14;
extern VTBL_ENTRY _ZTI6E17x14[];
extern  VTBL_ENTRY _ZTV6E17x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x14y5[] = {
  // 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_E17x14,    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 _ZTI8G17x14y5[];
extern void _ZN6E17x143fooEv();
static  VTBL_ENTRY vtc_G17x14y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x14y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G17x14y5[0]),
  (VTBL_ENTRY)&_ZN6E17x143fooEv,
};
extern VTBL_ENTRY _ZTV8G17x14y5[];
extern void _ZN6E17x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x14__8G17x14y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x14[0]),
  (VTBL_ENTRY)&_ZN6E17x143fooEv,
};
static  VTT_ENTRY vtt_G17x14y5[] = {
  {&(_ZTV8G17x14y5[4]),  4,9},
  {&(_ZTV8G17x14y5[8]),  8,9},
  {&(_tg__ZTV6E17x14__8G17x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G17x14y5[];
extern  VTBL_ENTRY _ZTV8G17x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x14y5[];
Class_Descriptor cd_G17x14y5 = {  "G17x14y5", // class name
  bases_G17x14y5, 6,
  &(vtc_G17x14y5[0]), // expected_vtbl_contents
  &(vtt_G17x14y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G17x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x14y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x14y5),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  G17x14y6  : E17x14 , virtual F0 {
  int ff;
  ~G17x14y6(); // tgen
  G17x14y6(); // tgen
};
//SIG(1 G17x14y6) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G17x14y6 ::~G17x14y6(){ note_dtor("G17x14y6", this);} // tgen
G17x14y6 ::G17x14y6(){ note_ctor("G17x14y6", this);} // tgen

static void Test_G17x14y6()
{
  extern Class_Descriptor cd_G17x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G17x14y6, buf);
    G17x14y6 *dp, &lv = *(dp=new (buf) G17x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G17x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x14y6)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x14*), 0, "G17x14y6");
    check_base_class_offset(lv, (B0*)(C17*)(E17x14*), ABISELECT(12,8), "G17x14y6");
    check_base_class_offset(lv, (C17*)(E17x14*), 0, "G17x14y6");
    check_base_class_offset(lv, (D0*)(E17x14*), ABISELECT(28,24), "G17x14y6");
    check_base_class_offset(lv, (E17x14*), 0, "G17x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G17x14y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G17x14y6.ff");
    test_class_info(&lv, &cd_G17x14y6);
    dp->~G17x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x14y6(Test_G17x14y6, "G17x14y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G17x14y6C1Ev();
extern void _ZN8G17x14y6D1Ev();
Name_Map name_map_G17x14y6[] = {
  NSPAIR(_ZN8G17x14y6C1Ev),
  NSPAIR(_ZN8G17x14y6D1Ev),
  {0,0}
};
extern Class_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_E17x14;
extern VTBL_ENTRY _ZTI6E17x14[];
extern  VTBL_ENTRY _ZTV6E17x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x14y6[] = {
  // 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_E17x14,    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 _ZTI8G17x14y6[];
extern void _ZN6E17x143fooEv();
static  VTBL_ENTRY vtc_G17x14y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x14y6[0]),
  (VTBL_ENTRY)&_ZN6E17x143fooEv,
};
extern VTBL_ENTRY _ZTV8G17x14y6[];
extern void _ZN6E17x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x14__8G17x14y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x14[0]),
  (VTBL_ENTRY)&_ZN6E17x143fooEv,
};
static  VTT_ENTRY vtt_G17x14y6[] = {
  {&(_ZTV8G17x14y6[4]),  4,5},
  {&(_tg__ZTV6E17x14__8G17x14y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G17x14y6[];
extern  VTBL_ENTRY _ZTV8G17x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x14y6[];
Class_Descriptor cd_G17x14y6 = {  "G17x14y6", // class name
  bases_G17x14y6, 6,
  &(vtc_G17x14y6[0]), // expected_vtbl_contents
  &(vtt_G17x14y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G17x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x14y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x14y6),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  G17x14y7  : virtual E17x14 , virtual F0 {
  int ff;
  ~G17x14y7(); // tgen
  G17x14y7(); // tgen
};
//SIG(1 G17x14y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G17x14y7 ::~G17x14y7(){ note_dtor("G17x14y7", this);} // tgen
G17x14y7 ::G17x14y7(){ note_ctor("G17x14y7", this);} // tgen

static void Test_G17x14y7()
{
  extern Class_Descriptor cd_G17x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x14y7, buf);
    G17x14y7 *dp, &lv = *(dp=new (buf) G17x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x14y7)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x14*), ABISELECT(16,8), "G17x14y7");
    check_base_class_offset(lv, (B0*)(C17*)(E17x14*), ABISELECT(28,16), "G17x14y7");
    check_base_class_offset(lv, (C17*)(E17x14*), ABISELECT(16,8), "G17x14y7");
    check_base_class_offset(lv, (D0*)(E17x14*), ABISELECT(40,28), "G17x14y7");
    check_base_class_offset(lv, (E17x14*), ABISELECT(16,8), "G17x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G17x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G17x14y7.ff");
    test_class_info(&lv, &cd_G17x14y7);
    dp->~G17x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x14y7(Test_G17x14y7, "G17x14y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G17x14y7C1Ev();
extern void _ZN8G17x14y7D1Ev();
Name_Map name_map_G17x14y7[] = {
  NSPAIR(_ZN8G17x14y7C1Ev),
  NSPAIR(_ZN8G17x14y7D1Ev),
  {0,0}
};
extern Class_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_E17x14;
extern VTBL_ENTRY _ZTI6E17x14[];
extern  VTBL_ENTRY _ZTV6E17x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x14y7[] = {
  // 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_E17x14,    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 _ZTI8G17x14y7[];
extern void _ZN6E17x143fooEv();
static  VTBL_ENTRY vtc_G17x14y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x14y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G17x14y7[0]),
  (VTBL_ENTRY)&_ZN6E17x143fooEv,
};
extern VTBL_ENTRY _ZTV8G17x14y7[];
extern void _ZN6E17x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x14__8G17x14y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x14[0]),
  (VTBL_ENTRY)&_ZN6E17x143fooEv,
};
static  VTT_ENTRY vtt_G17x14y7[] = {
  {&(_ZTV8G17x14y7[5]),  5,10},
  {&(_ZTV8G17x14y7[9]),  9,10},
  {&(_tg__ZTV6E17x14__8G17x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G17x14y7[];
extern  VTBL_ENTRY _ZTV8G17x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x14y7[];
Class_Descriptor cd_G17x14y7 = {  "G17x14y7", // class name
  bases_G17x14y7, 6,
  &(vtc_G17x14y7[0]), // expected_vtbl_contents
  &(vtt_G17x14y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G17x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x14y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x14y7),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  E18x14  : C18 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E18x143fooEv
  ~E18x14(); // tgen
  E18x14(); // tgen
};
//SIG(-1 E18x14) C1{ BC2{ VBC3{ Fi} BC4{ Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E18x14 ::foo(){vfunc_called(this, "_ZN6E18x143fooEv");}
E18x14 ::~E18x14(){ note_dtor("E18x14", this);} // tgen
E18x14 ::E18x14(){ note_ctor("E18x14", this);} // tgen

static void Test_E18x14()
{
  extern Class_Descriptor cd_E18x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E18x14, buf);
    E18x14 *dp, &lv = *(dp=new (buf) E18x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E18x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E18x14)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(20,16), "E18x14");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(8,4), "E18x14");
    check_base_class_offset(lv, (C18*), 0, "E18x14");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E18x14");
    check_field_offset(lv, fd, ABISELECT(16,12), "E18x14.fd");
    test_class_info(&lv, &cd_E18x14);
    dp->~E18x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE18x14(Test_E18x14, "E18x14", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6E18x14C1Ev();
extern void _ZN6E18x14D1Ev();
Name_Map name_map_E18x14[] = {
  NSPAIR(_ZN6E18x14C1Ev),
  NSPAIR(_ZN6E18x14D1Ev),
  {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_E18x14[] = {
  // 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 _ZTI6E18x14[];
extern void _ZN6E18x143fooEv();
static  VTBL_ENTRY vtc_E18x14[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x14[0]),
  (VTBL_ENTRY)&_ZN6E18x143fooEv,
};
extern VTBL_ENTRY _ZTV6E18x14[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__6E18x14[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_E18x14[] = {
  {&(_ZTV6E18x14[4]),  4,5},
  {&(_tg__ZTV3C18__6E18x14[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E18x14[];
extern  VTBL_ENTRY _ZTV6E18x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x14[];
Class_Descriptor cd_E18x14 = {  "E18x14", // class name
  bases_E18x14, 4,
  &(vtc_E18x14[0]), // expected_vtbl_contents
  &(vtt_E18x14[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6E18x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E18x14),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E18x14),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  G18x14y0  : E18x14 , F1 {
  int ff;
  ~G18x14y0(); // tgen
  G18x14y0(); // tgen
};
//SIG(1 G18x14y0) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G18x14y0 ::~G18x14y0(){ note_dtor("G18x14y0", this);} // tgen
G18x14y0 ::G18x14y0(){ note_ctor("G18x14y0", this);} // tgen

static void Test_G18x14y0()
{
  extern Class_Descriptor cd_G18x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x14y0, buf);
    G18x14y0 *dp, &lv = *(dp=new (buf) G18x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x14y0)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x14*), ABISELECT(40,28), "G18x14y0");
    check_base_class_offset(lv, (B0*)(C18*)(E18x14*), ABISELECT(8,4), "G18x14y0");
    check_base_class_offset(lv, (C18*)(E18x14*), 0, "G18x14y0");
    check_base_class_offset(lv, (D0*)(E18x14*), ABISELECT(44,32), "G18x14y0");
    check_base_class_offset(lv, (E18x14*), 0, "G18x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G18x14y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G18x14y0.ff");
    test_class_info(&lv, &cd_G18x14y0);
    dp->~G18x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x14y0(Test_G18x14y0, "G18x14y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G18x14y0C1Ev();
extern void _ZN8G18x14y0D1Ev();
Name_Map name_map_G18x14y0[] = {
  NSPAIR(_ZN8G18x14y0C1Ev),
  NSPAIR(_ZN8G18x14y0D1Ev),
  {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_E18x14;
extern VTBL_ENTRY _ZTI6E18x14[];
extern  VTBL_ENTRY _ZTV6E18x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x14y0[] = {
  // 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_E18x14,    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 _ZTI8G18x14y0[];
extern void _ZN6E18x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x14y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x14y0[0]),
  (VTBL_ENTRY)&_ZN6E18x143fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G18x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G18x14y0[];
extern void _ZN6E18x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x14__8G18x14y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x14[0]),
  (VTBL_ENTRY)&_ZN6E18x143fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C186E18x14__8G18x14y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x14y0[] = {
  {&(_ZTV8G18x14y0[4]),  4,8},
  {&(_tg__ZTV6E18x14__8G18x14y0[4]),  4,5},
  {&(_tg__ZTV3C186E18x14__8G18x14y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x14y0[];
extern  VTBL_ENTRY _ZTV8G18x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x14y0[];
Class_Descriptor cd_G18x14y0 = {  "G18x14y0", // class name
  bases_G18x14y0, 6,
  &(vtc_G18x14y0[0]), // expected_vtbl_contents
  &(vtt_G18x14y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G18x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x14y0),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x14y0),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  G18x14y1  : virtual E18x14 , F1 {
  int ff;
  ~G18x14y1(); // tgen
  G18x14y1(); // tgen
};
//SIG(1 G18x14y1) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G18x14y1 ::~G18x14y1(){ note_dtor("G18x14y1", this);} // tgen
G18x14y1 ::G18x14y1(){ note_ctor("G18x14y1", this);} // tgen

static void Test_G18x14y1()
{
  extern Class_Descriptor cd_G18x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x14y1, buf);
    G18x14y1 *dp, &lv = *(dp=new (buf) G18x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x14y1)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x14*), ABISELECT(36,28), "G18x14y1");
    check_base_class_offset(lv, (B0*)(C18*)(E18x14*), ABISELECT(24,16), "G18x14y1");
    check_base_class_offset(lv, (C18*)(E18x14*), ABISELECT(16,12), "G18x14y1");
    check_base_class_offset(lv, (D0*)(E18x14*), ABISELECT(40,32), "G18x14y1");
    check_base_class_offset(lv, (E18x14*), ABISELECT(16,12), "G18x14y1");
    check_base_class_offset(lv, (F1*), 0, "G18x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x14y1.ff");
    test_class_info(&lv, &cd_G18x14y1);
    dp->~G18x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x14y1(Test_G18x14y1, "G18x14y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G18x14y1C1Ev();
extern void _ZN8G18x14y1D1Ev();
Name_Map name_map_G18x14y1[] = {
  NSPAIR(_ZN8G18x14y1C1Ev),
  NSPAIR(_ZN8G18x14y1D1Ev),
  {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_E18x14;
extern VTBL_ENTRY _ZTI6E18x14[];
extern  VTBL_ENTRY _ZTV6E18x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x14y1[] = {
  // 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_E18x14,    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 _ZTI8G18x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E18x143fooEv();
static  VTBL_ENTRY vtc_G18x14y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G18x14y1[0]),
  (VTBL_ENTRY)&_ZN6E18x143fooEv,
};
extern VTBL_ENTRY _ZTV8G18x14y1[];
extern void _ZN6E18x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x14__8G18x14y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x14[0]),
  (VTBL_ENTRY)&_ZN6E18x143fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C186E18x14__8G18x14y1[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x14y1[] = {
  {&(_ZTV8G18x14y1[5]),  5,12},
  {&(_ZTV8G18x14y1[11]),  11,12},
  {&(_tg__ZTV6E18x14__8G18x14y1[4]),  4,5},
  {&(_tg__ZTV3C186E18x14__8G18x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x14y1[];
extern  VTBL_ENTRY _ZTV8G18x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x14y1[];
Class_Descriptor cd_G18x14y1 = {  "G18x14y1", // class name
  bases_G18x14y1, 6,
  &(vtc_G18x14y1[0]), // expected_vtbl_contents
  &(vtt_G18x14y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G18x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x14y1),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x14y1),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  G18x14y2  : E18x14 , virtual F1 {
  int ff;
  ~G18x14y2(); // tgen
  G18x14y2(); // tgen
};
//SIG(1 G18x14y2) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G18x14y2 ::~G18x14y2(){ note_dtor("G18x14y2", this);} // tgen
G18x14y2 ::G18x14y2(){ note_ctor("G18x14y2", this);} // tgen

static void Test_G18x14y2()
{
  extern Class_Descriptor cd_G18x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x14y2, buf);
    G18x14y2 *dp, &lv = *(dp=new (buf) G18x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x14y2)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x14*), ABISELECT(24,20), "G18x14y2");
    check_base_class_offset(lv, (B0*)(C18*)(E18x14*), ABISELECT(8,4), "G18x14y2");
    check_base_class_offset(lv, (C18*)(E18x14*), 0, "G18x14y2");
    check_base_class_offset(lv, (D0*)(E18x14*), ABISELECT(28,24), "G18x14y2");
    check_base_class_offset(lv, (E18x14*), 0, "G18x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G18x14y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G18x14y2.ff");
    test_class_info(&lv, &cd_G18x14y2);
    dp->~G18x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x14y2(Test_G18x14y2, "G18x14y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G18x14y2C1Ev();
extern void _ZN8G18x14y2D1Ev();
Name_Map name_map_G18x14y2[] = {
  NSPAIR(_ZN8G18x14y2C1Ev),
  NSPAIR(_ZN8G18x14y2D1Ev),
  {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_E18x14;
extern VTBL_ENTRY _ZTI6E18x14[];
extern  VTBL_ENTRY _ZTV6E18x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x14y2[] = {
  // 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_E18x14,    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 _ZTI8G18x14y2[];
extern void _ZN6E18x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x14y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x14y2[0]),
  (VTBL_ENTRY)&_ZN6E18x143fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G18x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G18x14y2[];
extern void _ZN6E18x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x14__8G18x14y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x14[0]),
  (VTBL_ENTRY)&_ZN6E18x143fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C186E18x14__8G18x14y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x14y2[] = {
  {&(_ZTV8G18x14y2[5]),  5,10},
  {&(_tg__ZTV6E18x14__8G18x14y2[4]),  4,5},
  {&(_tg__ZTV3C186E18x14__8G18x14y2[3]),  3,4},
  {&(_ZTV8G18x14y2[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G18x14y2[];
extern  VTBL_ENTRY _ZTV8G18x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x14y2[];
Class_Descriptor cd_G18x14y2 = {  "G18x14y2", // class name
  bases_G18x14y2, 6,
  &(vtc_G18x14y2[0]), // expected_vtbl_contents
  &(vtt_G18x14y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G18x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x14y2),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x14y2),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  G18x14y3  : virtual E18x14 , virtual F1 {
  int ff;
  ~G18x14y3(); // tgen
  G18x14y3(); // tgen
};
//SIG(1 G18x14y3) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G18x14y3 ::~G18x14y3(){ note_dtor("G18x14y3", this);} // tgen
G18x14y3 ::G18x14y3(){ note_ctor("G18x14y3", this);} // tgen

static void Test_G18x14y3()
{
  extern Class_Descriptor cd_G18x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G18x14y3, buf);
    G18x14y3 *dp, &lv = *(dp=new (buf) G18x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G18x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x14y3)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x14*), ABISELECT(36,24), "G18x14y3");
    check_base_class_offset(lv, (B0*)(C18*)(E18x14*), ABISELECT(24,12), "G18x14y3");
    check_base_class_offset(lv, (C18*)(E18x14*), ABISELECT(16,8), "G18x14y3");
    check_base_class_offset(lv, (D0*)(E18x14*), ABISELECT(40,28), "G18x14y3");
    check_base_class_offset(lv, (E18x14*), ABISELECT(16,8), "G18x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G18x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G18x14y3.ff");
    test_class_info(&lv, &cd_G18x14y3);
    dp->~G18x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x14y3(Test_G18x14y3, "G18x14y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G18x14y3C1Ev();
extern void _ZN8G18x14y3D1Ev();
Name_Map name_map_G18x14y3[] = {
  NSPAIR(_ZN8G18x14y3C1Ev),
  NSPAIR(_ZN8G18x14y3D1Ev),
  {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_E18x14;
extern VTBL_ENTRY _ZTI6E18x14[];
extern  VTBL_ENTRY _ZTV6E18x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x14y3[] = {
  // 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_E18x14,    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 _ZTI8G18x14y3[];
extern void _ZN6E18x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x14y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x14y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G18x14y3[0]),
  (VTBL_ENTRY)&_ZN6E18x143fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G18x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G18x14y3[];
extern void _ZN6E18x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x14__8G18x14y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x14[0]),
  (VTBL_ENTRY)&_ZN6E18x143fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C186E18x14__8G18x14y3[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x14y3[] = {
  {&(_ZTV8G18x14y3[6]),  6,16},
  {&(_ZTV8G18x14y3[11]),  11,16},
  {&(_ZTV8G18x14y3[15]),  15,16},
  {&(_tg__ZTV6E18x14__8G18x14y3[4]),  4,5},
  {&(_tg__ZTV3C186E18x14__8G18x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x14y3[];
extern  VTBL_ENTRY _ZTV8G18x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x14y3[];
Class_Descriptor cd_G18x14y3 = {  "G18x14y3", // class name
  bases_G18x14y3, 6,
  &(vtc_G18x14y3[0]), // expected_vtbl_contents
  &(vtt_G18x14y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G18x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x14y3),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x14y3),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  G18x14y4  : E18x14 , F0 {
  int ff;
  ~G18x14y4(); // tgen
  G18x14y4(); // tgen
};
//SIG(1 G18x14y4) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G18x14y4 ::~G18x14y4(){ note_dtor("G18x14y4", this);} // tgen
G18x14y4 ::G18x14y4(){ note_ctor("G18x14y4", this);} // tgen

static void Test_G18x14y4()
{
  extern Class_Descriptor cd_G18x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G18x14y4, buf);
    G18x14y4 *dp, &lv = *(dp=new (buf) G18x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G18x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x14y4)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x14*), ABISELECT(28,24), "G18x14y4");
    check_base_class_offset(lv, (B0*)(C18*)(E18x14*), ABISELECT(8,4), "G18x14y4");
    check_base_class_offset(lv, (C18*)(E18x14*), 0, "G18x14y4");
    check_base_class_offset(lv, (D0*)(E18x14*), ABISELECT(32,28), "G18x14y4");
    check_base_class_offset(lv, (E18x14*), 0, "G18x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G18x14y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G18x14y4.ff");
    test_class_info(&lv, &cd_G18x14y4);
    dp->~G18x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x14y4(Test_G18x14y4, "G18x14y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G18x14y4C1Ev();
extern void _ZN8G18x14y4D1Ev();
Name_Map name_map_G18x14y4[] = {
  NSPAIR(_ZN8G18x14y4C1Ev),
  NSPAIR(_ZN8G18x14y4D1Ev),
  {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_E18x14;
extern VTBL_ENTRY _ZTI6E18x14[];
extern  VTBL_ENTRY _ZTV6E18x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x14y4[] = {
  // 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_E18x14,    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 _ZTI8G18x14y4[];
extern void _ZN6E18x143fooEv();
static  VTBL_ENTRY vtc_G18x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x14y4[0]),
  (VTBL_ENTRY)&_ZN6E18x143fooEv,
};
extern VTBL_ENTRY _ZTV8G18x14y4[];
extern void _ZN6E18x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x14__8G18x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x14[0]),
  (VTBL_ENTRY)&_ZN6E18x143fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C186E18x14__8G18x14y4[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x14y4[] = {
  {&(_ZTV8G18x14y4[4]),  4,5},
  {&(_tg__ZTV6E18x14__8G18x14y4[4]),  4,5},
  {&(_tg__ZTV3C186E18x14__8G18x14y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x14y4[];
extern  VTBL_ENTRY _ZTV8G18x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x14y4[];
Class_Descriptor cd_G18x14y4 = {  "G18x14y4", // class name
  bases_G18x14y4, 6,
  &(vtc_G18x14y4[0]), // expected_vtbl_contents
  &(vtt_G18x14y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G18x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x14y4),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x14y4),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  G18x14y5  : virtual E18x14 , F0 {
  int ff;
  ~G18x14y5(); // tgen
  G18x14y5(); // tgen
};
//SIG(1 G18x14y5) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G18x14y5 ::~G18x14y5(){ note_dtor("G18x14y5", this);} // tgen
G18x14y5 ::G18x14y5(){ note_ctor("G18x14y5", this);} // tgen

static void Test_G18x14y5()
{
  extern Class_Descriptor cd_G18x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x14y5, buf);
    G18x14y5 *dp, &lv = *(dp=new (buf) G18x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x14y5)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x14*), ABISELECT(36,28), "G18x14y5");
    check_base_class_offset(lv, (B0*)(C18*)(E18x14*), ABISELECT(24,16), "G18x14y5");
    check_base_class_offset(lv, (C18*)(E18x14*), ABISELECT(16,12), "G18x14y5");
    check_base_class_offset(lv, (D0*)(E18x14*), ABISELECT(40,32), "G18x14y5");
    check_base_class_offset(lv, (E18x14*), ABISELECT(16,12), "G18x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G18x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x14y5.ff");
    test_class_info(&lv, &cd_G18x14y5);
    dp->~G18x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x14y5(Test_G18x14y5, "G18x14y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G18x14y5C1Ev();
extern void _ZN8G18x14y5D1Ev();
Name_Map name_map_G18x14y5[] = {
  NSPAIR(_ZN8G18x14y5C1Ev),
  NSPAIR(_ZN8G18x14y5D1Ev),
  {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_E18x14;
extern VTBL_ENTRY _ZTI6E18x14[];
extern  VTBL_ENTRY _ZTV6E18x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x14y5[] = {
  // 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_E18x14,    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 _ZTI8G18x14y5[];
extern void _ZN6E18x143fooEv();
static  VTBL_ENTRY vtc_G18x14y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x14y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G18x14y5[0]),
  (VTBL_ENTRY)&_ZN6E18x143fooEv,
};
extern VTBL_ENTRY _ZTV8G18x14y5[];
extern void _ZN6E18x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x14__8G18x14y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x14[0]),
  (VTBL_ENTRY)&_ZN6E18x143fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C186E18x14__8G18x14y5[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x14y5[] = {
  {&(_ZTV8G18x14y5[5]),  5,11},
  {&(_ZTV8G18x14y5[10]),  10,11},
  {&(_tg__ZTV6E18x14__8G18x14y5[4]),  4,5},
  {&(_tg__ZTV3C186E18x14__8G18x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x14y5[];
extern  VTBL_ENTRY _ZTV8G18x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x14y5[];
Class_Descriptor cd_G18x14y5 = {  "G18x14y5", // class name
  bases_G18x14y5, 6,
  &(vtc_G18x14y5[0]), // expected_vtbl_contents
  &(vtt_G18x14y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G18x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x14y5),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x14y5),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  G18x14y6  : E18x14 , virtual F0 {
  int ff;
  ~G18x14y6(); // tgen
  G18x14y6(); // tgen
};
//SIG(1 G18x14y6) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G18x14y6 ::~G18x14y6(){ note_dtor("G18x14y6", this);} // tgen
G18x14y6 ::G18x14y6(){ note_ctor("G18x14y6", this);} // tgen

static void Test_G18x14y6()
{
  extern Class_Descriptor cd_G18x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G18x14y6, buf);
    G18x14y6 *dp, &lv = *(dp=new (buf) G18x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G18x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x14y6)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x14*), ABISELECT(24,20), "G18x14y6");
    check_base_class_offset(lv, (B0*)(C18*)(E18x14*), ABISELECT(8,4), "G18x14y6");
    check_base_class_offset(lv, (C18*)(E18x14*), 0, "G18x14y6");
    check_base_class_offset(lv, (D0*)(E18x14*), ABISELECT(28,24), "G18x14y6");
    check_base_class_offset(lv, (E18x14*), 0, "G18x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G18x14y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G18x14y6.ff");
    test_class_info(&lv, &cd_G18x14y6);
    dp->~G18x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x14y6(Test_G18x14y6, "G18x14y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G18x14y6C1Ev();
extern void _ZN8G18x14y6D1Ev();
Name_Map name_map_G18x14y6[] = {
  NSPAIR(_ZN8G18x14y6C1Ev),
  NSPAIR(_ZN8G18x14y6D1Ev),
  {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_E18x14;
extern VTBL_ENTRY _ZTI6E18x14[];
extern  VTBL_ENTRY _ZTV6E18x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x14y6[] = {
  // 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_E18x14,    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 _ZTI8G18x14y6[];
extern void _ZN6E18x143fooEv();
static  VTBL_ENTRY vtc_G18x14y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x14y6[0]),
  (VTBL_ENTRY)&_ZN6E18x143fooEv,
};
extern VTBL_ENTRY _ZTV8G18x14y6[];
extern void _ZN6E18x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x14__8G18x14y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x14[0]),
  (VTBL_ENTRY)&_ZN6E18x143fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C186E18x14__8G18x14y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x14y6[] = {
  {&(_ZTV8G18x14y6[5]),  5,6},
  {&(_tg__ZTV6E18x14__8G18x14y6[4]),  4,5},
  {&(_tg__ZTV3C186E18x14__8G18x14y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x14y6[];
extern  VTBL_ENTRY _ZTV8G18x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x14y6[];
Class_Descriptor cd_G18x14y6 = {  "G18x14y6", // class name
  bases_G18x14y6, 6,
  &(vtc_G18x14y6[0]), // expected_vtbl_contents
  &(vtt_G18x14y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G18x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x14y6),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x14y6),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  G18x14y7  : virtual E18x14 , virtual F0 {
  int ff;
  ~G18x14y7(); // tgen
  G18x14y7(); // tgen
};
//SIG(1 G18x14y7) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G18x14y7 ::~G18x14y7(){ note_dtor("G18x14y7", this);} // tgen
G18x14y7 ::G18x14y7(){ note_ctor("G18x14y7", this);} // tgen

static void Test_G18x14y7()
{
  extern Class_Descriptor cd_G18x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x14y7, buf);
    G18x14y7 *dp, &lv = *(dp=new (buf) G18x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x14y7)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x14*), ABISELECT(36,24), "G18x14y7");
    check_base_class_offset(lv, (B0*)(C18*)(E18x14*), ABISELECT(24,12), "G18x14y7");
    check_base_class_offset(lv, (C18*)(E18x14*), ABISELECT(16,8), "G18x14y7");
    check_base_class_offset(lv, (D0*)(E18x14*), ABISELECT(40,28), "G18x14y7");
    check_base_class_offset(lv, (E18x14*), ABISELECT(16,8), "G18x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G18x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G18x14y7.ff");
    test_class_info(&lv, &cd_G18x14y7);
    dp->~G18x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x14y7(Test_G18x14y7, "G18x14y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G18x14y7C1Ev();
extern void _ZN8G18x14y7D1Ev();
Name_Map name_map_G18x14y7[] = {
  NSPAIR(_ZN8G18x14y7C1Ev),
  NSPAIR(_ZN8G18x14y7D1Ev),
  {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_E18x14;
extern VTBL_ENTRY _ZTI6E18x14[];
extern  VTBL_ENTRY _ZTV6E18x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x14y7[] = {
  // 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_E18x14,    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 _ZTI8G18x14y7[];
extern void _ZN6E18x143fooEv();
static  VTBL_ENTRY vtc_G18x14y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x14y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G18x14y7[0]),
  (VTBL_ENTRY)&_ZN6E18x143fooEv,
};
extern VTBL_ENTRY _ZTV8G18x14y7[];
extern void _ZN6E18x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x14__8G18x14y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x14[0]),
  (VTBL_ENTRY)&_ZN6E18x143fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C186E18x14__8G18x14y7[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x14y7[] = {
  {&(_ZTV8G18x14y7[6]),  6,12},
  {&(_ZTV8G18x14y7[11]),  11,12},
  {&(_tg__ZTV6E18x14__8G18x14y7[4]),  4,5},
  {&(_tg__ZTV3C186E18x14__8G18x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x14y7[];
extern  VTBL_ENTRY _ZTV8G18x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x14y7[];
Class_Descriptor cd_G18x14y7 = {  "G18x14y7", // class name
  bases_G18x14y7, 6,
  &(vtc_G18x14y7[0]), // expected_vtbl_contents
  &(vtt_G18x14y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G18x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x14y7),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x14y7),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  E19x14  : C19 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E19x143fooEv
  ~E19x14(); // tgen
  E19x14(); // tgen
};
//SIG(-1 E19x14) C1{ BC2{ VBC3{ v1 Fi} BC4{ Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E19x14 ::foo(){vfunc_called(this, "_ZN6E19x143fooEv");}
E19x14 ::~E19x14(){ note_dtor("E19x14", this);} // tgen
E19x14 ::E19x14(){ note_ctor("E19x14", this);} // tgen

static void Test_E19x14()
{
  extern Class_Descriptor cd_E19x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E19x14, buf);
    E19x14 *dp, &lv = *(dp=new (buf) E19x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E19x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E19x14)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(24,16), "E19x14");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(8,4), "E19x14");
    check_base_class_offset(lv, (C19*), 0, "E19x14");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E19x14");
    check_field_offset(lv, fd, ABISELECT(16,12), "E19x14.fd");
    test_class_info(&lv, &cd_E19x14);
    dp->~E19x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE19x14(Test_E19x14, "E19x14", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E19x14C1Ev();
extern void _ZN6E19x14D1Ev();
Name_Map name_map_E19x14[] = {
  NSPAIR(_ZN6E19x14C1Ev),
  NSPAIR(_ZN6E19x14D1Ev),
  {0,0}
};
extern Class_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_E19x14[] = {
  // 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 _ZTI6E19x14[];
extern void _ZN6E19x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv)();
extern void ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn16_N6E19x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E19x14[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x14[0]),
  (VTBL_ENTRY)&_ZN6E19x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E19x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv),
};
extern VTBL_ENTRY _ZTV6E19x14[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__6E19x14[] = {
  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__6E19x14[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_E19x14[] = {
  {&(_ZTV6E19x14[4]),  4,9},
  {&(_tg__ZTV3C19__6E19x14[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__6E19x14[3]),  3,4},
  {&(_ZTV6E19x14[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6E19x14[];
extern  VTBL_ENTRY _ZTV6E19x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x14[];
static VTBL_ENTRY alt_thunk_names449[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn16_N6E19x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E19x14 = {  "E19x14", // class name
  bases_E19x14, 4,
  &(vtc_E19x14[0]), // expected_vtbl_contents
  &(vtt_E19x14[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E19x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E19x14),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E19x14),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names449,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x14y0  : E19x14 , F1 {
  int ff;
  ~G19x14y0(); // tgen
  G19x14y0(); // tgen
};
//SIG(1 G19x14y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G19x14y0 ::~G19x14y0(){ note_dtor("G19x14y0", this);} // tgen
G19x14y0 ::G19x14y0(){ note_ctor("G19x14y0", this);} // tgen

static void Test_G19x14y0()
{
  extern Class_Descriptor cd_G19x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x14y0, buf);
    G19x14y0 *dp, &lv = *(dp=new (buf) G19x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x14y0)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x14*), ABISELECT(40,28), "G19x14y0");
    check_base_class_offset(lv, (B0*)(C19*)(E19x14*), ABISELECT(8,4), "G19x14y0");
    check_base_class_offset(lv, (C19*)(E19x14*), 0, "G19x14y0");
    check_base_class_offset(lv, (D0*)(E19x14*), ABISELECT(52,36), "G19x14y0");
    check_base_class_offset(lv, (E19x14*), 0, "G19x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G19x14y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G19x14y0.ff");
    test_class_info(&lv, &cd_G19x14y0);
    dp->~G19x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x14y0(Test_G19x14y0, "G19x14y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G19x14y0C1Ev();
extern void _ZN8G19x14y0D1Ev();
Name_Map name_map_G19x14y0[] = {
  NSPAIR(_ZN8G19x14y0C1Ev),
  NSPAIR(_ZN8G19x14y0D1Ev),
  {0,0}
};
extern Class_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_E19x14;
extern VTBL_ENTRY _ZTI6E19x14[];
extern  VTBL_ENTRY _ZTV6E19x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x14y0[] = {
  // 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_E19x14,    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 _ZTI8G19x14y0[];
extern void _ZN6E19x143fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv)();
extern void ABISELECT(_ZThn40_N6E19x143fooEv,_ZThn28_N6E19x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x14y0[0]),
  (VTBL_ENTRY)&_ZN6E19x143fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G19x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G19x14y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv),
};
extern VTBL_ENTRY _ZTV8G19x14y0[];
extern void _ZN6E19x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x14__8G19x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x14[0]),
  (VTBL_ENTRY)&_ZN6E19x143fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C196E19x14__8G19x14y0[] = {
  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__3C196E19x14__8G19x14y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv)();
extern void ABISELECT(_ZThn40_N6E19x143fooEv,_ZThn28_N6E19x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x14__8G19x14y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E19x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv),
};
static  VTT_ENTRY vtt_G19x14y0[] = {
  {&(_ZTV8G19x14y0[4]),  4,12},
  {&(_tg__ZTV6E19x14__8G19x14y0[4]),  4,5},
  {&(_tg__ZTV3C196E19x14__8G19x14y0[3]),  3,4},
  {&(_tg__ZTV2A1__3C196E19x14__8G19x14y0[3]),  3,4},
  {&(_tg__ZTV2A1__6E19x14__8G19x14y0[3]),  3,4},
  {&(_ZTV8G19x14y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI8G19x14y0[];
extern  VTBL_ENTRY _ZTV8G19x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x14y0[];
static VTBL_ENTRY alt_thunk_names450[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C193fooEv,_ZThn28_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E19x143fooEv,_ZThn28_N6E19x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E19x143fooEv,_ZThn28_N6E19x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x14y0 = {  "G19x14y0", // class name
  bases_G19x14y0, 6,
  &(vtc_G19x14y0[0]), // expected_vtbl_contents
  &(vtt_G19x14y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G19x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x14y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x14y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names450,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x14y1  : virtual E19x14 , F1 {
  int ff;
  ~G19x14y1(); // tgen
  G19x14y1(); // tgen
};
//SIG(1 G19x14y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G19x14y1 ::~G19x14y1(){ note_dtor("G19x14y1", this);} // tgen
G19x14y1 ::G19x14y1(){ note_ctor("G19x14y1", this);} // tgen

static void Test_G19x14y1()
{
  extern Class_Descriptor cd_G19x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x14y1, buf);
    G19x14y1 *dp, &lv = *(dp=new (buf) G19x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x14y1)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x14*), ABISELECT(40,28), "G19x14y1");
    check_base_class_offset(lv, (B0*)(C19*)(E19x14*), ABISELECT(24,16), "G19x14y1");
    check_base_class_offset(lv, (C19*)(E19x14*), ABISELECT(16,12), "G19x14y1");
    check_base_class_offset(lv, (D0*)(E19x14*), ABISELECT(52,36), "G19x14y1");
    check_base_class_offset(lv, (E19x14*), ABISELECT(16,12), "G19x14y1");
    check_base_class_offset(lv, (F1*), 0, "G19x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x14y1.ff");
    test_class_info(&lv, &cd_G19x14y1);
    dp->~G19x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x14y1(Test_G19x14y1, "G19x14y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G19x14y1C1Ev();
extern void _ZN8G19x14y1D1Ev();
Name_Map name_map_G19x14y1[] = {
  NSPAIR(_ZN8G19x14y1C1Ev),
  NSPAIR(_ZN8G19x14y1D1Ev),
  {0,0}
};
extern Class_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_E19x14;
extern VTBL_ENTRY _ZTI6E19x14[];
extern  VTBL_ENTRY _ZTV6E19x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x14y1[] = {
  // 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_E19x14,    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 _ZTI8G19x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E19x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv)();
extern void ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn16_N6E19x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x14y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G19x14y1[0]),
  (VTBL_ENTRY)&_ZN6E19x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G19x14y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv),
};
extern VTBL_ENTRY _ZTV8G19x14y1[];
extern void _ZN6E19x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x14__8G19x14y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x14[0]),
  (VTBL_ENTRY)&_ZN6E19x143fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C196E19x14__8G19x14y1[] = {
  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__3C196E19x14__8G19x14y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv)();
extern void ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn16_N6E19x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x14__8G19x14y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E19x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv),
};
static  VTT_ENTRY vtt_G19x14y1[] = {
  {&(_ZTV8G19x14y1[5]),  5,16},
  {&(_ZTV8G19x14y1[11]),  11,16},
  {&(_ZTV8G19x14y1[15]),  15,16},
  {&(_tg__ZTV6E19x14__8G19x14y1[4]),  4,5},
  {&(_tg__ZTV3C196E19x14__8G19x14y1[3]),  3,4},
  {&(_tg__ZTV2A1__3C196E19x14__8G19x14y1[3]),  3,4},
  {&(_tg__ZTV2A1__6E19x14__8G19x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x14y1[];
extern  VTBL_ENTRY _ZTV8G19x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x14y1[];
static VTBL_ENTRY alt_thunk_names451[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn16_N6E19x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn16_N6E19x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x14y1 = {  "G19x14y1", // class name
  bases_G19x14y1, 6,
  &(vtc_G19x14y1[0]), // expected_vtbl_contents
  &(vtt_G19x14y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G19x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x14y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x14y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names451,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x14y2  : E19x14 , virtual F1 {
  int ff;
  ~G19x14y2(); // tgen
  G19x14y2(); // tgen
};
//SIG(1 G19x14y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G19x14y2 ::~G19x14y2(){ note_dtor("G19x14y2", this);} // tgen
G19x14y2 ::G19x14y2(){ note_ctor("G19x14y2", this);} // tgen

static void Test_G19x14y2()
{
  extern Class_Descriptor cd_G19x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x14y2, buf);
    G19x14y2 *dp, &lv = *(dp=new (buf) G19x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x14y2)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x14*), ABISELECT(24,20), "G19x14y2");
    check_base_class_offset(lv, (B0*)(C19*)(E19x14*), ABISELECT(8,4), "G19x14y2");
    check_base_class_offset(lv, (C19*)(E19x14*), 0, "G19x14y2");
    check_base_class_offset(lv, (D0*)(E19x14*), ABISELECT(36,28), "G19x14y2");
    check_base_class_offset(lv, (E19x14*), 0, "G19x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G19x14y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G19x14y2.ff");
    test_class_info(&lv, &cd_G19x14y2);
    dp->~G19x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x14y2(Test_G19x14y2, "G19x14y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G19x14y2C1Ev();
extern void _ZN8G19x14y2D1Ev();
Name_Map name_map_G19x14y2[] = {
  NSPAIR(_ZN8G19x14y2C1Ev),
  NSPAIR(_ZN8G19x14y2D1Ev),
  {0,0}
};
extern Class_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_E19x14;
extern VTBL_ENTRY _ZTI6E19x14[];
extern  VTBL_ENTRY _ZTV6E19x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x14y2[] = {
  // 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_E19x14,    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 _ZTI8G19x14y2[];
extern void _ZN6E19x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv)();
extern void ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn20_N6E19x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G19x14y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x14y2[0]),
  (VTBL_ENTRY)&_ZN6E19x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G19x14y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G19x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G19x14y2[];
extern void _ZN6E19x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x14__8G19x14y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x14[0]),
  (VTBL_ENTRY)&_ZN6E19x143fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C196E19x14__8G19x14y2[] = {
  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__3C196E19x14__8G19x14y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv)();
extern void ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn20_N6E19x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x14__8G19x14y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E19x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv),
};
static  VTT_ENTRY vtt_G19x14y2[] = {
  {&(_ZTV8G19x14y2[5]),  5,14},
  {&(_tg__ZTV6E19x14__8G19x14y2[4]),  4,5},
  {&(_tg__ZTV3C196E19x14__8G19x14y2[3]),  3,4},
  {&(_tg__ZTV2A1__3C196E19x14__8G19x14y2[3]),  3,4},
  {&(_tg__ZTV2A1__6E19x14__8G19x14y2[3]),  3,4},
  {&(_ZTV8G19x14y2[9]),  9,14},
  {&(_ZTV8G19x14y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI8G19x14y2[];
extern  VTBL_ENTRY _ZTV8G19x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x14y2[];
static VTBL_ENTRY alt_thunk_names452[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn20_N6E19x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn20_N6E19x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x14y2 = {  "G19x14y2", // class name
  bases_G19x14y2, 6,
  &(vtc_G19x14y2[0]), // expected_vtbl_contents
  &(vtt_G19x14y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G19x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x14y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x14y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names452,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x14y3  : virtual E19x14 , virtual F1 {
  int ff;
  ~G19x14y3(); // tgen
  G19x14y3(); // tgen
};
//SIG(1 G19x14y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G19x14y3 ::~G19x14y3(){ note_dtor("G19x14y3", this);} // tgen
G19x14y3 ::G19x14y3(){ note_ctor("G19x14y3", this);} // tgen

static void Test_G19x14y3()
{
  extern Class_Descriptor cd_G19x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G19x14y3, buf);
    G19x14y3 *dp, &lv = *(dp=new (buf) G19x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G19x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x14y3)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x14*), ABISELECT(40,24), "G19x14y3");
    check_base_class_offset(lv, (B0*)(C19*)(E19x14*), ABISELECT(24,12), "G19x14y3");
    check_base_class_offset(lv, (C19*)(E19x14*), ABISELECT(16,8), "G19x14y3");
    check_base_class_offset(lv, (D0*)(E19x14*), ABISELECT(52,32), "G19x14y3");
    check_base_class_offset(lv, (E19x14*), ABISELECT(16,8), "G19x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G19x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G19x14y3.ff");
    test_class_info(&lv, &cd_G19x14y3);
    dp->~G19x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x14y3(Test_G19x14y3, "G19x14y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G19x14y3C1Ev();
extern void _ZN8G19x14y3D1Ev();
Name_Map name_map_G19x14y3[] = {
  NSPAIR(_ZN8G19x14y3C1Ev),
  NSPAIR(_ZN8G19x14y3D1Ev),
  {0,0}
};
extern Class_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_E19x14;
extern VTBL_ENTRY _ZTI6E19x14[];
extern  VTBL_ENTRY _ZTV6E19x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x14y3[] = {
  // 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_E19x14,    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 _ZTI8G19x14y3[];
extern void _ZN6E19x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv)();
extern void ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn16_N6E19x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G19x14y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x14y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G19x14y3[0]),
  (VTBL_ENTRY)&_ZN6E19x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G19x14y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G19x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G19x14y3[];
extern void _ZN6E19x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x14__8G19x14y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x14[0]),
  (VTBL_ENTRY)&_ZN6E19x143fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C196E19x14__8G19x14y3[] = {
  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__3C196E19x14__8G19x14y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv)();
extern void ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn16_N6E19x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x14__8G19x14y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E19x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv),
};
static  VTT_ENTRY vtt_G19x14y3[] = {
  {&(_ZTV8G19x14y3[6]),  6,20},
  {&(_ZTV8G19x14y3[11]),  11,20},
  {&(_ZTV8G19x14y3[15]),  15,20},
  {&(_ZTV8G19x14y3[19]),  19,20},
  {&(_tg__ZTV6E19x14__8G19x14y3[4]),  4,5},
  {&(_tg__ZTV3C196E19x14__8G19x14y3[3]),  3,4},
  {&(_tg__ZTV2A1__3C196E19x14__8G19x14y3[3]),  3,4},
  {&(_tg__ZTV2A1__6E19x14__8G19x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x14y3[];
extern  VTBL_ENTRY _ZTV8G19x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x14y3[];
static VTBL_ENTRY alt_thunk_names453[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn16_N6E19x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn16_N6E19x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x14y3 = {  "G19x14y3", // class name
  bases_G19x14y3, 6,
  &(vtc_G19x14y3[0]), // expected_vtbl_contents
  &(vtt_G19x14y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G19x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x14y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x14y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names453,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x14y4  : E19x14 , F0 {
  int ff;
  ~G19x14y4(); // tgen
  G19x14y4(); // tgen
};
//SIG(1 G19x14y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G19x14y4 ::~G19x14y4(){ note_dtor("G19x14y4", this);} // tgen
G19x14y4 ::G19x14y4(){ note_ctor("G19x14y4", this);} // tgen

static void Test_G19x14y4()
{
  extern Class_Descriptor cd_G19x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G19x14y4, buf);
    G19x14y4 *dp, &lv = *(dp=new (buf) G19x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G19x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x14y4)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x14*), ABISELECT(32,24), "G19x14y4");
    check_base_class_offset(lv, (B0*)(C19*)(E19x14*), ABISELECT(8,4), "G19x14y4");
    check_base_class_offset(lv, (C19*)(E19x14*), 0, "G19x14y4");
    check_base_class_offset(lv, (D0*)(E19x14*), ABISELECT(44,32), "G19x14y4");
    check_base_class_offset(lv, (E19x14*), 0, "G19x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G19x14y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G19x14y4.ff");
    test_class_info(&lv, &cd_G19x14y4);
    dp->~G19x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x14y4(Test_G19x14y4, "G19x14y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G19x14y4C1Ev();
extern void _ZN8G19x14y4D1Ev();
Name_Map name_map_G19x14y4[] = {
  NSPAIR(_ZN8G19x14y4C1Ev),
  NSPAIR(_ZN8G19x14y4D1Ev),
  {0,0}
};
extern Class_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_E19x14;
extern VTBL_ENTRY _ZTI6E19x14[];
extern  VTBL_ENTRY _ZTV6E19x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x14y4[] = {
  // 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_E19x14,    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 _ZTI8G19x14y4[];
extern void _ZN6E19x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv)();
extern void ABISELECT(_ZThn32_N6E19x143fooEv,_ZThn24_N6E19x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x14y4[0]),
  (VTBL_ENTRY)&_ZN6E19x143fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G19x14y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv),
};
extern VTBL_ENTRY _ZTV8G19x14y4[];
extern void _ZN6E19x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x14__8G19x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x14[0]),
  (VTBL_ENTRY)&_ZN6E19x143fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C196E19x14__8G19x14y4[] = {
  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__3C196E19x14__8G19x14y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv)();
extern void ABISELECT(_ZThn32_N6E19x143fooEv,_ZThn24_N6E19x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x14__8G19x14y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E19x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv),
};
static  VTT_ENTRY vtt_G19x14y4[] = {
  {&(_ZTV8G19x14y4[4]),  4,9},
  {&(_tg__ZTV6E19x14__8G19x14y4[4]),  4,5},
  {&(_tg__ZTV3C196E19x14__8G19x14y4[3]),  3,4},
  {&(_tg__ZTV2A1__3C196E19x14__8G19x14y4[3]),  3,4},
  {&(_tg__ZTV2A1__6E19x14__8G19x14y4[3]),  3,4},
  {&(_ZTV8G19x14y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G19x14y4[];
extern  VTBL_ENTRY _ZTV8G19x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x14y4[];
static VTBL_ENTRY alt_thunk_names454[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x143fooEv,_ZThn24_N6E19x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x143fooEv,_ZThn24_N6E19x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x14y4 = {  "G19x14y4", // class name
  bases_G19x14y4, 6,
  &(vtc_G19x14y4[0]), // expected_vtbl_contents
  &(vtt_G19x14y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G19x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x14y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x14y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names454,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x14y5  : virtual E19x14 , F0 {
  int ff;
  ~G19x14y5(); // tgen
  G19x14y5(); // tgen
};
//SIG(1 G19x14y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G19x14y5 ::~G19x14y5(){ note_dtor("G19x14y5", this);} // tgen
G19x14y5 ::G19x14y5(){ note_ctor("G19x14y5", this);} // tgen

static void Test_G19x14y5()
{
  extern Class_Descriptor cd_G19x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x14y5, buf);
    G19x14y5 *dp, &lv = *(dp=new (buf) G19x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x14y5)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x14*), ABISELECT(40,28), "G19x14y5");
    check_base_class_offset(lv, (B0*)(C19*)(E19x14*), ABISELECT(24,16), "G19x14y5");
    check_base_class_offset(lv, (C19*)(E19x14*), ABISELECT(16,12), "G19x14y5");
    check_base_class_offset(lv, (D0*)(E19x14*), ABISELECT(52,36), "G19x14y5");
    check_base_class_offset(lv, (E19x14*), ABISELECT(16,12), "G19x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G19x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x14y5.ff");
    test_class_info(&lv, &cd_G19x14y5);
    dp->~G19x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x14y5(Test_G19x14y5, "G19x14y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G19x14y5C1Ev();
extern void _ZN8G19x14y5D1Ev();
Name_Map name_map_G19x14y5[] = {
  NSPAIR(_ZN8G19x14y5C1Ev),
  NSPAIR(_ZN8G19x14y5D1Ev),
  {0,0}
};
extern Class_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_E19x14;
extern VTBL_ENTRY _ZTI6E19x14[];
extern  VTBL_ENTRY _ZTV6E19x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x14y5[] = {
  // 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_E19x14,    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 _ZTI8G19x14y5[];
extern void _ZN6E19x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv)();
extern void ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn16_N6E19x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x14y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x14y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G19x14y5[0]),
  (VTBL_ENTRY)&_ZN6E19x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G19x14y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv),
};
extern VTBL_ENTRY _ZTV8G19x14y5[];
extern void _ZN6E19x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x14__8G19x14y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x14[0]),
  (VTBL_ENTRY)&_ZN6E19x143fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C196E19x14__8G19x14y5[] = {
  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__3C196E19x14__8G19x14y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv)();
extern void ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn16_N6E19x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x14__8G19x14y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E19x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv),
};
static  VTT_ENTRY vtt_G19x14y5[] = {
  {&(_ZTV8G19x14y5[5]),  5,15},
  {&(_ZTV8G19x14y5[10]),  10,15},
  {&(_ZTV8G19x14y5[14]),  14,15},
  {&(_tg__ZTV6E19x14__8G19x14y5[4]),  4,5},
  {&(_tg__ZTV3C196E19x14__8G19x14y5[3]),  3,4},
  {&(_tg__ZTV2A1__3C196E19x14__8G19x14y5[3]),  3,4},
  {&(_tg__ZTV2A1__6E19x14__8G19x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x14y5[];
extern  VTBL_ENTRY _ZTV8G19x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x14y5[];
static VTBL_ENTRY alt_thunk_names455[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn16_N6E19x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn16_N6E19x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x14y5 = {  "G19x14y5", // class name
  bases_G19x14y5, 6,
  &(vtc_G19x14y5[0]), // expected_vtbl_contents
  &(vtt_G19x14y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G19x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x14y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x14y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names455,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x14y6  : E19x14 , virtual F0 {
  int ff;
  ~G19x14y6(); // tgen
  G19x14y6(); // tgen
};
//SIG(1 G19x14y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G19x14y6 ::~G19x14y6(){ note_dtor("G19x14y6", this);} // tgen
G19x14y6 ::G19x14y6(){ note_ctor("G19x14y6", this);} // tgen

static void Test_G19x14y6()
{
  extern Class_Descriptor cd_G19x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G19x14y6, buf);
    G19x14y6 *dp, &lv = *(dp=new (buf) G19x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G19x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x14y6)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x14*), ABISELECT(24,20), "G19x14y6");
    check_base_class_offset(lv, (B0*)(C19*)(E19x14*), ABISELECT(8,4), "G19x14y6");
    check_base_class_offset(lv, (C19*)(E19x14*), 0, "G19x14y6");
    check_base_class_offset(lv, (D0*)(E19x14*), ABISELECT(36,28), "G19x14y6");
    check_base_class_offset(lv, (E19x14*), 0, "G19x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G19x14y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G19x14y6.ff");
    test_class_info(&lv, &cd_G19x14y6);
    dp->~G19x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x14y6(Test_G19x14y6, "G19x14y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G19x14y6C1Ev();
extern void _ZN8G19x14y6D1Ev();
Name_Map name_map_G19x14y6[] = {
  NSPAIR(_ZN8G19x14y6C1Ev),
  NSPAIR(_ZN8G19x14y6D1Ev),
  {0,0}
};
extern Class_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_E19x14;
extern VTBL_ENTRY _ZTI6E19x14[];
extern  VTBL_ENTRY _ZTV6E19x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x14y6[] = {
  // 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_E19x14,    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 _ZTI8G19x14y6[];
extern void _ZN6E19x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv)();
extern void ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn20_N6E19x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x14y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x14y6[0]),
  (VTBL_ENTRY)&_ZN6E19x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G19x14y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv),
};
extern VTBL_ENTRY _ZTV8G19x14y6[];
extern void _ZN6E19x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x14__8G19x14y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x14[0]),
  (VTBL_ENTRY)&_ZN6E19x143fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C196E19x14__8G19x14y6[] = {
  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__3C196E19x14__8G19x14y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv)();
extern void ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn20_N6E19x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x14__8G19x14y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E19x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv),
};
static  VTT_ENTRY vtt_G19x14y6[] = {
  {&(_ZTV8G19x14y6[5]),  5,10},
  {&(_tg__ZTV6E19x14__8G19x14y6[4]),  4,5},
  {&(_tg__ZTV3C196E19x14__8G19x14y6[3]),  3,4},
  {&(_tg__ZTV2A1__3C196E19x14__8G19x14y6[3]),  3,4},
  {&(_tg__ZTV2A1__6E19x14__8G19x14y6[3]),  3,4},
  {&(_ZTV8G19x14y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G19x14y6[];
extern  VTBL_ENTRY _ZTV8G19x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x14y6[];
static VTBL_ENTRY alt_thunk_names456[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn20_N6E19x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn20_N6E19x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x14y6 = {  "G19x14y6", // class name
  bases_G19x14y6, 6,
  &(vtc_G19x14y6[0]), // expected_vtbl_contents
  &(vtt_G19x14y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G19x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x14y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x14y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names456,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x14y7  : virtual E19x14 , virtual F0 {
  int ff;
  ~G19x14y7(); // tgen
  G19x14y7(); // tgen
};
//SIG(1 G19x14y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G19x14y7 ::~G19x14y7(){ note_dtor("G19x14y7", this);} // tgen
G19x14y7 ::G19x14y7(){ note_ctor("G19x14y7", this);} // tgen

static void Test_G19x14y7()
{
  extern Class_Descriptor cd_G19x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G19x14y7, buf);
    G19x14y7 *dp, &lv = *(dp=new (buf) G19x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G19x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x14y7)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x14*), ABISELECT(40,24), "G19x14y7");
    check_base_class_offset(lv, (B0*)(C19*)(E19x14*), ABISELECT(24,12), "G19x14y7");
    check_base_class_offset(lv, (C19*)(E19x14*), ABISELECT(16,8), "G19x14y7");
    check_base_class_offset(lv, (D0*)(E19x14*), ABISELECT(52,32), "G19x14y7");
    check_base_class_offset(lv, (E19x14*), ABISELECT(16,8), "G19x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G19x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G19x14y7.ff");
    test_class_info(&lv, &cd_G19x14y7);
    dp->~G19x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x14y7(Test_G19x14y7, "G19x14y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G19x14y7C1Ev();
extern void _ZN8G19x14y7D1Ev();
Name_Map name_map_G19x14y7[] = {
  NSPAIR(_ZN8G19x14y7C1Ev),
  NSPAIR(_ZN8G19x14y7D1Ev),
  {0,0}
};
extern Class_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_E19x14;
extern VTBL_ENTRY _ZTI6E19x14[];
extern  VTBL_ENTRY _ZTV6E19x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x14y7[] = {
  // 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_E19x14,    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 _ZTI8G19x14y7[];
extern void _ZN6E19x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv)();
extern void ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn16_N6E19x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x14y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x14y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G19x14y7[0]),
  (VTBL_ENTRY)&_ZN6E19x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G19x14y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv),
};
extern VTBL_ENTRY _ZTV8G19x14y7[];
extern void _ZN6E19x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x14__8G19x14y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x14[0]),
  (VTBL_ENTRY)&_ZN6E19x143fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C196E19x14__8G19x14y7[] = {
  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__3C196E19x14__8G19x14y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv)();
extern void ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn16_N6E19x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x14__8G19x14y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E19x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv),
};
static  VTT_ENTRY vtt_G19x14y7[] = {
  {&(_ZTV8G19x14y7[6]),  6,16},
  {&(_ZTV8G19x14y7[11]),  11,16},
  {&(_ZTV8G19x14y7[15]),  15,16},
  {&(_tg__ZTV6E19x14__8G19x14y7[4]),  4,5},
  {&(_tg__ZTV3C196E19x14__8G19x14y7[3]),  3,4},
  {&(_tg__ZTV2A1__3C196E19x14__8G19x14y7[3]),  3,4},
  {&(_tg__ZTV2A1__6E19x14__8G19x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x14y7[];
extern  VTBL_ENTRY _ZTV8G19x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x14y7[];
static VTBL_ENTRY alt_thunk_names457[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x143fooEv,_ZTv0_n12_N6E19x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn16_N6E19x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x143fooEv,_ZThn16_N6E19x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x14y7 = {  "G19x14y7", // class name
  bases_G19x14y7, 6,
  &(vtc_G19x14y7[0]), // expected_vtbl_contents
  &(vtt_G19x14y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G19x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x14y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x14y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names457,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E20x14  : C20 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E20x143fooEv
  ~E20x14(); // tgen
  E20x14(); // tgen
};
//SIG(-1 E20x14) C1{ BC2{ BC3{ Fi} BC4{ v1 Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E20x14 ::foo(){vfunc_called(this, "_ZN6E20x143fooEv");}
E20x14 ::~E20x14(){ note_dtor("E20x14", this);} // tgen
E20x14 ::E20x14(){ note_ctor("E20x14", this);} // tgen

static void Test_E20x14()
{
  extern Class_Descriptor cd_E20x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E20x14, buf);
    E20x14 *dp, &lv = *(dp=new (buf) E20x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E20x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E20x14)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(12,8), "E20x14");
    check_base_class_offset(lv, (B1*)(C20*), 0, "E20x14");
    check_base_class_offset(lv, (C20*), 0, "E20x14");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E20x14");
    check_field_offset(lv, fd, ABISELECT(20,16), "E20x14.fd");
    test_class_info(&lv, &cd_E20x14);
    dp->~E20x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE20x14(Test_E20x14, "E20x14", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6E20x14C1Ev();
extern void _ZN6E20x14D1Ev();
Name_Map name_map_E20x14[] = {
  NSPAIR(_ZN6E20x14C1Ev),
  NSPAIR(_ZN6E20x14D1Ev),
  {0,0}
};
extern Class_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_E20x14[] = {
  // 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 _ZTI6E20x14[];
extern void _ZN6E20x143fooEv();
static  VTBL_ENTRY vtc_E20x14[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x14[0]),
  (VTBL_ENTRY)&_ZN6E20x143fooEv,
};
extern VTBL_ENTRY _ZTV6E20x14[];
static  VTT_ENTRY vtt_E20x14[] = {
  {&(_ZTV6E20x14[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E20x14[];
extern  VTBL_ENTRY _ZTV6E20x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x14[];
Class_Descriptor cd_E20x14 = {  "E20x14", // class name
  bases_E20x14, 4,
  &(vtc_E20x14[0]), // expected_vtbl_contents
  &(vtt_E20x14[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6E20x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E20x14),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E20x14),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  G20x14y0  : E20x14 , F1 {
  int ff;
  ~G20x14y0(); // tgen
  G20x14y0(); // tgen
};
//SIG(1 G20x14y0) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G20x14y0 ::~G20x14y0(){ note_dtor("G20x14y0", this);} // tgen
G20x14y0 ::G20x14y0(){ note_ctor("G20x14y0", this);} // tgen

static void Test_G20x14y0()
{
  extern Class_Descriptor cd_G20x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x14y0, buf);
    G20x14y0 *dp, &lv = *(dp=new (buf) G20x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x14y0)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x14*), ABISELECT(12,8), "G20x14y0");
    check_base_class_offset(lv, (B1*)(C20*)(E20x14*), 0, "G20x14y0");
    check_base_class_offset(lv, (C20*)(E20x14*), 0, "G20x14y0");
    check_base_class_offset(lv, (D0*)(E20x14*), ABISELECT(40,32), "G20x14y0");
    check_base_class_offset(lv, (E20x14*), 0, "G20x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G20x14y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G20x14y0.ff");
    test_class_info(&lv, &cd_G20x14y0);
    dp->~G20x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x14y0(Test_G20x14y0, "G20x14y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G20x14y0C1Ev();
extern void _ZN8G20x14y0D1Ev();
Name_Map name_map_G20x14y0[] = {
  NSPAIR(_ZN8G20x14y0C1Ev),
  NSPAIR(_ZN8G20x14y0D1Ev),
  {0,0}
};
extern Class_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_E20x14;
extern VTBL_ENTRY _ZTI6E20x14[];
extern  VTBL_ENTRY _ZTV6E20x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x14y0[] = {
  // 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_E20x14,    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 _ZTI8G20x14y0[];
extern void _ZN6E20x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x14y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x14y0[0]),
  (VTBL_ENTRY)&_ZN6E20x143fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G20x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G20x14y0[];
extern void _ZN6E20x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x14__8G20x14y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x14[0]),
  (VTBL_ENTRY)&_ZN6E20x143fooEv,
};
static  VTT_ENTRY vtt_G20x14y0[] = {
  {&(_ZTV8G20x14y0[3]),  3,7},
  {&(_tg__ZTV6E20x14__8G20x14y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G20x14y0[];
extern  VTBL_ENTRY _ZTV8G20x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x14y0[];
Class_Descriptor cd_G20x14y0 = {  "G20x14y0", // class name
  bases_G20x14y0, 6,
  &(vtc_G20x14y0[0]), // expected_vtbl_contents
  &(vtt_G20x14y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G20x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x14y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x14y0),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  G20x14y1  : virtual E20x14 , F1 {
  int ff;
  ~G20x14y1(); // tgen
  G20x14y1(); // tgen
};
//SIG(1 G20x14y1) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G20x14y1 ::~G20x14y1(){ note_dtor("G20x14y1", this);} // tgen
G20x14y1 ::G20x14y1(){ note_ctor("G20x14y1", this);} // tgen

static void Test_G20x14y1()
{
  extern Class_Descriptor cd_G20x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x14y1, buf);
    G20x14y1 *dp, &lv = *(dp=new (buf) G20x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x14y1)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x14*), ABISELECT(28,20), "G20x14y1");
    check_base_class_offset(lv, (B1*)(C20*)(E20x14*), ABISELECT(16,12), "G20x14y1");
    check_base_class_offset(lv, (C20*)(E20x14*), ABISELECT(16,12), "G20x14y1");
    check_base_class_offset(lv, (D0*)(E20x14*), ABISELECT(40,32), "G20x14y1");
    check_base_class_offset(lv, (E20x14*), ABISELECT(16,12), "G20x14y1");
    check_base_class_offset(lv, (F1*), 0, "G20x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x14y1.ff");
    test_class_info(&lv, &cd_G20x14y1);
    dp->~G20x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x14y1(Test_G20x14y1, "G20x14y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G20x14y1C1Ev();
extern void _ZN8G20x14y1D1Ev();
Name_Map name_map_G20x14y1[] = {
  NSPAIR(_ZN8G20x14y1C1Ev),
  NSPAIR(_ZN8G20x14y1D1Ev),
  {0,0}
};
extern Class_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_E20x14;
extern VTBL_ENTRY _ZTI6E20x14[];
extern  VTBL_ENTRY _ZTV6E20x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x14y1[] = {
  // 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_E20x14,    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 _ZTI8G20x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E20x143fooEv();
static  VTBL_ENTRY vtc_G20x14y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G20x14y1[0]),
  (VTBL_ENTRY)&_ZN6E20x143fooEv,
};
extern VTBL_ENTRY _ZTV8G20x14y1[];
extern void _ZN6E20x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x14__8G20x14y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x14[0]),
  (VTBL_ENTRY)&_ZN6E20x143fooEv,
};
static  VTT_ENTRY vtt_G20x14y1[] = {
  {&(_ZTV8G20x14y1[4]),  4,10},
  {&(_ZTV8G20x14y1[9]),  9,10},
  {&(_tg__ZTV6E20x14__8G20x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G20x14y1[];
extern  VTBL_ENTRY _ZTV8G20x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x14y1[];
Class_Descriptor cd_G20x14y1 = {  "G20x14y1", // class name
  bases_G20x14y1, 6,
  &(vtc_G20x14y1[0]), // expected_vtbl_contents
  &(vtt_G20x14y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G20x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x14y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x14y1),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  G20x14y2  : E20x14 , virtual F1 {
  int ff;
  ~G20x14y2(); // tgen
  G20x14y2(); // tgen
};
//SIG(1 G20x14y2) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G20x14y2 ::~G20x14y2(){ note_dtor("G20x14y2", this);} // tgen
G20x14y2 ::G20x14y2(){ note_ctor("G20x14y2", this);} // tgen

static void Test_G20x14y2()
{
  extern Class_Descriptor cd_G20x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x14y2, buf);
    G20x14y2 *dp, &lv = *(dp=new (buf) G20x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x14y2)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x14*), ABISELECT(12,8), "G20x14y2");
    check_base_class_offset(lv, (B1*)(C20*)(E20x14*), 0, "G20x14y2");
    check_base_class_offset(lv, (C20*)(E20x14*), 0, "G20x14y2");
    check_base_class_offset(lv, (D0*)(E20x14*), ABISELECT(28,24), "G20x14y2");
    check_base_class_offset(lv, (E20x14*), 0, "G20x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G20x14y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G20x14y2.ff");
    test_class_info(&lv, &cd_G20x14y2);
    dp->~G20x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x14y2(Test_G20x14y2, "G20x14y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G20x14y2C1Ev();
extern void _ZN8G20x14y2D1Ev();
Name_Map name_map_G20x14y2[] = {
  NSPAIR(_ZN8G20x14y2C1Ev),
  NSPAIR(_ZN8G20x14y2D1Ev),
  {0,0}
};
extern Class_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_E20x14;
extern VTBL_ENTRY _ZTI6E20x14[];
extern  VTBL_ENTRY _ZTV6E20x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x14y2[] = {
  // 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_E20x14,    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 _ZTI8G20x14y2[];
extern void _ZN6E20x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x14y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x14y2[0]),
  (VTBL_ENTRY)&_ZN6E20x143fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G20x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G20x14y2[];
extern void _ZN6E20x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x14__8G20x14y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x14[0]),
  (VTBL_ENTRY)&_ZN6E20x143fooEv,
};
static  VTT_ENTRY vtt_G20x14y2[] = {
  {&(_ZTV8G20x14y2[4]),  4,9},
  {&(_tg__ZTV6E20x14__8G20x14y2[3]),  3,4},
  {&(_ZTV8G20x14y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G20x14y2[];
extern  VTBL_ENTRY _ZTV8G20x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x14y2[];
Class_Descriptor cd_G20x14y2 = {  "G20x14y2", // class name
  bases_G20x14y2, 6,
  &(vtc_G20x14y2[0]), // expected_vtbl_contents
  &(vtt_G20x14y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G20x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x14y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x14y2),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  G20x14y3  : virtual E20x14 , virtual F1 {
  int ff;
  ~G20x14y3(); // tgen
  G20x14y3(); // tgen
};
//SIG(1 G20x14y3) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G20x14y3 ::~G20x14y3(){ note_dtor("G20x14y3", this);} // tgen
G20x14y3 ::G20x14y3(){ note_ctor("G20x14y3", this);} // tgen

static void Test_G20x14y3()
{
  extern Class_Descriptor cd_G20x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G20x14y3, buf);
    G20x14y3 *dp, &lv = *(dp=new (buf) G20x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G20x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x14y3)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x14*), ABISELECT(28,16), "G20x14y3");
    check_base_class_offset(lv, (B1*)(C20*)(E20x14*), ABISELECT(16,8), "G20x14y3");
    check_base_class_offset(lv, (C20*)(E20x14*), ABISELECT(16,8), "G20x14y3");
    check_base_class_offset(lv, (D0*)(E20x14*), ABISELECT(40,28), "G20x14y3");
    check_base_class_offset(lv, (E20x14*), ABISELECT(16,8), "G20x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G20x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G20x14y3.ff");
    test_class_info(&lv, &cd_G20x14y3);
    dp->~G20x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x14y3(Test_G20x14y3, "G20x14y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G20x14y3C1Ev();
extern void _ZN8G20x14y3D1Ev();
Name_Map name_map_G20x14y3[] = {
  NSPAIR(_ZN8G20x14y3C1Ev),
  NSPAIR(_ZN8G20x14y3D1Ev),
  {0,0}
};
extern Class_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_E20x14;
extern VTBL_ENTRY _ZTI6E20x14[];
extern  VTBL_ENTRY _ZTV6E20x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x14y3[] = {
  // 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_E20x14,    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 _ZTI8G20x14y3[];
extern void _ZN6E20x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x14y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x14y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G20x14y3[0]),
  (VTBL_ENTRY)&_ZN6E20x143fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G20x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G20x14y3[];
extern void _ZN6E20x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x14__8G20x14y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x14[0]),
  (VTBL_ENTRY)&_ZN6E20x143fooEv,
};
static  VTT_ENTRY vtt_G20x14y3[] = {
  {&(_ZTV8G20x14y3[5]),  5,14},
  {&(_ZTV8G20x14y3[9]),  9,14},
  {&(_ZTV8G20x14y3[13]),  13,14},
  {&(_tg__ZTV6E20x14__8G20x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G20x14y3[];
extern  VTBL_ENTRY _ZTV8G20x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x14y3[];
Class_Descriptor cd_G20x14y3 = {  "G20x14y3", // class name
  bases_G20x14y3, 6,
  &(vtc_G20x14y3[0]), // expected_vtbl_contents
  &(vtt_G20x14y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G20x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x14y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x14y3),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  G20x14y4  : E20x14 , F0 {
  int ff;
  ~G20x14y4(); // tgen
  G20x14y4(); // tgen
};
//SIG(1 G20x14y4) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G20x14y4 ::~G20x14y4(){ note_dtor("G20x14y4", this);} // tgen
G20x14y4 ::G20x14y4(){ note_ctor("G20x14y4", this);} // tgen

static void Test_G20x14y4()
{
  extern Class_Descriptor cd_G20x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G20x14y4, buf);
    G20x14y4 *dp, &lv = *(dp=new (buf) G20x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G20x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x14y4)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x14*), ABISELECT(12,8), "G20x14y4");
    check_base_class_offset(lv, (B1*)(C20*)(E20x14*), 0, "G20x14y4");
    check_base_class_offset(lv, (C20*)(E20x14*), 0, "G20x14y4");
    check_base_class_offset(lv, (D0*)(E20x14*), ABISELECT(32,28), "G20x14y4");
    check_base_class_offset(lv, (E20x14*), 0, "G20x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G20x14y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G20x14y4.ff");
    test_class_info(&lv, &cd_G20x14y4);
    dp->~G20x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x14y4(Test_G20x14y4, "G20x14y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G20x14y4C1Ev();
extern void _ZN8G20x14y4D1Ev();
Name_Map name_map_G20x14y4[] = {
  NSPAIR(_ZN8G20x14y4C1Ev),
  NSPAIR(_ZN8G20x14y4D1Ev),
  {0,0}
};
extern Class_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_E20x14;
extern VTBL_ENTRY _ZTI6E20x14[];
extern  VTBL_ENTRY _ZTV6E20x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x14y4[] = {
  // 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_E20x14,    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 _ZTI8G20x14y4[];
extern void _ZN6E20x143fooEv();
static  VTBL_ENTRY vtc_G20x14y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x14y4[0]),
  (VTBL_ENTRY)&_ZN6E20x143fooEv,
};
extern VTBL_ENTRY _ZTV8G20x14y4[];
extern void _ZN6E20x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x14__8G20x14y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x14[0]),
  (VTBL_ENTRY)&_ZN6E20x143fooEv,
};
static  VTT_ENTRY vtt_G20x14y4[] = {
  {&(_ZTV8G20x14y4[3]),  3,4},
  {&(_tg__ZTV6E20x14__8G20x14y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G20x14y4[];
extern  VTBL_ENTRY _ZTV8G20x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x14y4[];
Class_Descriptor cd_G20x14y4 = {  "G20x14y4", // class name
  bases_G20x14y4, 6,
  &(vtc_G20x14y4[0]), // expected_vtbl_contents
  &(vtt_G20x14y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G20x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x14y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x14y4),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  G20x14y5  : virtual E20x14 , F0 {
  int ff;
  ~G20x14y5(); // tgen
  G20x14y5(); // tgen
};
//SIG(1 G20x14y5) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G20x14y5 ::~G20x14y5(){ note_dtor("G20x14y5", this);} // tgen
G20x14y5 ::G20x14y5(){ note_ctor("G20x14y5", this);} // tgen

static void Test_G20x14y5()
{
  extern Class_Descriptor cd_G20x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x14y5, buf);
    G20x14y5 *dp, &lv = *(dp=new (buf) G20x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x14y5)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x14*), ABISELECT(28,20), "G20x14y5");
    check_base_class_offset(lv, (B1*)(C20*)(E20x14*), ABISELECT(16,12), "G20x14y5");
    check_base_class_offset(lv, (C20*)(E20x14*), ABISELECT(16,12), "G20x14y5");
    check_base_class_offset(lv, (D0*)(E20x14*), ABISELECT(40,32), "G20x14y5");
    check_base_class_offset(lv, (E20x14*), ABISELECT(16,12), "G20x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G20x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x14y5.ff");
    test_class_info(&lv, &cd_G20x14y5);
    dp->~G20x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x14y5(Test_G20x14y5, "G20x14y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G20x14y5C1Ev();
extern void _ZN8G20x14y5D1Ev();
Name_Map name_map_G20x14y5[] = {
  NSPAIR(_ZN8G20x14y5C1Ev),
  NSPAIR(_ZN8G20x14y5D1Ev),
  {0,0}
};
extern Class_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_E20x14;
extern VTBL_ENTRY _ZTI6E20x14[];
extern  VTBL_ENTRY _ZTV6E20x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x14y5[] = {
  // 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_E20x14,    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 _ZTI8G20x14y5[];
extern void _ZN6E20x143fooEv();
static  VTBL_ENTRY vtc_G20x14y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x14y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G20x14y5[0]),
  (VTBL_ENTRY)&_ZN6E20x143fooEv,
};
extern VTBL_ENTRY _ZTV8G20x14y5[];
extern void _ZN6E20x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x14__8G20x14y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x14[0]),
  (VTBL_ENTRY)&_ZN6E20x143fooEv,
};
static  VTT_ENTRY vtt_G20x14y5[] = {
  {&(_ZTV8G20x14y5[4]),  4,9},
  {&(_ZTV8G20x14y5[8]),  8,9},
  {&(_tg__ZTV6E20x14__8G20x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G20x14y5[];
extern  VTBL_ENTRY _ZTV8G20x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x14y5[];
Class_Descriptor cd_G20x14y5 = {  "G20x14y5", // class name
  bases_G20x14y5, 6,
  &(vtc_G20x14y5[0]), // expected_vtbl_contents
  &(vtt_G20x14y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G20x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x14y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x14y5),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  G20x14y6  : E20x14 , virtual F0 {
  int ff;
  ~G20x14y6(); // tgen
  G20x14y6(); // tgen
};
//SIG(1 G20x14y6) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G20x14y6 ::~G20x14y6(){ note_dtor("G20x14y6", this);} // tgen
G20x14y6 ::G20x14y6(){ note_ctor("G20x14y6", this);} // tgen

static void Test_G20x14y6()
{
  extern Class_Descriptor cd_G20x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G20x14y6, buf);
    G20x14y6 *dp, &lv = *(dp=new (buf) G20x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G20x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x14y6)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x14*), ABISELECT(12,8), "G20x14y6");
    check_base_class_offset(lv, (B1*)(C20*)(E20x14*), 0, "G20x14y6");
    check_base_class_offset(lv, (C20*)(E20x14*), 0, "G20x14y6");
    check_base_class_offset(lv, (D0*)(E20x14*), ABISELECT(28,24), "G20x14y6");
    check_base_class_offset(lv, (E20x14*), 0, "G20x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G20x14y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G20x14y6.ff");
    test_class_info(&lv, &cd_G20x14y6);
    dp->~G20x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x14y6(Test_G20x14y6, "G20x14y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G20x14y6C1Ev();
extern void _ZN8G20x14y6D1Ev();
Name_Map name_map_G20x14y6[] = {
  NSPAIR(_ZN8G20x14y6C1Ev),
  NSPAIR(_ZN8G20x14y6D1Ev),
  {0,0}
};
extern Class_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_E20x14;
extern VTBL_ENTRY _ZTI6E20x14[];
extern  VTBL_ENTRY _ZTV6E20x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x14y6[] = {
  // 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_E20x14,    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 _ZTI8G20x14y6[];
extern void _ZN6E20x143fooEv();
static  VTBL_ENTRY vtc_G20x14y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x14y6[0]),
  (VTBL_ENTRY)&_ZN6E20x143fooEv,
};
extern VTBL_ENTRY _ZTV8G20x14y6[];
extern void _ZN6E20x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x14__8G20x14y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x14[0]),
  (VTBL_ENTRY)&_ZN6E20x143fooEv,
};
static  VTT_ENTRY vtt_G20x14y6[] = {
  {&(_ZTV8G20x14y6[4]),  4,5},
  {&(_tg__ZTV6E20x14__8G20x14y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G20x14y6[];
extern  VTBL_ENTRY _ZTV8G20x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x14y6[];
Class_Descriptor cd_G20x14y6 = {  "G20x14y6", // class name
  bases_G20x14y6, 6,
  &(vtc_G20x14y6[0]), // expected_vtbl_contents
  &(vtt_G20x14y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G20x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x14y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x14y6),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  G20x14y7  : virtual E20x14 , virtual F0 {
  int ff;
  ~G20x14y7(); // tgen
  G20x14y7(); // tgen
};
//SIG(1 G20x14y7) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G20x14y7 ::~G20x14y7(){ note_dtor("G20x14y7", this);} // tgen
G20x14y7 ::G20x14y7(){ note_ctor("G20x14y7", this);} // tgen

static void Test_G20x14y7()
{
  extern Class_Descriptor cd_G20x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x14y7, buf);
    G20x14y7 *dp, &lv = *(dp=new (buf) G20x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x14y7)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x14*), ABISELECT(28,16), "G20x14y7");
    check_base_class_offset(lv, (B1*)(C20*)(E20x14*), ABISELECT(16,8), "G20x14y7");
    check_base_class_offset(lv, (C20*)(E20x14*), ABISELECT(16,8), "G20x14y7");
    check_base_class_offset(lv, (D0*)(E20x14*), ABISELECT(40,28), "G20x14y7");
    check_base_class_offset(lv, (E20x14*), ABISELECT(16,8), "G20x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G20x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G20x14y7.ff");
    test_class_info(&lv, &cd_G20x14y7);
    dp->~G20x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x14y7(Test_G20x14y7, "G20x14y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G20x14y7C1Ev();
extern void _ZN8G20x14y7D1Ev();
Name_Map name_map_G20x14y7[] = {
  NSPAIR(_ZN8G20x14y7C1Ev),
  NSPAIR(_ZN8G20x14y7D1Ev),
  {0,0}
};
extern Class_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_E20x14;
extern VTBL_ENTRY _ZTI6E20x14[];
extern  VTBL_ENTRY _ZTV6E20x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x14y7[] = {
  // 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_E20x14,    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 _ZTI8G20x14y7[];
extern void _ZN6E20x143fooEv();
static  VTBL_ENTRY vtc_G20x14y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x14y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G20x14y7[0]),
  (VTBL_ENTRY)&_ZN6E20x143fooEv,
};
extern VTBL_ENTRY _ZTV8G20x14y7[];
extern void _ZN6E20x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x14__8G20x14y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x14[0]),
  (VTBL_ENTRY)&_ZN6E20x143fooEv,
};
static  VTT_ENTRY vtt_G20x14y7[] = {
  {&(_ZTV8G20x14y7[5]),  5,10},
  {&(_ZTV8G20x14y7[9]),  9,10},
  {&(_tg__ZTV6E20x14__8G20x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G20x14y7[];
extern  VTBL_ENTRY _ZTV8G20x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x14y7[];
Class_Descriptor cd_G20x14y7 = {  "G20x14y7", // class name
  bases_G20x14y7, 6,
  &(vtc_G20x14y7[0]), // expected_vtbl_contents
  &(vtt_G20x14y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G20x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x14y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x14y7),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  E21x14  : C21 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E21x143fooEv
  ~E21x14(); // tgen
  E21x14(); // tgen
};
//SIG(-1 E21x14) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E21x14 ::foo(){vfunc_called(this, "_ZN6E21x143fooEv");}
E21x14 ::~E21x14(){ note_dtor("E21x14", this);} // tgen
E21x14 ::E21x14(){ note_ctor("E21x14", this);} // tgen

static void Test_E21x14()
{
  extern Class_Descriptor cd_E21x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E21x14, buf);
    E21x14 *dp, &lv = *(dp=new (buf) E21x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E21x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E21x14)");
    check_base_class_offset(lv, (A1*)(C21*), 0, "E21x14");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(16,8), "E21x14");
    check_base_class_offset(lv, (C21*), 0, "E21x14");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E21x14");
    check_field_offset(lv, fd, ABISELECT(32,20), "E21x14.fd");
    test_class_info(&lv, &cd_E21x14);
    dp->~E21x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE21x14(Test_E21x14, "E21x14", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E21x14C1Ev();
extern void _ZN6E21x14D1Ev();
Name_Map name_map_E21x14[] = {
  NSPAIR(_ZN6E21x14C1Ev),
  NSPAIR(_ZN6E21x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x14[] = {
  // 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 _ZTI6E21x14[];
extern void _ZN6E21x143fooEv();
extern void ABISELECT(_ZThn16_N6E21x143fooEv,_ZThn8_N6E21x143fooEv)();
static  VTBL_ENTRY vtc_E21x14[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x14[0]),
  (VTBL_ENTRY)&_ZN6E21x143fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E21x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N6E21x143fooEv,_ZThn8_N6E21x143fooEv),
};
extern VTBL_ENTRY _ZTV6E21x14[];
static  VTT_ENTRY vtt_E21x14[] = {
  {&(_ZTV6E21x14[3]),  3,7},
};
extern VTBL_ENTRY _ZTI6E21x14[];
extern  VTBL_ENTRY _ZTV6E21x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x14[];
Class_Descriptor cd_E21x14 = {  "E21x14", // class name
  bases_E21x14, 4,
  &(vtc_E21x14[0]), // expected_vtbl_contents
  &(vtt_E21x14[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E21x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E21x14),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E21x14),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  G21x14y0  : E21x14 , F1 {
  int ff;
  ~G21x14y0(); // tgen
  G21x14y0(); // tgen
};
//SIG(1 G21x14y0) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G21x14y0 ::~G21x14y0(){ note_dtor("G21x14y0", this);} // tgen
G21x14y0 ::G21x14y0(){ note_ctor("G21x14y0", this);} // tgen

static void Test_G21x14y0()
{
  extern Class_Descriptor cd_G21x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G21x14y0, buf);
    G21x14y0 *dp, &lv = *(dp=new (buf) G21x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G21x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x14y0)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x14*), 0, "G21x14y0");
    check_base_class_offset(lv, (B1*)(C21*)(E21x14*), ABISELECT(16,8), "G21x14y0");
    check_base_class_offset(lv, (C21*)(E21x14*), 0, "G21x14y0");
    check_base_class_offset(lv, (D0*)(E21x14*), ABISELECT(56,36), "G21x14y0");
    check_base_class_offset(lv, (E21x14*), 0, "G21x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(40,24), "G21x14y0");
    check_field_offset(lv, ff, ABISELECT(52,32), "G21x14y0.ff");
    test_class_info(&lv, &cd_G21x14y0);
    dp->~G21x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x14y0(Test_G21x14y0, "G21x14y0", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G21x14y0C1Ev();
extern void _ZN8G21x14y0D1Ev();
Name_Map name_map_G21x14y0[] = {
  NSPAIR(_ZN8G21x14y0C1Ev),
  NSPAIR(_ZN8G21x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x14;
extern VTBL_ENTRY _ZTI6E21x14[];
extern  VTBL_ENTRY _ZTV6E21x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x14y0[] = {
  // 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_E21x14,    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 _ZTI8G21x14y0[];
extern void _ZN6E21x143fooEv();
extern void ABISELECT(_ZThn16_N6E21x143fooEv,_ZThn8_N6E21x143fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x14y0[] = {
  ABISELECT(56,36),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x14y0[0]),
  (VTBL_ENTRY)&_ZN6E21x143fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G21x14y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N6E21x143fooEv,_ZThn8_N6E21x143fooEv),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G21x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G21x14y0[];
extern void _ZN6E21x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x14__8G21x14y0[] = {
  ABISELECT(56,36),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x14[0]),
  (VTBL_ENTRY)&_ZN6E21x143fooEv,
};
static  VTT_ENTRY vtt_G21x14y0[] = {
  {&(_ZTV8G21x14y0[3]),  3,10},
  {&(_tg__ZTV6E21x14__8G21x14y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G21x14y0[];
extern  VTBL_ENTRY _ZTV8G21x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x14y0[];
Class_Descriptor cd_G21x14y0 = {  "G21x14y0", // class name
  bases_G21x14y0, 6,
  &(vtc_G21x14y0[0]), // expected_vtbl_contents
  &(vtt_G21x14y0[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G21x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x14y0),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x14y0),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  G21x14y1  : virtual E21x14 , F1 {
  int ff;
  ~G21x14y1(); // tgen
  G21x14y1(); // tgen
};
//SIG(1 G21x14y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G21x14y1 ::~G21x14y1(){ note_dtor("G21x14y1", this);} // tgen
G21x14y1 ::G21x14y1(){ note_ctor("G21x14y1", this);} // tgen

static void Test_G21x14y1()
{
  extern Class_Descriptor cd_G21x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G21x14y1, buf);
    G21x14y1 *dp, &lv = *(dp=new (buf) G21x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G21x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x14y1)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x14*), ABISELECT(16,12), "G21x14y1");
    check_base_class_offset(lv, (B1*)(C21*)(E21x14*), ABISELECT(32,20), "G21x14y1");
    check_base_class_offset(lv, (C21*)(E21x14*), ABISELECT(16,12), "G21x14y1");
    check_base_class_offset(lv, (D0*)(E21x14*), ABISELECT(52,36), "G21x14y1");
    check_base_class_offset(lv, (E21x14*), ABISELECT(16,12), "G21x14y1");
    check_base_class_offset(lv, (F1*), 0, "G21x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x14y1.ff");
    test_class_info(&lv, &cd_G21x14y1);
    dp->~G21x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x14y1(Test_G21x14y1, "G21x14y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G21x14y1C1Ev();
extern void _ZN8G21x14y1D1Ev();
Name_Map name_map_G21x14y1[] = {
  NSPAIR(_ZN8G21x14y1C1Ev),
  NSPAIR(_ZN8G21x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x14;
extern VTBL_ENTRY _ZTI6E21x14[];
extern  VTBL_ENTRY _ZTV6E21x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x14y1[] = {
  // 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_E21x14,    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 _ZTI8G21x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E21x143fooEv();
extern void ABISELECT(_ZThn16_N6E21x143fooEv,_ZThn8_N6E21x143fooEv)();
static  VTBL_ENTRY vtc_G21x14y1[] = {
  ABISELECT(52,36),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G21x14y1[0]),
  (VTBL_ENTRY)&_ZN6E21x143fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G21x14y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N6E21x143fooEv,_ZThn8_N6E21x143fooEv),
};
extern VTBL_ENTRY _ZTV8G21x14y1[];
extern void _ZN6E21x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x14__8G21x14y1[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x14[0]),
  (VTBL_ENTRY)&_ZN6E21x143fooEv,
};
static  VTT_ENTRY vtt_G21x14y1[] = {
  {&(_ZTV8G21x14y1[4]),  4,13},
  {&(_ZTV8G21x14y1[9]),  9,13},
  {&(_ZTV8G21x14y1[12]),  12,13},
  {&(_tg__ZTV6E21x14__8G21x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G21x14y1[];
extern  VTBL_ENTRY _ZTV8G21x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x14y1[];
Class_Descriptor cd_G21x14y1 = {  "G21x14y1", // class name
  bases_G21x14y1, 6,
  &(vtc_G21x14y1[0]), // expected_vtbl_contents
  &(vtt_G21x14y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G21x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x14y1),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x14y1),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  G21x14y2  : E21x14 , virtual F1 {
  int ff;
  ~G21x14y2(); // tgen
  G21x14y2(); // tgen
};
//SIG(1 G21x14y2) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G21x14y2 ::~G21x14y2(){ note_dtor("G21x14y2", this);} // tgen
G21x14y2 ::G21x14y2(){ note_ctor("G21x14y2", this);} // tgen

static void Test_G21x14y2()
{
  extern Class_Descriptor cd_G21x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G21x14y2, buf);
    G21x14y2 *dp, &lv = *(dp=new (buf) G21x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G21x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x14y2)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x14*), 0, "G21x14y2");
    check_base_class_offset(lv, (B1*)(C21*)(E21x14*), ABISELECT(16,8), "G21x14y2");
    check_base_class_offset(lv, (C21*)(E21x14*), 0, "G21x14y2");
    check_base_class_offset(lv, (D0*)(E21x14*), ABISELECT(40,28), "G21x14y2");
    check_base_class_offset(lv, (E21x14*), 0, "G21x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G21x14y2");
    check_field_offset(lv, ff, ABISELECT(36,24), "G21x14y2.ff");
    test_class_info(&lv, &cd_G21x14y2);
    dp->~G21x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x14y2(Test_G21x14y2, "G21x14y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G21x14y2C1Ev();
extern void _ZN8G21x14y2D1Ev();
Name_Map name_map_G21x14y2[] = {
  NSPAIR(_ZN8G21x14y2C1Ev),
  NSPAIR(_ZN8G21x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x14;
extern VTBL_ENTRY _ZTI6E21x14[];
extern  VTBL_ENTRY _ZTV6E21x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x14y2[] = {
  // 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_E21x14,    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 _ZTI8G21x14y2[];
extern void _ZN6E21x143fooEv();
extern void ABISELECT(_ZThn16_N6E21x143fooEv,_ZThn8_N6E21x143fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x14y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x14y2[0]),
  (VTBL_ENTRY)&_ZN6E21x143fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G21x14y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N6E21x143fooEv,_ZThn8_N6E21x143fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G21x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G21x14y2[];
extern void _ZN6E21x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x14__8G21x14y2[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x14[0]),
  (VTBL_ENTRY)&_ZN6E21x143fooEv,
};
static  VTT_ENTRY vtt_G21x14y2[] = {
  {&(_ZTV8G21x14y2[4]),  4,12},
  {&(_tg__ZTV6E21x14__8G21x14y2[3]),  3,4},
  {&(_ZTV8G21x14y2[11]),  11,12},
};
extern VTBL_ENTRY _ZTI8G21x14y2[];
extern  VTBL_ENTRY _ZTV8G21x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x14y2[];
Class_Descriptor cd_G21x14y2 = {  "G21x14y2", // class name
  bases_G21x14y2, 6,
  &(vtc_G21x14y2[0]), // expected_vtbl_contents
  &(vtt_G21x14y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G21x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x14y2),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x14y2),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  G21x14y3  : virtual E21x14 , virtual F1 {
  int ff;
  ~G21x14y3(); // tgen
  G21x14y3(); // tgen
};
//SIG(1 G21x14y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G21x14y3 ::~G21x14y3(){ note_dtor("G21x14y3", this);} // tgen
G21x14y3 ::G21x14y3(){ note_ctor("G21x14y3", this);} // tgen

static void Test_G21x14y3()
{
  extern Class_Descriptor cd_G21x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G21x14y3, buf);
    G21x14y3 *dp, &lv = *(dp=new (buf) G21x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G21x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x14y3)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x14*), ABISELECT(16,8), "G21x14y3");
    check_base_class_offset(lv, (B1*)(C21*)(E21x14*), ABISELECT(32,16), "G21x14y3");
    check_base_class_offset(lv, (C21*)(E21x14*), ABISELECT(16,8), "G21x14y3");
    check_base_class_offset(lv, (D0*)(E21x14*), ABISELECT(52,32), "G21x14y3");
    check_base_class_offset(lv, (E21x14*), ABISELECT(16,8), "G21x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G21x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G21x14y3.ff");
    test_class_info(&lv, &cd_G21x14y3);
    dp->~G21x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x14y3(Test_G21x14y3, "G21x14y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G21x14y3C1Ev();
extern void _ZN8G21x14y3D1Ev();
Name_Map name_map_G21x14y3[] = {
  NSPAIR(_ZN8G21x14y3C1Ev),
  NSPAIR(_ZN8G21x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x14;
extern VTBL_ENTRY _ZTI6E21x14[];
extern  VTBL_ENTRY _ZTV6E21x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x14y3[] = {
  // 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_E21x14,    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 _ZTI8G21x14y3[];
extern void _ZN6E21x143fooEv();
extern void ABISELECT(_ZThn16_N6E21x143fooEv,_ZThn8_N6E21x143fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x14y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x14y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G21x14y3[0]),
  (VTBL_ENTRY)&_ZN6E21x143fooEv,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G21x14y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N6E21x143fooEv,_ZThn8_N6E21x143fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G21x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G21x14y3[];
extern void _ZN6E21x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x14__8G21x14y3[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x14[0]),
  (VTBL_ENTRY)&_ZN6E21x143fooEv,
};
static  VTT_ENTRY vtt_G21x14y3[] = {
  {&(_ZTV8G21x14y3[5]),  5,17},
  {&(_ZTV8G21x14y3[9]),  9,17},
  {&(_ZTV8G21x14y3[12]),  12,17},
  {&(_ZTV8G21x14y3[16]),  16,17},
  {&(_tg__ZTV6E21x14__8G21x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G21x14y3[];
extern  VTBL_ENTRY _ZTV8G21x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x14y3[];
Class_Descriptor cd_G21x14y3 = {  "G21x14y3", // class name
  bases_G21x14y3, 6,
  &(vtc_G21x14y3[0]), // expected_vtbl_contents
  &(vtt_G21x14y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G21x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x14y3),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x14y3),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  G21x14y4  : E21x14 , F0 {
  int ff;
  ~G21x14y4(); // tgen
  G21x14y4(); // tgen
};
//SIG(1 G21x14y4) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G21x14y4 ::~G21x14y4(){ note_dtor("G21x14y4", this);} // tgen
G21x14y4 ::G21x14y4(){ note_ctor("G21x14y4", this);} // tgen

static void Test_G21x14y4()
{
  extern Class_Descriptor cd_G21x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G21x14y4, buf);
    G21x14y4 *dp, &lv = *(dp=new (buf) G21x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G21x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x14y4)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x14*), 0, "G21x14y4");
    check_base_class_offset(lv, (B1*)(C21*)(E21x14*), ABISELECT(16,8), "G21x14y4");
    check_base_class_offset(lv, (C21*)(E21x14*), 0, "G21x14y4");
    check_base_class_offset(lv, (D0*)(E21x14*), ABISELECT(44,32), "G21x14y4");
    check_base_class_offset(lv, (E21x14*), 0, "G21x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(36,24), "G21x14y4");
    check_field_offset(lv, ff, ABISELECT(40,28), "G21x14y4.ff");
    test_class_info(&lv, &cd_G21x14y4);
    dp->~G21x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x14y4(Test_G21x14y4, "G21x14y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G21x14y4C1Ev();
extern void _ZN8G21x14y4D1Ev();
Name_Map name_map_G21x14y4[] = {
  NSPAIR(_ZN8G21x14y4C1Ev),
  NSPAIR(_ZN8G21x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x14;
extern VTBL_ENTRY _ZTI6E21x14[];
extern  VTBL_ENTRY _ZTV6E21x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x14y4[] = {
  // 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_E21x14,    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 _ZTI8G21x14y4[];
extern void _ZN6E21x143fooEv();
extern void ABISELECT(_ZThn16_N6E21x143fooEv,_ZThn8_N6E21x143fooEv)();
static  VTBL_ENTRY vtc_G21x14y4[] = {
  ABISELECT(44,32),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x14y4[0]),
  (VTBL_ENTRY)&_ZN6E21x143fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G21x14y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N6E21x143fooEv,_ZThn8_N6E21x143fooEv),
};
extern VTBL_ENTRY _ZTV8G21x14y4[];
extern void _ZN6E21x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x14__8G21x14y4[] = {
  ABISELECT(44,32),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x14[0]),
  (VTBL_ENTRY)&_ZN6E21x143fooEv,
};
static  VTT_ENTRY vtt_G21x14y4[] = {
  {&(_ZTV8G21x14y4[3]),  3,7},
  {&(_tg__ZTV6E21x14__8G21x14y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G21x14y4[];
extern  VTBL_ENTRY _ZTV8G21x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x14y4[];
Class_Descriptor cd_G21x14y4 = {  "G21x14y4", // class name
  bases_G21x14y4, 6,
  &(vtc_G21x14y4[0]), // expected_vtbl_contents
  &(vtt_G21x14y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G21x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x14y4),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x14y4),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  G21x14y5  : virtual E21x14 , F0 {
  int ff;
  ~G21x14y5(); // tgen
  G21x14y5(); // tgen
};
//SIG(1 G21x14y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G21x14y5 ::~G21x14y5(){ note_dtor("G21x14y5", this);} // tgen
G21x14y5 ::G21x14y5(){ note_ctor("G21x14y5", this);} // tgen

static void Test_G21x14y5()
{
  extern Class_Descriptor cd_G21x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G21x14y5, buf);
    G21x14y5 *dp, &lv = *(dp=new (buf) G21x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G21x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x14y5)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x14*), ABISELECT(16,12), "G21x14y5");
    check_base_class_offset(lv, (B1*)(C21*)(E21x14*), ABISELECT(32,20), "G21x14y5");
    check_base_class_offset(lv, (C21*)(E21x14*), ABISELECT(16,12), "G21x14y5");
    check_base_class_offset(lv, (D0*)(E21x14*), ABISELECT(52,36), "G21x14y5");
    check_base_class_offset(lv, (E21x14*), ABISELECT(16,12), "G21x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G21x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x14y5.ff");
    test_class_info(&lv, &cd_G21x14y5);
    dp->~G21x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x14y5(Test_G21x14y5, "G21x14y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G21x14y5C1Ev();
extern void _ZN8G21x14y5D1Ev();
Name_Map name_map_G21x14y5[] = {
  NSPAIR(_ZN8G21x14y5C1Ev),
  NSPAIR(_ZN8G21x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x14;
extern VTBL_ENTRY _ZTI6E21x14[];
extern  VTBL_ENTRY _ZTV6E21x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x14y5[] = {
  // 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_E21x14,    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 _ZTI8G21x14y5[];
extern void _ZN6E21x143fooEv();
extern void ABISELECT(_ZThn16_N6E21x143fooEv,_ZThn8_N6E21x143fooEv)();
static  VTBL_ENTRY vtc_G21x14y5[] = {
  ABISELECT(52,36),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x14y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G21x14y5[0]),
  (VTBL_ENTRY)&_ZN6E21x143fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G21x14y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N6E21x143fooEv,_ZThn8_N6E21x143fooEv),
};
extern VTBL_ENTRY _ZTV8G21x14y5[];
extern void _ZN6E21x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x14__8G21x14y5[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x14[0]),
  (VTBL_ENTRY)&_ZN6E21x143fooEv,
};
static  VTT_ENTRY vtt_G21x14y5[] = {
  {&(_ZTV8G21x14y5[4]),  4,12},
  {&(_ZTV8G21x14y5[8]),  8,12},
  {&(_ZTV8G21x14y5[11]),  11,12},
  {&(_tg__ZTV6E21x14__8G21x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G21x14y5[];
extern  VTBL_ENTRY _ZTV8G21x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x14y5[];
Class_Descriptor cd_G21x14y5 = {  "G21x14y5", // class name
  bases_G21x14y5, 6,
  &(vtc_G21x14y5[0]), // expected_vtbl_contents
  &(vtt_G21x14y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G21x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x14y5),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x14y5),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  G21x14y6  : E21x14 , virtual F0 {
  int ff;
  ~G21x14y6(); // tgen
  G21x14y6(); // tgen
};
//SIG(1 G21x14y6) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G21x14y6 ::~G21x14y6(){ note_dtor("G21x14y6", this);} // tgen
G21x14y6 ::G21x14y6(){ note_ctor("G21x14y6", this);} // tgen

static void Test_G21x14y6()
{
  extern Class_Descriptor cd_G21x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G21x14y6, buf);
    G21x14y6 *dp, &lv = *(dp=new (buf) G21x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G21x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x14y6)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x14*), 0, "G21x14y6");
    check_base_class_offset(lv, (B1*)(C21*)(E21x14*), ABISELECT(16,8), "G21x14y6");
    check_base_class_offset(lv, (C21*)(E21x14*), 0, "G21x14y6");
    check_base_class_offset(lv, (D0*)(E21x14*), ABISELECT(40,28), "G21x14y6");
    check_base_class_offset(lv, (E21x14*), 0, "G21x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G21x14y6");
    check_field_offset(lv, ff, ABISELECT(36,24), "G21x14y6.ff");
    test_class_info(&lv, &cd_G21x14y6);
    dp->~G21x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x14y6(Test_G21x14y6, "G21x14y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G21x14y6C1Ev();
extern void _ZN8G21x14y6D1Ev();
Name_Map name_map_G21x14y6[] = {
  NSPAIR(_ZN8G21x14y6C1Ev),
  NSPAIR(_ZN8G21x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x14;
extern VTBL_ENTRY _ZTI6E21x14[];
extern  VTBL_ENTRY _ZTV6E21x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x14y6[] = {
  // 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_E21x14,    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 _ZTI8G21x14y6[];
extern void _ZN6E21x143fooEv();
extern void ABISELECT(_ZThn16_N6E21x143fooEv,_ZThn8_N6E21x143fooEv)();
static  VTBL_ENTRY vtc_G21x14y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x14y6[0]),
  (VTBL_ENTRY)&_ZN6E21x143fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G21x14y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N6E21x143fooEv,_ZThn8_N6E21x143fooEv),
};
extern VTBL_ENTRY _ZTV8G21x14y6[];
extern void _ZN6E21x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x14__8G21x14y6[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x14[0]),
  (VTBL_ENTRY)&_ZN6E21x143fooEv,
};
static  VTT_ENTRY vtt_G21x14y6[] = {
  {&(_ZTV8G21x14y6[4]),  4,8},
  {&(_tg__ZTV6E21x14__8G21x14y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G21x14y6[];
extern  VTBL_ENTRY _ZTV8G21x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x14y6[];
Class_Descriptor cd_G21x14y6 = {  "G21x14y6", // class name
  bases_G21x14y6, 6,
  &(vtc_G21x14y6[0]), // expected_vtbl_contents
  &(vtt_G21x14y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G21x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x14y6),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x14y6),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  G21x14y7  : virtual E21x14 , virtual F0 {
  int ff;
  ~G21x14y7(); // tgen
  G21x14y7(); // tgen
};
//SIG(1 G21x14y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G21x14y7 ::~G21x14y7(){ note_dtor("G21x14y7", this);} // tgen
G21x14y7 ::G21x14y7(){ note_ctor("G21x14y7", this);} // tgen

static void Test_G21x14y7()
{
  extern Class_Descriptor cd_G21x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G21x14y7, buf);
    G21x14y7 *dp, &lv = *(dp=new (buf) G21x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G21x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x14y7)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x14*), ABISELECT(16,8), "G21x14y7");
    check_base_class_offset(lv, (B1*)(C21*)(E21x14*), ABISELECT(32,16), "G21x14y7");
    check_base_class_offset(lv, (C21*)(E21x14*), ABISELECT(16,8), "G21x14y7");
    check_base_class_offset(lv, (D0*)(E21x14*), ABISELECT(52,32), "G21x14y7");
    check_base_class_offset(lv, (E21x14*), ABISELECT(16,8), "G21x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G21x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G21x14y7.ff");
    test_class_info(&lv, &cd_G21x14y7);
    dp->~G21x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x14y7(Test_G21x14y7, "G21x14y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G21x14y7C1Ev();
extern void _ZN8G21x14y7D1Ev();
Name_Map name_map_G21x14y7[] = {
  NSPAIR(_ZN8G21x14y7C1Ev),
  NSPAIR(_ZN8G21x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x14;
extern VTBL_ENTRY _ZTI6E21x14[];
extern  VTBL_ENTRY _ZTV6E21x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x14y7[] = {
  // 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_E21x14,    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 _ZTI8G21x14y7[];
extern void _ZN6E21x143fooEv();
extern void ABISELECT(_ZThn16_N6E21x143fooEv,_ZThn8_N6E21x143fooEv)();
static  VTBL_ENTRY vtc_G21x14y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x14y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G21x14y7[0]),
  (VTBL_ENTRY)&_ZN6E21x143fooEv,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G21x14y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N6E21x143fooEv,_ZThn8_N6E21x143fooEv),
};
extern VTBL_ENTRY _ZTV8G21x14y7[];
extern void _ZN6E21x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x14__8G21x14y7[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x14[0]),
  (VTBL_ENTRY)&_ZN6E21x143fooEv,
};
static  VTT_ENTRY vtt_G21x14y7[] = {
  {&(_ZTV8G21x14y7[5]),  5,13},
  {&(_ZTV8G21x14y7[9]),  9,13},
  {&(_ZTV8G21x14y7[12]),  12,13},
  {&(_tg__ZTV6E21x14__8G21x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G21x14y7[];
extern  VTBL_ENTRY _ZTV8G21x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x14y7[];
Class_Descriptor cd_G21x14y7 = {  "G21x14y7", // class name
  bases_G21x14y7, 6,
  &(vtc_G21x14y7[0]), // expected_vtbl_contents
  &(vtt_G21x14y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G21x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x14y7),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x14y7),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  E22x14  : C22 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E22x143fooEv
  ~E22x14(); // tgen
  E22x14(); // tgen
};
//SIG(-1 E22x14) C1{ BC2{ VBC3{ Fi} BC4{ v1 Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E22x14 ::foo(){vfunc_called(this, "_ZN6E22x143fooEv");}
E22x14 ::~E22x14(){ note_dtor("E22x14", this);} // tgen
E22x14 ::E22x14(){ note_ctor("E22x14", this);} // tgen

static void Test_E22x14()
{
  extern Class_Descriptor cd_E22x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E22x14, buf);
    E22x14 *dp, &lv = *(dp=new (buf) E22x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E22x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E22x14)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(20,16), "E22x14");
    check_base_class_offset(lv, (B1*)(C22*), 0, "E22x14");
    check_base_class_offset(lv, (C22*), 0, "E22x14");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E22x14");
    check_field_offset(lv, fd, ABISELECT(16,12), "E22x14.fd");
    test_class_info(&lv, &cd_E22x14);
    dp->~E22x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE22x14(Test_E22x14, "E22x14", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6E22x14C1Ev();
extern void _ZN6E22x14D1Ev();
Name_Map name_map_E22x14[] = {
  NSPAIR(_ZN6E22x14C1Ev),
  NSPAIR(_ZN6E22x14D1Ev),
  {0,0}
};
extern Class_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_E22x14[] = {
  // 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 _ZTI6E22x14[];
extern void _ZN6E22x143fooEv();
static  VTBL_ENTRY vtc_E22x14[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x14[0]),
  (VTBL_ENTRY)&_ZN6E22x143fooEv,
};
extern VTBL_ENTRY _ZTV6E22x14[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__6E22x14[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_E22x14[] = {
  {&(_ZTV6E22x14[4]),  4,5},
  {&(_tg__ZTV3C22__6E22x14[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E22x14[];
extern  VTBL_ENTRY _ZTV6E22x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x14[];
Class_Descriptor cd_E22x14 = {  "E22x14", // class name
  bases_E22x14, 4,
  &(vtc_E22x14[0]), // expected_vtbl_contents
  &(vtt_E22x14[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6E22x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E22x14),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E22x14),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  G22x14y0  : E22x14 , F1 {
  int ff;
  ~G22x14y0(); // tgen
  G22x14y0(); // tgen
};
//SIG(1 G22x14y0) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G22x14y0 ::~G22x14y0(){ note_dtor("G22x14y0", this);} // tgen
G22x14y0 ::G22x14y0(){ note_ctor("G22x14y0", this);} // tgen

static void Test_G22x14y0()
{
  extern Class_Descriptor cd_G22x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x14y0, buf);
    G22x14y0 *dp, &lv = *(dp=new (buf) G22x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x14y0)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x14*), ABISELECT(40,28), "G22x14y0");
    check_base_class_offset(lv, (B1*)(C22*)(E22x14*), 0, "G22x14y0");
    check_base_class_offset(lv, (C22*)(E22x14*), 0, "G22x14y0");
    check_base_class_offset(lv, (D0*)(E22x14*), ABISELECT(44,32), "G22x14y0");
    check_base_class_offset(lv, (E22x14*), 0, "G22x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G22x14y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G22x14y0.ff");
    test_class_info(&lv, &cd_G22x14y0);
    dp->~G22x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x14y0(Test_G22x14y0, "G22x14y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G22x14y0C1Ev();
extern void _ZN8G22x14y0D1Ev();
Name_Map name_map_G22x14y0[] = {
  NSPAIR(_ZN8G22x14y0C1Ev),
  NSPAIR(_ZN8G22x14y0D1Ev),
  {0,0}
};
extern Class_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_E22x14;
extern VTBL_ENTRY _ZTI6E22x14[];
extern  VTBL_ENTRY _ZTV6E22x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x14y0[] = {
  // 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_E22x14,    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 _ZTI8G22x14y0[];
extern void _ZN6E22x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x14y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x14y0[0]),
  (VTBL_ENTRY)&_ZN6E22x143fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G22x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G22x14y0[];
extern void _ZN6E22x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x14__8G22x14y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x14[0]),
  (VTBL_ENTRY)&_ZN6E22x143fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C226E22x14__8G22x14y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x14y0[] = {
  {&(_ZTV8G22x14y0[4]),  4,8},
  {&(_tg__ZTV6E22x14__8G22x14y0[4]),  4,5},
  {&(_tg__ZTV3C226E22x14__8G22x14y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x14y0[];
extern  VTBL_ENTRY _ZTV8G22x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x14y0[];
Class_Descriptor cd_G22x14y0 = {  "G22x14y0", // class name
  bases_G22x14y0, 6,
  &(vtc_G22x14y0[0]), // expected_vtbl_contents
  &(vtt_G22x14y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G22x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x14y0),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x14y0),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  G22x14y1  : virtual E22x14 , F1 {
  int ff;
  ~G22x14y1(); // tgen
  G22x14y1(); // tgen
};
//SIG(1 G22x14y1) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G22x14y1 ::~G22x14y1(){ note_dtor("G22x14y1", this);} // tgen
G22x14y1 ::G22x14y1(){ note_ctor("G22x14y1", this);} // tgen

static void Test_G22x14y1()
{
  extern Class_Descriptor cd_G22x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x14y1, buf);
    G22x14y1 *dp, &lv = *(dp=new (buf) G22x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x14y1)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x14*), ABISELECT(36,28), "G22x14y1");
    check_base_class_offset(lv, (B1*)(C22*)(E22x14*), ABISELECT(16,12), "G22x14y1");
    check_base_class_offset(lv, (C22*)(E22x14*), ABISELECT(16,12), "G22x14y1");
    check_base_class_offset(lv, (D0*)(E22x14*), ABISELECT(40,32), "G22x14y1");
    check_base_class_offset(lv, (E22x14*), ABISELECT(16,12), "G22x14y1");
    check_base_class_offset(lv, (F1*), 0, "G22x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x14y1.ff");
    test_class_info(&lv, &cd_G22x14y1);
    dp->~G22x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x14y1(Test_G22x14y1, "G22x14y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G22x14y1C1Ev();
extern void _ZN8G22x14y1D1Ev();
Name_Map name_map_G22x14y1[] = {
  NSPAIR(_ZN8G22x14y1C1Ev),
  NSPAIR(_ZN8G22x14y1D1Ev),
  {0,0}
};
extern Class_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_E22x14;
extern VTBL_ENTRY _ZTI6E22x14[];
extern  VTBL_ENTRY _ZTV6E22x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x14y1[] = {
  // 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_E22x14,    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 _ZTI8G22x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E22x143fooEv();
static  VTBL_ENTRY vtc_G22x14y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G22x14y1[0]),
  (VTBL_ENTRY)&_ZN6E22x143fooEv,
};
extern VTBL_ENTRY _ZTV8G22x14y1[];
extern void _ZN6E22x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x14__8G22x14y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x14[0]),
  (VTBL_ENTRY)&_ZN6E22x143fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C226E22x14__8G22x14y1[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x14y1[] = {
  {&(_ZTV8G22x14y1[5]),  5,12},
  {&(_ZTV8G22x14y1[11]),  11,12},
  {&(_tg__ZTV6E22x14__8G22x14y1[4]),  4,5},
  {&(_tg__ZTV3C226E22x14__8G22x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x14y1[];
extern  VTBL_ENTRY _ZTV8G22x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x14y1[];
Class_Descriptor cd_G22x14y1 = {  "G22x14y1", // class name
  bases_G22x14y1, 6,
  &(vtc_G22x14y1[0]), // expected_vtbl_contents
  &(vtt_G22x14y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G22x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x14y1),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x14y1),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  G22x14y2  : E22x14 , virtual F1 {
  int ff;
  ~G22x14y2(); // tgen
  G22x14y2(); // tgen
};
//SIG(1 G22x14y2) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G22x14y2 ::~G22x14y2(){ note_dtor("G22x14y2", this);} // tgen
G22x14y2 ::G22x14y2(){ note_ctor("G22x14y2", this);} // tgen

static void Test_G22x14y2()
{
  extern Class_Descriptor cd_G22x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x14y2, buf);
    G22x14y2 *dp, &lv = *(dp=new (buf) G22x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x14y2)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x14*), ABISELECT(24,20), "G22x14y2");
    check_base_class_offset(lv, (B1*)(C22*)(E22x14*), 0, "G22x14y2");
    check_base_class_offset(lv, (C22*)(E22x14*), 0, "G22x14y2");
    check_base_class_offset(lv, (D0*)(E22x14*), ABISELECT(28,24), "G22x14y2");
    check_base_class_offset(lv, (E22x14*), 0, "G22x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G22x14y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G22x14y2.ff");
    test_class_info(&lv, &cd_G22x14y2);
    dp->~G22x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x14y2(Test_G22x14y2, "G22x14y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G22x14y2C1Ev();
extern void _ZN8G22x14y2D1Ev();
Name_Map name_map_G22x14y2[] = {
  NSPAIR(_ZN8G22x14y2C1Ev),
  NSPAIR(_ZN8G22x14y2D1Ev),
  {0,0}
};
extern Class_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_E22x14;
extern VTBL_ENTRY _ZTI6E22x14[];
extern  VTBL_ENTRY _ZTV6E22x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x14y2[] = {
  // 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_E22x14,    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 _ZTI8G22x14y2[];
extern void _ZN6E22x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x14y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x14y2[0]),
  (VTBL_ENTRY)&_ZN6E22x143fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G22x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G22x14y2[];
extern void _ZN6E22x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x14__8G22x14y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x14[0]),
  (VTBL_ENTRY)&_ZN6E22x143fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C226E22x14__8G22x14y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x14y2[] = {
  {&(_ZTV8G22x14y2[5]),  5,10},
  {&(_tg__ZTV6E22x14__8G22x14y2[4]),  4,5},
  {&(_tg__ZTV3C226E22x14__8G22x14y2[3]),  3,4},
  {&(_ZTV8G22x14y2[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G22x14y2[];
extern  VTBL_ENTRY _ZTV8G22x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x14y2[];
Class_Descriptor cd_G22x14y2 = {  "G22x14y2", // class name
  bases_G22x14y2, 6,
  &(vtc_G22x14y2[0]), // expected_vtbl_contents
  &(vtt_G22x14y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G22x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x14y2),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x14y2),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  G22x14y3  : virtual E22x14 , virtual F1 {
  int ff;
  ~G22x14y3(); // tgen
  G22x14y3(); // tgen
};
//SIG(1 G22x14y3) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G22x14y3 ::~G22x14y3(){ note_dtor("G22x14y3", this);} // tgen
G22x14y3 ::G22x14y3(){ note_ctor("G22x14y3", this);} // tgen

static void Test_G22x14y3()
{
  extern Class_Descriptor cd_G22x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G22x14y3, buf);
    G22x14y3 *dp, &lv = *(dp=new (buf) G22x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G22x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x14y3)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x14*), ABISELECT(36,24), "G22x14y3");
    check_base_class_offset(lv, (B1*)(C22*)(E22x14*), ABISELECT(16,8), "G22x14y3");
    check_base_class_offset(lv, (C22*)(E22x14*), ABISELECT(16,8), "G22x14y3");
    check_base_class_offset(lv, (D0*)(E22x14*), ABISELECT(40,28), "G22x14y3");
    check_base_class_offset(lv, (E22x14*), ABISELECT(16,8), "G22x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G22x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G22x14y3.ff");
    test_class_info(&lv, &cd_G22x14y3);
    dp->~G22x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x14y3(Test_G22x14y3, "G22x14y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G22x14y3C1Ev();
extern void _ZN8G22x14y3D1Ev();
Name_Map name_map_G22x14y3[] = {
  NSPAIR(_ZN8G22x14y3C1Ev),
  NSPAIR(_ZN8G22x14y3D1Ev),
  {0,0}
};
extern Class_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_E22x14;
extern VTBL_ENTRY _ZTI6E22x14[];
extern  VTBL_ENTRY _ZTV6E22x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x14y3[] = {
  // 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_E22x14,    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 _ZTI8G22x14y3[];
extern void _ZN6E22x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x14y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x14y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G22x14y3[0]),
  (VTBL_ENTRY)&_ZN6E22x143fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G22x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G22x14y3[];
extern void _ZN6E22x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x14__8G22x14y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x14[0]),
  (VTBL_ENTRY)&_ZN6E22x143fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C226E22x14__8G22x14y3[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x14y3[] = {
  {&(_ZTV8G22x14y3[6]),  6,16},
  {&(_ZTV8G22x14y3[11]),  11,16},
  {&(_ZTV8G22x14y3[15]),  15,16},
  {&(_tg__ZTV6E22x14__8G22x14y3[4]),  4,5},
  {&(_tg__ZTV3C226E22x14__8G22x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x14y3[];
extern  VTBL_ENTRY _ZTV8G22x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x14y3[];
Class_Descriptor cd_G22x14y3 = {  "G22x14y3", // class name
  bases_G22x14y3, 6,
  &(vtc_G22x14y3[0]), // expected_vtbl_contents
  &(vtt_G22x14y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G22x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x14y3),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x14y3),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  G22x14y4  : E22x14 , F0 {
  int ff;
  ~G22x14y4(); // tgen
  G22x14y4(); // tgen
};
//SIG(1 G22x14y4) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G22x14y4 ::~G22x14y4(){ note_dtor("G22x14y4", this);} // tgen
G22x14y4 ::G22x14y4(){ note_ctor("G22x14y4", this);} // tgen

static void Test_G22x14y4()
{
  extern Class_Descriptor cd_G22x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G22x14y4, buf);
    G22x14y4 *dp, &lv = *(dp=new (buf) G22x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G22x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x14y4)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x14*), ABISELECT(28,24), "G22x14y4");
    check_base_class_offset(lv, (B1*)(C22*)(E22x14*), 0, "G22x14y4");
    check_base_class_offset(lv, (C22*)(E22x14*), 0, "G22x14y4");
    check_base_class_offset(lv, (D0*)(E22x14*), ABISELECT(32,28), "G22x14y4");
    check_base_class_offset(lv, (E22x14*), 0, "G22x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G22x14y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G22x14y4.ff");
    test_class_info(&lv, &cd_G22x14y4);
    dp->~G22x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x14y4(Test_G22x14y4, "G22x14y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G22x14y4C1Ev();
extern void _ZN8G22x14y4D1Ev();
Name_Map name_map_G22x14y4[] = {
  NSPAIR(_ZN8G22x14y4C1Ev),
  NSPAIR(_ZN8G22x14y4D1Ev),
  {0,0}
};
extern Class_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_E22x14;
extern VTBL_ENTRY _ZTI6E22x14[];
extern  VTBL_ENTRY _ZTV6E22x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x14y4[] = {
  // 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_E22x14,    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 _ZTI8G22x14y4[];
extern void _ZN6E22x143fooEv();
static  VTBL_ENTRY vtc_G22x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x14y4[0]),
  (VTBL_ENTRY)&_ZN6E22x143fooEv,
};
extern VTBL_ENTRY _ZTV8G22x14y4[];
extern void _ZN6E22x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x14__8G22x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x14[0]),
  (VTBL_ENTRY)&_ZN6E22x143fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C226E22x14__8G22x14y4[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x14y4[] = {
  {&(_ZTV8G22x14y4[4]),  4,5},
  {&(_tg__ZTV6E22x14__8G22x14y4[4]),  4,5},
  {&(_tg__ZTV3C226E22x14__8G22x14y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x14y4[];
extern  VTBL_ENTRY _ZTV8G22x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x14y4[];
Class_Descriptor cd_G22x14y4 = {  "G22x14y4", // class name
  bases_G22x14y4, 6,
  &(vtc_G22x14y4[0]), // expected_vtbl_contents
  &(vtt_G22x14y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G22x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x14y4),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x14y4),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  G22x14y5  : virtual E22x14 , F0 {
  int ff;
  ~G22x14y5(); // tgen
  G22x14y5(); // tgen
};
//SIG(1 G22x14y5) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G22x14y5 ::~G22x14y5(){ note_dtor("G22x14y5", this);} // tgen
G22x14y5 ::G22x14y5(){ note_ctor("G22x14y5", this);} // tgen

static void Test_G22x14y5()
{
  extern Class_Descriptor cd_G22x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x14y5, buf);
    G22x14y5 *dp, &lv = *(dp=new (buf) G22x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x14y5)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x14*), ABISELECT(36,28), "G22x14y5");
    check_base_class_offset(lv, (B1*)(C22*)(E22x14*), ABISELECT(16,12), "G22x14y5");
    check_base_class_offset(lv, (C22*)(E22x14*), ABISELECT(16,12), "G22x14y5");
    check_base_class_offset(lv, (D0*)(E22x14*), ABISELECT(40,32), "G22x14y5");
    check_base_class_offset(lv, (E22x14*), ABISELECT(16,12), "G22x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G22x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x14y5.ff");
    test_class_info(&lv, &cd_G22x14y5);
    dp->~G22x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x14y5(Test_G22x14y5, "G22x14y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G22x14y5C1Ev();
extern void _ZN8G22x14y5D1Ev();
Name_Map name_map_G22x14y5[] = {
  NSPAIR(_ZN8G22x14y5C1Ev),
  NSPAIR(_ZN8G22x14y5D1Ev),
  {0,0}
};
extern Class_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_E22x14;
extern VTBL_ENTRY _ZTI6E22x14[];
extern  VTBL_ENTRY _ZTV6E22x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x14y5[] = {
  // 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_E22x14,    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 _ZTI8G22x14y5[];
extern void _ZN6E22x143fooEv();
static  VTBL_ENTRY vtc_G22x14y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x14y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G22x14y5[0]),
  (VTBL_ENTRY)&_ZN6E22x143fooEv,
};
extern VTBL_ENTRY _ZTV8G22x14y5[];
extern void _ZN6E22x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x14__8G22x14y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x14[0]),
  (VTBL_ENTRY)&_ZN6E22x143fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C226E22x14__8G22x14y5[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x14y5[] = {
  {&(_ZTV8G22x14y5[5]),  5,11},
  {&(_ZTV8G22x14y5[10]),  10,11},
  {&(_tg__ZTV6E22x14__8G22x14y5[4]),  4,5},
  {&(_tg__ZTV3C226E22x14__8G22x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x14y5[];
extern  VTBL_ENTRY _ZTV8G22x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x14y5[];
Class_Descriptor cd_G22x14y5 = {  "G22x14y5", // class name
  bases_G22x14y5, 6,
  &(vtc_G22x14y5[0]), // expected_vtbl_contents
  &(vtt_G22x14y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G22x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x14y5),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x14y5),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  G22x14y6  : E22x14 , virtual F0 {
  int ff;
  ~G22x14y6(); // tgen
  G22x14y6(); // tgen
};
//SIG(1 G22x14y6) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G22x14y6 ::~G22x14y6(){ note_dtor("G22x14y6", this);} // tgen
G22x14y6 ::G22x14y6(){ note_ctor("G22x14y6", this);} // tgen

static void Test_G22x14y6()
{
  extern Class_Descriptor cd_G22x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G22x14y6, buf);
    G22x14y6 *dp, &lv = *(dp=new (buf) G22x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G22x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x14y6)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x14*), ABISELECT(24,20), "G22x14y6");
    check_base_class_offset(lv, (B1*)(C22*)(E22x14*), 0, "G22x14y6");
    check_base_class_offset(lv, (C22*)(E22x14*), 0, "G22x14y6");
    check_base_class_offset(lv, (D0*)(E22x14*), ABISELECT(28,24), "G22x14y6");
    check_base_class_offset(lv, (E22x14*), 0, "G22x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G22x14y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G22x14y6.ff");
    test_class_info(&lv, &cd_G22x14y6);
    dp->~G22x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x14y6(Test_G22x14y6, "G22x14y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G22x14y6C1Ev();
extern void _ZN8G22x14y6D1Ev();
Name_Map name_map_G22x14y6[] = {
  NSPAIR(_ZN8G22x14y6C1Ev),
  NSPAIR(_ZN8G22x14y6D1Ev),
  {0,0}
};
extern Class_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_E22x14;
extern VTBL_ENTRY _ZTI6E22x14[];
extern  VTBL_ENTRY _ZTV6E22x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x14y6[] = {
  // 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_E22x14,    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 _ZTI8G22x14y6[];
extern void _ZN6E22x143fooEv();
static  VTBL_ENTRY vtc_G22x14y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x14y6[0]),
  (VTBL_ENTRY)&_ZN6E22x143fooEv,
};
extern VTBL_ENTRY _ZTV8G22x14y6[];
extern void _ZN6E22x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x14__8G22x14y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x14[0]),
  (VTBL_ENTRY)&_ZN6E22x143fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C226E22x14__8G22x14y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x14y6[] = {
  {&(_ZTV8G22x14y6[5]),  5,6},
  {&(_tg__ZTV6E22x14__8G22x14y6[4]),  4,5},
  {&(_tg__ZTV3C226E22x14__8G22x14y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x14y6[];
extern  VTBL_ENTRY _ZTV8G22x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x14y6[];
Class_Descriptor cd_G22x14y6 = {  "G22x14y6", // class name
  bases_G22x14y6, 6,
  &(vtc_G22x14y6[0]), // expected_vtbl_contents
  &(vtt_G22x14y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G22x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x14y6),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x14y6),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  G22x14y7  : virtual E22x14 , virtual F0 {
  int ff;
  ~G22x14y7(); // tgen
  G22x14y7(); // tgen
};
//SIG(1 G22x14y7) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G22x14y7 ::~G22x14y7(){ note_dtor("G22x14y7", this);} // tgen
G22x14y7 ::G22x14y7(){ note_ctor("G22x14y7", this);} // tgen

static void Test_G22x14y7()
{
  extern Class_Descriptor cd_G22x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x14y7, buf);
    G22x14y7 *dp, &lv = *(dp=new (buf) G22x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x14y7)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x14*), ABISELECT(36,24), "G22x14y7");
    check_base_class_offset(lv, (B1*)(C22*)(E22x14*), ABISELECT(16,8), "G22x14y7");
    check_base_class_offset(lv, (C22*)(E22x14*), ABISELECT(16,8), "G22x14y7");
    check_base_class_offset(lv, (D0*)(E22x14*), ABISELECT(40,28), "G22x14y7");
    check_base_class_offset(lv, (E22x14*), ABISELECT(16,8), "G22x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G22x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G22x14y7.ff");
    test_class_info(&lv, &cd_G22x14y7);
    dp->~G22x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x14y7(Test_G22x14y7, "G22x14y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G22x14y7C1Ev();
extern void _ZN8G22x14y7D1Ev();
Name_Map name_map_G22x14y7[] = {
  NSPAIR(_ZN8G22x14y7C1Ev),
  NSPAIR(_ZN8G22x14y7D1Ev),
  {0,0}
};
extern Class_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_E22x14;
extern VTBL_ENTRY _ZTI6E22x14[];
extern  VTBL_ENTRY _ZTV6E22x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x14y7[] = {
  // 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_E22x14,    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 _ZTI8G22x14y7[];
extern void _ZN6E22x143fooEv();
static  VTBL_ENTRY vtc_G22x14y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x14y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G22x14y7[0]),
  (VTBL_ENTRY)&_ZN6E22x143fooEv,
};
extern VTBL_ENTRY _ZTV8G22x14y7[];
extern void _ZN6E22x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x14__8G22x14y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x14[0]),
  (VTBL_ENTRY)&_ZN6E22x143fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C226E22x14__8G22x14y7[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x14y7[] = {
  {&(_ZTV8G22x14y7[6]),  6,12},
  {&(_ZTV8G22x14y7[11]),  11,12},
  {&(_tg__ZTV6E22x14__8G22x14y7[4]),  4,5},
  {&(_tg__ZTV3C226E22x14__8G22x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x14y7[];
extern  VTBL_ENTRY _ZTV8G22x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x14y7[];
Class_Descriptor cd_G22x14y7 = {  "G22x14y7", // class name
  bases_G22x14y7, 6,
  &(vtc_G22x14y7[0]), // expected_vtbl_contents
  &(vtt_G22x14y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G22x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x14y7),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x14y7),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  E23x14  : C23 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E23x143fooEv
  ~E23x14(); // tgen
  E23x14(); // tgen
};
//SIG(-1 E23x14) C1{ BC2{ VBC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E23x14 ::foo(){vfunc_called(this, "_ZN6E23x143fooEv");}
E23x14 ::~E23x14(){ note_dtor("E23x14", this);} // tgen
E23x14 ::E23x14(){ note_ctor("E23x14", this);} // tgen

static void Test_E23x14()
{
  extern Class_Descriptor cd_E23x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E23x14, buf);
    E23x14 *dp, &lv = *(dp=new (buf) E23x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E23x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E23x14)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(24,16), "E23x14");
    check_base_class_offset(lv, (B1*)(C23*), 0, "E23x14");
    check_base_class_offset(lv, (C23*), 0, "E23x14");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E23x14");
    check_field_offset(lv, fd, ABISELECT(16,12), "E23x14.fd");
    test_class_info(&lv, &cd_E23x14);
    dp->~E23x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE23x14(Test_E23x14, "E23x14", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E23x14C1Ev();
extern void _ZN6E23x14D1Ev();
Name_Map name_map_E23x14[] = {
  NSPAIR(_ZN6E23x14C1Ev),
  NSPAIR(_ZN6E23x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x14[] = {
  // 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 _ZTI6E23x14[];
extern void _ZN6E23x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv)();
extern void ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn16_N6E23x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E23x14[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x14[0]),
  (VTBL_ENTRY)&_ZN6E23x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E23x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv),
};
extern VTBL_ENTRY _ZTV6E23x14[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__6E23x14[] = {
  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__6E23x14[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_E23x14[] = {
  {&(_ZTV6E23x14[4]),  4,9},
  {&(_tg__ZTV3C23__6E23x14[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__6E23x14[3]),  3,4},
  {&(_ZTV6E23x14[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6E23x14[];
extern  VTBL_ENTRY _ZTV6E23x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x14[];
static VTBL_ENTRY alt_thunk_names458[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn16_N6E23x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E23x14 = {  "E23x14", // class name
  bases_E23x14, 4,
  &(vtc_E23x14[0]), // expected_vtbl_contents
  &(vtt_E23x14[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E23x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E23x14),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E23x14),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names458,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x14y0  : E23x14 , F1 {
  int ff;
  ~G23x14y0(); // tgen
  G23x14y0(); // tgen
};
//SIG(1 G23x14y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G23x14y0 ::~G23x14y0(){ note_dtor("G23x14y0", this);} // tgen
G23x14y0 ::G23x14y0(){ note_ctor("G23x14y0", this);} // tgen

static void Test_G23x14y0()
{
  extern Class_Descriptor cd_G23x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x14y0, buf);
    G23x14y0 *dp, &lv = *(dp=new (buf) G23x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x14y0)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x14*), ABISELECT(40,28), "G23x14y0");
    check_base_class_offset(lv, (B1*)(C23*)(E23x14*), 0, "G23x14y0");
    check_base_class_offset(lv, (C23*)(E23x14*), 0, "G23x14y0");
    check_base_class_offset(lv, (D0*)(E23x14*), ABISELECT(52,36), "G23x14y0");
    check_base_class_offset(lv, (E23x14*), 0, "G23x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G23x14y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G23x14y0.ff");
    test_class_info(&lv, &cd_G23x14y0);
    dp->~G23x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x14y0(Test_G23x14y0, "G23x14y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G23x14y0C1Ev();
extern void _ZN8G23x14y0D1Ev();
Name_Map name_map_G23x14y0[] = {
  NSPAIR(_ZN8G23x14y0C1Ev),
  NSPAIR(_ZN8G23x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x14;
extern VTBL_ENTRY _ZTI6E23x14[];
extern  VTBL_ENTRY _ZTV6E23x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x14y0[] = {
  // 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_E23x14,    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 _ZTI8G23x14y0[];
extern void _ZN6E23x143fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv)();
extern void ABISELECT(_ZThn40_N6E23x143fooEv,_ZThn28_N6E23x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x14y0[0]),
  (VTBL_ENTRY)&_ZN6E23x143fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G23x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G23x14y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv),
};
extern VTBL_ENTRY _ZTV8G23x14y0[];
extern void _ZN6E23x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x14__8G23x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x14[0]),
  (VTBL_ENTRY)&_ZN6E23x143fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C236E23x14__8G23x14y0[] = {
  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__3C236E23x14__8G23x14y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv)();
extern void ABISELECT(_ZThn40_N6E23x143fooEv,_ZThn28_N6E23x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x14__8G23x14y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E23x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv),
};
static  VTT_ENTRY vtt_G23x14y0[] = {
  {&(_ZTV8G23x14y0[4]),  4,12},
  {&(_tg__ZTV6E23x14__8G23x14y0[4]),  4,5},
  {&(_tg__ZTV3C236E23x14__8G23x14y0[3]),  3,4},
  {&(_tg__ZTV2A1__3C236E23x14__8G23x14y0[3]),  3,4},
  {&(_tg__ZTV2A1__6E23x14__8G23x14y0[3]),  3,4},
  {&(_ZTV8G23x14y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI8G23x14y0[];
extern  VTBL_ENTRY _ZTV8G23x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x14y0[];
static VTBL_ENTRY alt_thunk_names459[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C233fooEv,_ZThn28_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E23x143fooEv,_ZThn28_N6E23x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E23x143fooEv,_ZThn28_N6E23x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x14y0 = {  "G23x14y0", // class name
  bases_G23x14y0, 6,
  &(vtc_G23x14y0[0]), // expected_vtbl_contents
  &(vtt_G23x14y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G23x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x14y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x14y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names459,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x14y1  : virtual E23x14 , F1 {
  int ff;
  ~G23x14y1(); // tgen
  G23x14y1(); // tgen
};
//SIG(1 G23x14y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G23x14y1 ::~G23x14y1(){ note_dtor("G23x14y1", this);} // tgen
G23x14y1 ::G23x14y1(){ note_ctor("G23x14y1", this);} // tgen

static void Test_G23x14y1()
{
  extern Class_Descriptor cd_G23x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x14y1, buf);
    G23x14y1 *dp, &lv = *(dp=new (buf) G23x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x14y1)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x14*), ABISELECT(40,28), "G23x14y1");
    check_base_class_offset(lv, (B1*)(C23*)(E23x14*), ABISELECT(16,12), "G23x14y1");
    check_base_class_offset(lv, (C23*)(E23x14*), ABISELECT(16,12), "G23x14y1");
    check_base_class_offset(lv, (D0*)(E23x14*), ABISELECT(52,36), "G23x14y1");
    check_base_class_offset(lv, (E23x14*), ABISELECT(16,12), "G23x14y1");
    check_base_class_offset(lv, (F1*), 0, "G23x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x14y1.ff");
    test_class_info(&lv, &cd_G23x14y1);
    dp->~G23x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x14y1(Test_G23x14y1, "G23x14y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G23x14y1C1Ev();
extern void _ZN8G23x14y1D1Ev();
Name_Map name_map_G23x14y1[] = {
  NSPAIR(_ZN8G23x14y1C1Ev),
  NSPAIR(_ZN8G23x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x14;
extern VTBL_ENTRY _ZTI6E23x14[];
extern  VTBL_ENTRY _ZTV6E23x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x14y1[] = {
  // 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_E23x14,    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 _ZTI8G23x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E23x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv)();
extern void ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn16_N6E23x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x14y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G23x14y1[0]),
  (VTBL_ENTRY)&_ZN6E23x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G23x14y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv),
};
extern VTBL_ENTRY _ZTV8G23x14y1[];
extern void _ZN6E23x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x14__8G23x14y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x14[0]),
  (VTBL_ENTRY)&_ZN6E23x143fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C236E23x14__8G23x14y1[] = {
  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__3C236E23x14__8G23x14y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv)();
extern void ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn16_N6E23x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x14__8G23x14y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E23x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv),
};
static  VTT_ENTRY vtt_G23x14y1[] = {
  {&(_ZTV8G23x14y1[5]),  5,16},
  {&(_ZTV8G23x14y1[11]),  11,16},
  {&(_ZTV8G23x14y1[15]),  15,16},
  {&(_tg__ZTV6E23x14__8G23x14y1[4]),  4,5},
  {&(_tg__ZTV3C236E23x14__8G23x14y1[3]),  3,4},
  {&(_tg__ZTV2A1__3C236E23x14__8G23x14y1[3]),  3,4},
  {&(_tg__ZTV2A1__6E23x14__8G23x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x14y1[];
extern  VTBL_ENTRY _ZTV8G23x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x14y1[];
static VTBL_ENTRY alt_thunk_names460[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn16_N6E23x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn16_N6E23x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x14y1 = {  "G23x14y1", // class name
  bases_G23x14y1, 6,
  &(vtc_G23x14y1[0]), // expected_vtbl_contents
  &(vtt_G23x14y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G23x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x14y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x14y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names460,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x14y2  : E23x14 , virtual F1 {
  int ff;
  ~G23x14y2(); // tgen
  G23x14y2(); // tgen
};
//SIG(1 G23x14y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G23x14y2 ::~G23x14y2(){ note_dtor("G23x14y2", this);} // tgen
G23x14y2 ::G23x14y2(){ note_ctor("G23x14y2", this);} // tgen

static void Test_G23x14y2()
{
  extern Class_Descriptor cd_G23x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x14y2, buf);
    G23x14y2 *dp, &lv = *(dp=new (buf) G23x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x14y2)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x14*), ABISELECT(24,20), "G23x14y2");
    check_base_class_offset(lv, (B1*)(C23*)(E23x14*), 0, "G23x14y2");
    check_base_class_offset(lv, (C23*)(E23x14*), 0, "G23x14y2");
    check_base_class_offset(lv, (D0*)(E23x14*), ABISELECT(36,28), "G23x14y2");
    check_base_class_offset(lv, (E23x14*), 0, "G23x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G23x14y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G23x14y2.ff");
    test_class_info(&lv, &cd_G23x14y2);
    dp->~G23x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x14y2(Test_G23x14y2, "G23x14y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G23x14y2C1Ev();
extern void _ZN8G23x14y2D1Ev();
Name_Map name_map_G23x14y2[] = {
  NSPAIR(_ZN8G23x14y2C1Ev),
  NSPAIR(_ZN8G23x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x14;
extern VTBL_ENTRY _ZTI6E23x14[];
extern  VTBL_ENTRY _ZTV6E23x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x14y2[] = {
  // 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_E23x14,    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 _ZTI8G23x14y2[];
extern void _ZN6E23x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv)();
extern void ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn20_N6E23x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G23x14y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x14y2[0]),
  (VTBL_ENTRY)&_ZN6E23x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G23x14y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G23x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G23x14y2[];
extern void _ZN6E23x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x14__8G23x14y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x14[0]),
  (VTBL_ENTRY)&_ZN6E23x143fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C236E23x14__8G23x14y2[] = {
  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__3C236E23x14__8G23x14y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv)();
extern void ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn20_N6E23x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x14__8G23x14y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E23x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv),
};
static  VTT_ENTRY vtt_G23x14y2[] = {
  {&(_ZTV8G23x14y2[5]),  5,14},
  {&(_tg__ZTV6E23x14__8G23x14y2[4]),  4,5},
  {&(_tg__ZTV3C236E23x14__8G23x14y2[3]),  3,4},
  {&(_tg__ZTV2A1__3C236E23x14__8G23x14y2[3]),  3,4},
  {&(_tg__ZTV2A1__6E23x14__8G23x14y2[3]),  3,4},
  {&(_ZTV8G23x14y2[9]),  9,14},
  {&(_ZTV8G23x14y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI8G23x14y2[];
extern  VTBL_ENTRY _ZTV8G23x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x14y2[];
static VTBL_ENTRY alt_thunk_names461[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn20_N6E23x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn20_N6E23x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x14y2 = {  "G23x14y2", // class name
  bases_G23x14y2, 6,
  &(vtc_G23x14y2[0]), // expected_vtbl_contents
  &(vtt_G23x14y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G23x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x14y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x14y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names461,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x14y3  : virtual E23x14 , virtual F1 {
  int ff;
  ~G23x14y3(); // tgen
  G23x14y3(); // tgen
};
//SIG(1 G23x14y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G23x14y3 ::~G23x14y3(){ note_dtor("G23x14y3", this);} // tgen
G23x14y3 ::G23x14y3(){ note_ctor("G23x14y3", this);} // tgen

static void Test_G23x14y3()
{
  extern Class_Descriptor cd_G23x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G23x14y3, buf);
    G23x14y3 *dp, &lv = *(dp=new (buf) G23x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G23x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x14y3)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x14*), ABISELECT(40,24), "G23x14y3");
    check_base_class_offset(lv, (B1*)(C23*)(E23x14*), ABISELECT(16,8), "G23x14y3");
    check_base_class_offset(lv, (C23*)(E23x14*), ABISELECT(16,8), "G23x14y3");
    check_base_class_offset(lv, (D0*)(E23x14*), ABISELECT(52,32), "G23x14y3");
    check_base_class_offset(lv, (E23x14*), ABISELECT(16,8), "G23x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G23x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G23x14y3.ff");
    test_class_info(&lv, &cd_G23x14y3);
    dp->~G23x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x14y3(Test_G23x14y3, "G23x14y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G23x14y3C1Ev();
extern void _ZN8G23x14y3D1Ev();
Name_Map name_map_G23x14y3[] = {
  NSPAIR(_ZN8G23x14y3C1Ev),
  NSPAIR(_ZN8G23x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x14;
extern VTBL_ENTRY _ZTI6E23x14[];
extern  VTBL_ENTRY _ZTV6E23x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x14y3[] = {
  // 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_E23x14,    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 _ZTI8G23x14y3[];
extern void _ZN6E23x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv)();
extern void ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn16_N6E23x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G23x14y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x14y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G23x14y3[0]),
  (VTBL_ENTRY)&_ZN6E23x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G23x14y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G23x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G23x14y3[];
extern void _ZN6E23x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x14__8G23x14y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x14[0]),
  (VTBL_ENTRY)&_ZN6E23x143fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C236E23x14__8G23x14y3[] = {
  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__3C236E23x14__8G23x14y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv)();
extern void ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn16_N6E23x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x14__8G23x14y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E23x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv),
};
static  VTT_ENTRY vtt_G23x14y3[] = {
  {&(_ZTV8G23x14y3[6]),  6,20},
  {&(_ZTV8G23x14y3[11]),  11,20},
  {&(_ZTV8G23x14y3[15]),  15,20},
  {&(_ZTV8G23x14y3[19]),  19,20},
  {&(_tg__ZTV6E23x14__8G23x14y3[4]),  4,5},
  {&(_tg__ZTV3C236E23x14__8G23x14y3[3]),  3,4},
  {&(_tg__ZTV2A1__3C236E23x14__8G23x14y3[3]),  3,4},
  {&(_tg__ZTV2A1__6E23x14__8G23x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x14y3[];
extern  VTBL_ENTRY _ZTV8G23x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x14y3[];
static VTBL_ENTRY alt_thunk_names462[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn16_N6E23x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn16_N6E23x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x14y3 = {  "G23x14y3", // class name
  bases_G23x14y3, 6,
  &(vtc_G23x14y3[0]), // expected_vtbl_contents
  &(vtt_G23x14y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G23x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x14y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x14y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names462,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x14y4  : E23x14 , F0 {
  int ff;
  ~G23x14y4(); // tgen
  G23x14y4(); // tgen
};
//SIG(1 G23x14y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G23x14y4 ::~G23x14y4(){ note_dtor("G23x14y4", this);} // tgen
G23x14y4 ::G23x14y4(){ note_ctor("G23x14y4", this);} // tgen

static void Test_G23x14y4()
{
  extern Class_Descriptor cd_G23x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G23x14y4, buf);
    G23x14y4 *dp, &lv = *(dp=new (buf) G23x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G23x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x14y4)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x14*), ABISELECT(32,24), "G23x14y4");
    check_base_class_offset(lv, (B1*)(C23*)(E23x14*), 0, "G23x14y4");
    check_base_class_offset(lv, (C23*)(E23x14*), 0, "G23x14y4");
    check_base_class_offset(lv, (D0*)(E23x14*), ABISELECT(44,32), "G23x14y4");
    check_base_class_offset(lv, (E23x14*), 0, "G23x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G23x14y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G23x14y4.ff");
    test_class_info(&lv, &cd_G23x14y4);
    dp->~G23x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x14y4(Test_G23x14y4, "G23x14y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G23x14y4C1Ev();
extern void _ZN8G23x14y4D1Ev();
Name_Map name_map_G23x14y4[] = {
  NSPAIR(_ZN8G23x14y4C1Ev),
  NSPAIR(_ZN8G23x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x14;
extern VTBL_ENTRY _ZTI6E23x14[];
extern  VTBL_ENTRY _ZTV6E23x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x14y4[] = {
  // 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_E23x14,    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 _ZTI8G23x14y4[];
extern void _ZN6E23x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv)();
extern void ABISELECT(_ZThn32_N6E23x143fooEv,_ZThn24_N6E23x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x14y4[0]),
  (VTBL_ENTRY)&_ZN6E23x143fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G23x14y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv),
};
extern VTBL_ENTRY _ZTV8G23x14y4[];
extern void _ZN6E23x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x14__8G23x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x14[0]),
  (VTBL_ENTRY)&_ZN6E23x143fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C236E23x14__8G23x14y4[] = {
  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__3C236E23x14__8G23x14y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv)();
extern void ABISELECT(_ZThn32_N6E23x143fooEv,_ZThn24_N6E23x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x14__8G23x14y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E23x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv),
};
static  VTT_ENTRY vtt_G23x14y4[] = {
  {&(_ZTV8G23x14y4[4]),  4,9},
  {&(_tg__ZTV6E23x14__8G23x14y4[4]),  4,5},
  {&(_tg__ZTV3C236E23x14__8G23x14y4[3]),  3,4},
  {&(_tg__ZTV2A1__3C236E23x14__8G23x14y4[3]),  3,4},
  {&(_tg__ZTV2A1__6E23x14__8G23x14y4[3]),  3,4},
  {&(_ZTV8G23x14y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G23x14y4[];
extern  VTBL_ENTRY _ZTV8G23x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x14y4[];
static VTBL_ENTRY alt_thunk_names463[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x143fooEv,_ZThn24_N6E23x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x143fooEv,_ZThn24_N6E23x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x14y4 = {  "G23x14y4", // class name
  bases_G23x14y4, 6,
  &(vtc_G23x14y4[0]), // expected_vtbl_contents
  &(vtt_G23x14y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G23x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x14y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x14y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names463,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x14y5  : virtual E23x14 , F0 {
  int ff;
  ~G23x14y5(); // tgen
  G23x14y5(); // tgen
};
//SIG(1 G23x14y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G23x14y5 ::~G23x14y5(){ note_dtor("G23x14y5", this);} // tgen
G23x14y5 ::G23x14y5(){ note_ctor("G23x14y5", this);} // tgen

static void Test_G23x14y5()
{
  extern Class_Descriptor cd_G23x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x14y5, buf);
    G23x14y5 *dp, &lv = *(dp=new (buf) G23x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x14y5)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x14*), ABISELECT(40,28), "G23x14y5");
    check_base_class_offset(lv, (B1*)(C23*)(E23x14*), ABISELECT(16,12), "G23x14y5");
    check_base_class_offset(lv, (C23*)(E23x14*), ABISELECT(16,12), "G23x14y5");
    check_base_class_offset(lv, (D0*)(E23x14*), ABISELECT(52,36), "G23x14y5");
    check_base_class_offset(lv, (E23x14*), ABISELECT(16,12), "G23x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G23x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x14y5.ff");
    test_class_info(&lv, &cd_G23x14y5);
    dp->~G23x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x14y5(Test_G23x14y5, "G23x14y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G23x14y5C1Ev();
extern void _ZN8G23x14y5D1Ev();
Name_Map name_map_G23x14y5[] = {
  NSPAIR(_ZN8G23x14y5C1Ev),
  NSPAIR(_ZN8G23x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x14;
extern VTBL_ENTRY _ZTI6E23x14[];
extern  VTBL_ENTRY _ZTV6E23x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x14y5[] = {
  // 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_E23x14,    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 _ZTI8G23x14y5[];
extern void _ZN6E23x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv)();
extern void ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn16_N6E23x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x14y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x14y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G23x14y5[0]),
  (VTBL_ENTRY)&_ZN6E23x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G23x14y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv),
};
extern VTBL_ENTRY _ZTV8G23x14y5[];
extern void _ZN6E23x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x14__8G23x14y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x14[0]),
  (VTBL_ENTRY)&_ZN6E23x143fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C236E23x14__8G23x14y5[] = {
  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__3C236E23x14__8G23x14y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv)();
extern void ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn16_N6E23x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x14__8G23x14y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E23x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv),
};
static  VTT_ENTRY vtt_G23x14y5[] = {
  {&(_ZTV8G23x14y5[5]),  5,15},
  {&(_ZTV8G23x14y5[10]),  10,15},
  {&(_ZTV8G23x14y5[14]),  14,15},
  {&(_tg__ZTV6E23x14__8G23x14y5[4]),  4,5},
  {&(_tg__ZTV3C236E23x14__8G23x14y5[3]),  3,4},
  {&(_tg__ZTV2A1__3C236E23x14__8G23x14y5[3]),  3,4},
  {&(_tg__ZTV2A1__6E23x14__8G23x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x14y5[];
extern  VTBL_ENTRY _ZTV8G23x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x14y5[];
static VTBL_ENTRY alt_thunk_names464[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn16_N6E23x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn16_N6E23x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x14y5 = {  "G23x14y5", // class name
  bases_G23x14y5, 6,
  &(vtc_G23x14y5[0]), // expected_vtbl_contents
  &(vtt_G23x14y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G23x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x14y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x14y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names464,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x14y6  : E23x14 , virtual F0 {
  int ff;
  ~G23x14y6(); // tgen
  G23x14y6(); // tgen
};
//SIG(1 G23x14y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G23x14y6 ::~G23x14y6(){ note_dtor("G23x14y6", this);} // tgen
G23x14y6 ::G23x14y6(){ note_ctor("G23x14y6", this);} // tgen

static void Test_G23x14y6()
{
  extern Class_Descriptor cd_G23x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G23x14y6, buf);
    G23x14y6 *dp, &lv = *(dp=new (buf) G23x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G23x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x14y6)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x14*), ABISELECT(24,20), "G23x14y6");
    check_base_class_offset(lv, (B1*)(C23*)(E23x14*), 0, "G23x14y6");
    check_base_class_offset(lv, (C23*)(E23x14*), 0, "G23x14y6");
    check_base_class_offset(lv, (D0*)(E23x14*), ABISELECT(36,28), "G23x14y6");
    check_base_class_offset(lv, (E23x14*), 0, "G23x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G23x14y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G23x14y6.ff");
    test_class_info(&lv, &cd_G23x14y6);
    dp->~G23x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x14y6(Test_G23x14y6, "G23x14y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G23x14y6C1Ev();
extern void _ZN8G23x14y6D1Ev();
Name_Map name_map_G23x14y6[] = {
  NSPAIR(_ZN8G23x14y6C1Ev),
  NSPAIR(_ZN8G23x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x14;
extern VTBL_ENTRY _ZTI6E23x14[];
extern  VTBL_ENTRY _ZTV6E23x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x14y6[] = {
  // 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_E23x14,    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 _ZTI8G23x14y6[];
extern void _ZN6E23x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv)();
extern void ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn20_N6E23x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x14y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x14y6[0]),
  (VTBL_ENTRY)&_ZN6E23x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G23x14y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv),
};
extern VTBL_ENTRY _ZTV8G23x14y6[];
extern void _ZN6E23x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x14__8G23x14y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x14[0]),
  (VTBL_ENTRY)&_ZN6E23x143fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C236E23x14__8G23x14y6[] = {
  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__3C236E23x14__8G23x14y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv)();
extern void ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn20_N6E23x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x14__8G23x14y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E23x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv),
};
static  VTT_ENTRY vtt_G23x14y6[] = {
  {&(_ZTV8G23x14y6[5]),  5,10},
  {&(_tg__ZTV6E23x14__8G23x14y6[4]),  4,5},
  {&(_tg__ZTV3C236E23x14__8G23x14y6[3]),  3,4},
  {&(_tg__ZTV2A1__3C236E23x14__8G23x14y6[3]),  3,4},
  {&(_tg__ZTV2A1__6E23x14__8G23x14y6[3]),  3,4},
  {&(_ZTV8G23x14y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G23x14y6[];
extern  VTBL_ENTRY _ZTV8G23x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x14y6[];
static VTBL_ENTRY alt_thunk_names465[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn20_N6E23x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn20_N6E23x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x14y6 = {  "G23x14y6", // class name
  bases_G23x14y6, 6,
  &(vtc_G23x14y6[0]), // expected_vtbl_contents
  &(vtt_G23x14y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G23x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x14y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x14y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names465,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x14y7  : virtual E23x14 , virtual F0 {
  int ff;
  ~G23x14y7(); // tgen
  G23x14y7(); // tgen
};
//SIG(1 G23x14y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G23x14y7 ::~G23x14y7(){ note_dtor("G23x14y7", this);} // tgen
G23x14y7 ::G23x14y7(){ note_ctor("G23x14y7", this);} // tgen

static void Test_G23x14y7()
{
  extern Class_Descriptor cd_G23x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G23x14y7, buf);
    G23x14y7 *dp, &lv = *(dp=new (buf) G23x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G23x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x14y7)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x14*), ABISELECT(40,24), "G23x14y7");
    check_base_class_offset(lv, (B1*)(C23*)(E23x14*), ABISELECT(16,8), "G23x14y7");
    check_base_class_offset(lv, (C23*)(E23x14*), ABISELECT(16,8), "G23x14y7");
    check_base_class_offset(lv, (D0*)(E23x14*), ABISELECT(52,32), "G23x14y7");
    check_base_class_offset(lv, (E23x14*), ABISELECT(16,8), "G23x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G23x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G23x14y7.ff");
    test_class_info(&lv, &cd_G23x14y7);
    dp->~G23x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x14y7(Test_G23x14y7, "G23x14y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G23x14y7C1Ev();
extern void _ZN8G23x14y7D1Ev();
Name_Map name_map_G23x14y7[] = {
  NSPAIR(_ZN8G23x14y7C1Ev),
  NSPAIR(_ZN8G23x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x14;
extern VTBL_ENTRY _ZTI6E23x14[];
extern  VTBL_ENTRY _ZTV6E23x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x14y7[] = {
  // 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_E23x14,    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 _ZTI8G23x14y7[];
extern void _ZN6E23x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv)();
extern void ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn16_N6E23x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x14y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x14y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G23x14y7[0]),
  (VTBL_ENTRY)&_ZN6E23x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G23x14y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv),
};
extern VTBL_ENTRY _ZTV8G23x14y7[];
extern void _ZN6E23x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x14__8G23x14y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x14[0]),
  (VTBL_ENTRY)&_ZN6E23x143fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C236E23x14__8G23x14y7[] = {
  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__3C236E23x14__8G23x14y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv)();
extern void ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn16_N6E23x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x14__8G23x14y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E23x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv),
};
static  VTT_ENTRY vtt_G23x14y7[] = {
  {&(_ZTV8G23x14y7[6]),  6,16},
  {&(_ZTV8G23x14y7[11]),  11,16},
  {&(_ZTV8G23x14y7[15]),  15,16},
  {&(_tg__ZTV6E23x14__8G23x14y7[4]),  4,5},
  {&(_tg__ZTV3C236E23x14__8G23x14y7[3]),  3,4},
  {&(_tg__ZTV2A1__3C236E23x14__8G23x14y7[3]),  3,4},
  {&(_tg__ZTV2A1__6E23x14__8G23x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x14y7[];
extern  VTBL_ENTRY _ZTV8G23x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x14y7[];
static VTBL_ENTRY alt_thunk_names466[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x143fooEv,_ZTv0_n12_N6E23x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn16_N6E23x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x143fooEv,_ZThn16_N6E23x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x14y7 = {  "G23x14y7", // class name
  bases_G23x14y7, 6,
  &(vtc_G23x14y7[0]), // expected_vtbl_contents
  &(vtt_G23x14y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G23x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x14y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x14y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names466,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E24x14  : C24 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E24x143fooEv
  ~E24x14(); // tgen
  E24x14(); // tgen
};
//SIG(-1 E24x14) C1{ BC2{ BC3{ Fi} VBC4{ Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E24x14 ::foo(){vfunc_called(this, "_ZN6E24x143fooEv");}
E24x14 ::~E24x14(){ note_dtor("E24x14", this);} // tgen
E24x14 ::E24x14(){ note_ctor("E24x14", this);} // tgen

static void Test_E24x14()
{
  extern Class_Descriptor cd_E24x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E24x14, buf);
    E24x14 *dp, &lv = *(dp=new (buf) E24x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E24x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E24x14)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(8,4), "E24x14");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(20,16), "E24x14");
    check_base_class_offset(lv, (C24*), 0, "E24x14");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E24x14");
    check_field_offset(lv, fd, ABISELECT(16,12), "E24x14.fd");
    test_class_info(&lv, &cd_E24x14);
    dp->~E24x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE24x14(Test_E24x14, "E24x14", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6E24x14C1Ev();
extern void _ZN6E24x14D1Ev();
Name_Map name_map_E24x14[] = {
  NSPAIR(_ZN6E24x14C1Ev),
  NSPAIR(_ZN6E24x14D1Ev),
  {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_E24x14[] = {
  // 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 _ZTI6E24x14[];
extern void _ZN6E24x143fooEv();
static  VTBL_ENTRY vtc_E24x14[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x14[0]),
  (VTBL_ENTRY)&_ZN6E24x143fooEv,
};
extern VTBL_ENTRY _ZTV6E24x14[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__6E24x14[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_E24x14[] = {
  {&(_ZTV6E24x14[4]),  4,5},
  {&(_tg__ZTV3C24__6E24x14[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E24x14[];
extern  VTBL_ENTRY _ZTV6E24x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x14[];
Class_Descriptor cd_E24x14 = {  "E24x14", // class name
  bases_E24x14, 4,
  &(vtc_E24x14[0]), // expected_vtbl_contents
  &(vtt_E24x14[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6E24x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E24x14),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E24x14),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  G24x14y0  : E24x14 , F1 {
  int ff;
  ~G24x14y0(); // tgen
  G24x14y0(); // tgen
};
//SIG(1 G24x14y0) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G24x14y0 ::~G24x14y0(){ note_dtor("G24x14y0", this);} // tgen
G24x14y0 ::G24x14y0(){ note_ctor("G24x14y0", this);} // tgen

static void Test_G24x14y0()
{
  extern Class_Descriptor cd_G24x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x14y0, buf);
    G24x14y0 *dp, &lv = *(dp=new (buf) G24x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x14y0)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x14*), ABISELECT(8,4), "G24x14y0");
    check_base_class_offset(lv, (B0*)(C24*)(E24x14*), ABISELECT(40,28), "G24x14y0");
    check_base_class_offset(lv, (C24*)(E24x14*), 0, "G24x14y0");
    check_base_class_offset(lv, (D0*)(E24x14*), ABISELECT(44,32), "G24x14y0");
    check_base_class_offset(lv, (E24x14*), 0, "G24x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G24x14y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G24x14y0.ff");
    test_class_info(&lv, &cd_G24x14y0);
    dp->~G24x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x14y0(Test_G24x14y0, "G24x14y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G24x14y0C1Ev();
extern void _ZN8G24x14y0D1Ev();
Name_Map name_map_G24x14y0[] = {
  NSPAIR(_ZN8G24x14y0C1Ev),
  NSPAIR(_ZN8G24x14y0D1Ev),
  {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_E24x14;
extern VTBL_ENTRY _ZTI6E24x14[];
extern  VTBL_ENTRY _ZTV6E24x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x14y0[] = {
  // 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_E24x14,    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 _ZTI8G24x14y0[];
extern void _ZN6E24x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x14y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x14y0[0]),
  (VTBL_ENTRY)&_ZN6E24x143fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G24x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G24x14y0[];
extern void _ZN6E24x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x14__8G24x14y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x14[0]),
  (VTBL_ENTRY)&_ZN6E24x143fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C246E24x14__8G24x14y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x14y0[] = {
  {&(_ZTV8G24x14y0[4]),  4,8},
  {&(_tg__ZTV6E24x14__8G24x14y0[4]),  4,5},
  {&(_tg__ZTV3C246E24x14__8G24x14y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x14y0[];
extern  VTBL_ENTRY _ZTV8G24x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x14y0[];
Class_Descriptor cd_G24x14y0 = {  "G24x14y0", // class name
  bases_G24x14y0, 6,
  &(vtc_G24x14y0[0]), // expected_vtbl_contents
  &(vtt_G24x14y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G24x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x14y0),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x14y0),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  G24x14y1  : virtual E24x14 , F1 {
  int ff;
  ~G24x14y1(); // tgen
  G24x14y1(); // tgen
};
//SIG(1 G24x14y1) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G24x14y1 ::~G24x14y1(){ note_dtor("G24x14y1", this);} // tgen
G24x14y1 ::G24x14y1(){ note_ctor("G24x14y1", this);} // tgen

static void Test_G24x14y1()
{
  extern Class_Descriptor cd_G24x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x14y1, buf);
    G24x14y1 *dp, &lv = *(dp=new (buf) G24x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x14y1)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x14*), ABISELECT(24,16), "G24x14y1");
    check_base_class_offset(lv, (B0*)(C24*)(E24x14*), ABISELECT(36,28), "G24x14y1");
    check_base_class_offset(lv, (C24*)(E24x14*), ABISELECT(16,12), "G24x14y1");
    check_base_class_offset(lv, (D0*)(E24x14*), ABISELECT(40,32), "G24x14y1");
    check_base_class_offset(lv, (E24x14*), ABISELECT(16,12), "G24x14y1");
    check_base_class_offset(lv, (F1*), 0, "G24x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x14y1.ff");
    test_class_info(&lv, &cd_G24x14y1);
    dp->~G24x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x14y1(Test_G24x14y1, "G24x14y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G24x14y1C1Ev();
extern void _ZN8G24x14y1D1Ev();
Name_Map name_map_G24x14y1[] = {
  NSPAIR(_ZN8G24x14y1C1Ev),
  NSPAIR(_ZN8G24x14y1D1Ev),
  {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_E24x14;
extern VTBL_ENTRY _ZTI6E24x14[];
extern  VTBL_ENTRY _ZTV6E24x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x14y1[] = {
  // 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_E24x14,    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 _ZTI8G24x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E24x143fooEv();
static  VTBL_ENTRY vtc_G24x14y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G24x14y1[0]),
  (VTBL_ENTRY)&_ZN6E24x143fooEv,
};
extern VTBL_ENTRY _ZTV8G24x14y1[];
extern void _ZN6E24x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x14__8G24x14y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x14[0]),
  (VTBL_ENTRY)&_ZN6E24x143fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C246E24x14__8G24x14y1[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x14y1[] = {
  {&(_ZTV8G24x14y1[5]),  5,12},
  {&(_ZTV8G24x14y1[11]),  11,12},
  {&(_tg__ZTV6E24x14__8G24x14y1[4]),  4,5},
  {&(_tg__ZTV3C246E24x14__8G24x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x14y1[];
extern  VTBL_ENTRY _ZTV8G24x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x14y1[];
Class_Descriptor cd_G24x14y1 = {  "G24x14y1", // class name
  bases_G24x14y1, 6,
  &(vtc_G24x14y1[0]), // expected_vtbl_contents
  &(vtt_G24x14y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G24x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x14y1),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x14y1),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  G24x14y2  : E24x14 , virtual F1 {
  int ff;
  ~G24x14y2(); // tgen
  G24x14y2(); // tgen
};
//SIG(1 G24x14y2) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G24x14y2 ::~G24x14y2(){ note_dtor("G24x14y2", this);} // tgen
G24x14y2 ::G24x14y2(){ note_ctor("G24x14y2", this);} // tgen

static void Test_G24x14y2()
{
  extern Class_Descriptor cd_G24x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x14y2, buf);
    G24x14y2 *dp, &lv = *(dp=new (buf) G24x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x14y2)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x14*), ABISELECT(8,4), "G24x14y2");
    check_base_class_offset(lv, (B0*)(C24*)(E24x14*), ABISELECT(24,20), "G24x14y2");
    check_base_class_offset(lv, (C24*)(E24x14*), 0, "G24x14y2");
    check_base_class_offset(lv, (D0*)(E24x14*), ABISELECT(28,24), "G24x14y2");
    check_base_class_offset(lv, (E24x14*), 0, "G24x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G24x14y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G24x14y2.ff");
    test_class_info(&lv, &cd_G24x14y2);
    dp->~G24x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x14y2(Test_G24x14y2, "G24x14y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G24x14y2C1Ev();
extern void _ZN8G24x14y2D1Ev();
Name_Map name_map_G24x14y2[] = {
  NSPAIR(_ZN8G24x14y2C1Ev),
  NSPAIR(_ZN8G24x14y2D1Ev),
  {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_E24x14;
extern VTBL_ENTRY _ZTI6E24x14[];
extern  VTBL_ENTRY _ZTV6E24x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x14y2[] = {
  // 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_E24x14,    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 _ZTI8G24x14y2[];
extern void _ZN6E24x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x14y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x14y2[0]),
  (VTBL_ENTRY)&_ZN6E24x143fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G24x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G24x14y2[];
extern void _ZN6E24x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x14__8G24x14y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x14[0]),
  (VTBL_ENTRY)&_ZN6E24x143fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C246E24x14__8G24x14y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x14y2[] = {
  {&(_ZTV8G24x14y2[5]),  5,10},
  {&(_tg__ZTV6E24x14__8G24x14y2[4]),  4,5},
  {&(_tg__ZTV3C246E24x14__8G24x14y2[3]),  3,4},
  {&(_ZTV8G24x14y2[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G24x14y2[];
extern  VTBL_ENTRY _ZTV8G24x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x14y2[];
Class_Descriptor cd_G24x14y2 = {  "G24x14y2", // class name
  bases_G24x14y2, 6,
  &(vtc_G24x14y2[0]), // expected_vtbl_contents
  &(vtt_G24x14y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G24x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x14y2),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x14y2),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  G24x14y3  : virtual E24x14 , virtual F1 {
  int ff;
  ~G24x14y3(); // tgen
  G24x14y3(); // tgen
};
//SIG(1 G24x14y3) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G24x14y3 ::~G24x14y3(){ note_dtor("G24x14y3", this);} // tgen
G24x14y3 ::G24x14y3(){ note_ctor("G24x14y3", this);} // tgen

static void Test_G24x14y3()
{
  extern Class_Descriptor cd_G24x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G24x14y3, buf);
    G24x14y3 *dp, &lv = *(dp=new (buf) G24x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G24x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x14y3)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x14*), ABISELECT(24,12), "G24x14y3");
    check_base_class_offset(lv, (B0*)(C24*)(E24x14*), ABISELECT(36,24), "G24x14y3");
    check_base_class_offset(lv, (C24*)(E24x14*), ABISELECT(16,8), "G24x14y3");
    check_base_class_offset(lv, (D0*)(E24x14*), ABISELECT(40,28), "G24x14y3");
    check_base_class_offset(lv, (E24x14*), ABISELECT(16,8), "G24x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G24x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G24x14y3.ff");
    test_class_info(&lv, &cd_G24x14y3);
    dp->~G24x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x14y3(Test_G24x14y3, "G24x14y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G24x14y3C1Ev();
extern void _ZN8G24x14y3D1Ev();
Name_Map name_map_G24x14y3[] = {
  NSPAIR(_ZN8G24x14y3C1Ev),
  NSPAIR(_ZN8G24x14y3D1Ev),
  {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_E24x14;
extern VTBL_ENTRY _ZTI6E24x14[];
extern  VTBL_ENTRY _ZTV6E24x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x14y3[] = {
  // 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_E24x14,    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 _ZTI8G24x14y3[];
extern void _ZN6E24x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x14y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x14y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G24x14y3[0]),
  (VTBL_ENTRY)&_ZN6E24x143fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G24x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G24x14y3[];
extern void _ZN6E24x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x14__8G24x14y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x14[0]),
  (VTBL_ENTRY)&_ZN6E24x143fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C246E24x14__8G24x14y3[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x14y3[] = {
  {&(_ZTV8G24x14y3[6]),  6,16},
  {&(_ZTV8G24x14y3[11]),  11,16},
  {&(_ZTV8G24x14y3[15]),  15,16},
  {&(_tg__ZTV6E24x14__8G24x14y3[4]),  4,5},
  {&(_tg__ZTV3C246E24x14__8G24x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x14y3[];
extern  VTBL_ENTRY _ZTV8G24x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x14y3[];
Class_Descriptor cd_G24x14y3 = {  "G24x14y3", // class name
  bases_G24x14y3, 6,
  &(vtc_G24x14y3[0]), // expected_vtbl_contents
  &(vtt_G24x14y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G24x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x14y3),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x14y3),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  G24x14y4  : E24x14 , F0 {
  int ff;
  ~G24x14y4(); // tgen
  G24x14y4(); // tgen
};
//SIG(1 G24x14y4) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G24x14y4 ::~G24x14y4(){ note_dtor("G24x14y4", this);} // tgen
G24x14y4 ::G24x14y4(){ note_ctor("G24x14y4", this);} // tgen

static void Test_G24x14y4()
{
  extern Class_Descriptor cd_G24x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G24x14y4, buf);
    G24x14y4 *dp, &lv = *(dp=new (buf) G24x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G24x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x14y4)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x14*), ABISELECT(8,4), "G24x14y4");
    check_base_class_offset(lv, (B0*)(C24*)(E24x14*), ABISELECT(28,24), "G24x14y4");
    check_base_class_offset(lv, (C24*)(E24x14*), 0, "G24x14y4");
    check_base_class_offset(lv, (D0*)(E24x14*), ABISELECT(32,28), "G24x14y4");
    check_base_class_offset(lv, (E24x14*), 0, "G24x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G24x14y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G24x14y4.ff");
    test_class_info(&lv, &cd_G24x14y4);
    dp->~G24x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x14y4(Test_G24x14y4, "G24x14y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G24x14y4C1Ev();
extern void _ZN8G24x14y4D1Ev();
Name_Map name_map_G24x14y4[] = {
  NSPAIR(_ZN8G24x14y4C1Ev),
  NSPAIR(_ZN8G24x14y4D1Ev),
  {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_E24x14;
extern VTBL_ENTRY _ZTI6E24x14[];
extern  VTBL_ENTRY _ZTV6E24x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x14y4[] = {
  // 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_E24x14,    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 _ZTI8G24x14y4[];
extern void _ZN6E24x143fooEv();
static  VTBL_ENTRY vtc_G24x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x14y4[0]),
  (VTBL_ENTRY)&_ZN6E24x143fooEv,
};
extern VTBL_ENTRY _ZTV8G24x14y4[];
extern void _ZN6E24x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x14__8G24x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x14[0]),
  (VTBL_ENTRY)&_ZN6E24x143fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C246E24x14__8G24x14y4[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x14y4[] = {
  {&(_ZTV8G24x14y4[4]),  4,5},
  {&(_tg__ZTV6E24x14__8G24x14y4[4]),  4,5},
  {&(_tg__ZTV3C246E24x14__8G24x14y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x14y4[];
extern  VTBL_ENTRY _ZTV8G24x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x14y4[];
Class_Descriptor cd_G24x14y4 = {  "G24x14y4", // class name
  bases_G24x14y4, 6,
  &(vtc_G24x14y4[0]), // expected_vtbl_contents
  &(vtt_G24x14y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G24x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x14y4),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x14y4),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  G24x14y5  : virtual E24x14 , F0 {
  int ff;
  ~G24x14y5(); // tgen
  G24x14y5(); // tgen
};
//SIG(1 G24x14y5) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G24x14y5 ::~G24x14y5(){ note_dtor("G24x14y5", this);} // tgen
G24x14y5 ::G24x14y5(){ note_ctor("G24x14y5", this);} // tgen

static void Test_G24x14y5()
{
  extern Class_Descriptor cd_G24x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x14y5, buf);
    G24x14y5 *dp, &lv = *(dp=new (buf) G24x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x14y5)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x14*), ABISELECT(24,16), "G24x14y5");
    check_base_class_offset(lv, (B0*)(C24*)(E24x14*), ABISELECT(36,28), "G24x14y5");
    check_base_class_offset(lv, (C24*)(E24x14*), ABISELECT(16,12), "G24x14y5");
    check_base_class_offset(lv, (D0*)(E24x14*), ABISELECT(40,32), "G24x14y5");
    check_base_class_offset(lv, (E24x14*), ABISELECT(16,12), "G24x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G24x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x14y5.ff");
    test_class_info(&lv, &cd_G24x14y5);
    dp->~G24x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x14y5(Test_G24x14y5, "G24x14y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G24x14y5C1Ev();
extern void _ZN8G24x14y5D1Ev();
Name_Map name_map_G24x14y5[] = {
  NSPAIR(_ZN8G24x14y5C1Ev),
  NSPAIR(_ZN8G24x14y5D1Ev),
  {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_E24x14;
extern VTBL_ENTRY _ZTI6E24x14[];
extern  VTBL_ENTRY _ZTV6E24x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x14y5[] = {
  // 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_E24x14,    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 _ZTI8G24x14y5[];
extern void _ZN6E24x143fooEv();
static  VTBL_ENTRY vtc_G24x14y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x14y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G24x14y5[0]),
  (VTBL_ENTRY)&_ZN6E24x143fooEv,
};
extern VTBL_ENTRY _ZTV8G24x14y5[];
extern void _ZN6E24x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x14__8G24x14y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x14[0]),
  (VTBL_ENTRY)&_ZN6E24x143fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C246E24x14__8G24x14y5[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x14y5[] = {
  {&(_ZTV8G24x14y5[5]),  5,11},
  {&(_ZTV8G24x14y5[10]),  10,11},
  {&(_tg__ZTV6E24x14__8G24x14y5[4]),  4,5},
  {&(_tg__ZTV3C246E24x14__8G24x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x14y5[];
extern  VTBL_ENTRY _ZTV8G24x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x14y5[];
Class_Descriptor cd_G24x14y5 = {  "G24x14y5", // class name
  bases_G24x14y5, 6,
  &(vtc_G24x14y5[0]), // expected_vtbl_contents
  &(vtt_G24x14y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G24x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x14y5),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x14y5),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  G24x14y6  : E24x14 , virtual F0 {
  int ff;
  ~G24x14y6(); // tgen
  G24x14y6(); // tgen
};
//SIG(1 G24x14y6) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G24x14y6 ::~G24x14y6(){ note_dtor("G24x14y6", this);} // tgen
G24x14y6 ::G24x14y6(){ note_ctor("G24x14y6", this);} // tgen

static void Test_G24x14y6()
{
  extern Class_Descriptor cd_G24x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G24x14y6, buf);
    G24x14y6 *dp, &lv = *(dp=new (buf) G24x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G24x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x14y6)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x14*), ABISELECT(8,4), "G24x14y6");
    check_base_class_offset(lv, (B0*)(C24*)(E24x14*), ABISELECT(24,20), "G24x14y6");
    check_base_class_offset(lv, (C24*)(E24x14*), 0, "G24x14y6");
    check_base_class_offset(lv, (D0*)(E24x14*), ABISELECT(28,24), "G24x14y6");
    check_base_class_offset(lv, (E24x14*), 0, "G24x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G24x14y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G24x14y6.ff");
    test_class_info(&lv, &cd_G24x14y6);
    dp->~G24x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x14y6(Test_G24x14y6, "G24x14y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G24x14y6C1Ev();
extern void _ZN8G24x14y6D1Ev();
Name_Map name_map_G24x14y6[] = {
  NSPAIR(_ZN8G24x14y6C1Ev),
  NSPAIR(_ZN8G24x14y6D1Ev),
  {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_E24x14;
extern VTBL_ENTRY _ZTI6E24x14[];
extern  VTBL_ENTRY _ZTV6E24x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x14y6[] = {
  // 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_E24x14,    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 _ZTI8G24x14y6[];
extern void _ZN6E24x143fooEv();
static  VTBL_ENTRY vtc_G24x14y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x14y6[0]),
  (VTBL_ENTRY)&_ZN6E24x143fooEv,
};
extern VTBL_ENTRY _ZTV8G24x14y6[];
extern void _ZN6E24x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x14__8G24x14y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x14[0]),
  (VTBL_ENTRY)&_ZN6E24x143fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C246E24x14__8G24x14y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x14y6[] = {
  {&(_ZTV8G24x14y6[5]),  5,6},
  {&(_tg__ZTV6E24x14__8G24x14y6[4]),  4,5},
  {&(_tg__ZTV3C246E24x14__8G24x14y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x14y6[];
extern  VTBL_ENTRY _ZTV8G24x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x14y6[];
Class_Descriptor cd_G24x14y6 = {  "G24x14y6", // class name
  bases_G24x14y6, 6,
  &(vtc_G24x14y6[0]), // expected_vtbl_contents
  &(vtt_G24x14y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G24x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x14y6),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x14y6),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  G24x14y7  : virtual E24x14 , virtual F0 {
  int ff;
  ~G24x14y7(); // tgen
  G24x14y7(); // tgen
};
//SIG(1 G24x14y7) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G24x14y7 ::~G24x14y7(){ note_dtor("G24x14y7", this);} // tgen
G24x14y7 ::G24x14y7(){ note_ctor("G24x14y7", this);} // tgen

static void Test_G24x14y7()
{
  extern Class_Descriptor cd_G24x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x14y7, buf);
    G24x14y7 *dp, &lv = *(dp=new (buf) G24x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x14y7)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x14*), ABISELECT(24,12), "G24x14y7");
    check_base_class_offset(lv, (B0*)(C24*)(E24x14*), ABISELECT(36,24), "G24x14y7");
    check_base_class_offset(lv, (C24*)(E24x14*), ABISELECT(16,8), "G24x14y7");
    check_base_class_offset(lv, (D0*)(E24x14*), ABISELECT(40,28), "G24x14y7");
    check_base_class_offset(lv, (E24x14*), ABISELECT(16,8), "G24x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G24x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G24x14y7.ff");
    test_class_info(&lv, &cd_G24x14y7);
    dp->~G24x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x14y7(Test_G24x14y7, "G24x14y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G24x14y7C1Ev();
extern void _ZN8G24x14y7D1Ev();
Name_Map name_map_G24x14y7[] = {
  NSPAIR(_ZN8G24x14y7C1Ev),
  NSPAIR(_ZN8G24x14y7D1Ev),
  {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_E24x14;
extern VTBL_ENTRY _ZTI6E24x14[];
extern  VTBL_ENTRY _ZTV6E24x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x14y7[] = {
  // 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_E24x14,    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 _ZTI8G24x14y7[];
extern void _ZN6E24x143fooEv();
static  VTBL_ENTRY vtc_G24x14y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x14y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G24x14y7[0]),
  (VTBL_ENTRY)&_ZN6E24x143fooEv,
};
extern VTBL_ENTRY _ZTV8G24x14y7[];
extern void _ZN6E24x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x14__8G24x14y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x14[0]),
  (VTBL_ENTRY)&_ZN6E24x143fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C246E24x14__8G24x14y7[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x14y7[] = {
  {&(_ZTV8G24x14y7[6]),  6,12},
  {&(_ZTV8G24x14y7[11]),  11,12},
  {&(_tg__ZTV6E24x14__8G24x14y7[4]),  4,5},
  {&(_tg__ZTV3C246E24x14__8G24x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x14y7[];
extern  VTBL_ENTRY _ZTV8G24x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x14y7[];
Class_Descriptor cd_G24x14y7 = {  "G24x14y7", // class name
  bases_G24x14y7, 6,
  &(vtc_G24x14y7[0]), // expected_vtbl_contents
  &(vtt_G24x14y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G24x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x14y7),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x14y7),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  E25x14  : C25 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E25x143fooEv
  ~E25x14(); // tgen
  E25x14(); // tgen
};
//SIG(-1 E25x14) C1{ BC2{ BC3{ v1 Fi} VBC4{ Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E25x14 ::foo(){vfunc_called(this, "_ZN6E25x143fooEv");}
E25x14 ::~E25x14(){ note_dtor("E25x14", this);} // tgen
E25x14 ::E25x14(){ note_ctor("E25x14", this);} // tgen

static void Test_E25x14()
{
  extern Class_Descriptor cd_E25x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E25x14, buf);
    E25x14 *dp, &lv = *(dp=new (buf) E25x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E25x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E25x14)");
    check_base_class_offset(lv, (A1*)(C25*), 0, "E25x14");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(20,16), "E25x14");
    check_base_class_offset(lv, (C25*), 0, "E25x14");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E25x14");
    check_field_offset(lv, fd, ABISELECT(16,12), "E25x14.fd");
    test_class_info(&lv, &cd_E25x14);
    dp->~E25x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE25x14(Test_E25x14, "E25x14", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6E25x14C1Ev();
extern void _ZN6E25x14D1Ev();
Name_Map name_map_E25x14[] = {
  NSPAIR(_ZN6E25x14C1Ev),
  NSPAIR(_ZN6E25x14D1Ev),
  {0,0}
};
extern Class_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_E25x14[] = {
  // 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 _ZTI6E25x14[];
extern void _ZN6E25x143fooEv();
static  VTBL_ENTRY vtc_E25x14[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x14[0]),
  (VTBL_ENTRY)&_ZN6E25x143fooEv,
};
extern VTBL_ENTRY _ZTV6E25x14[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__6E25x14[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_E25x14[] = {
  {&(_ZTV6E25x14[4]),  4,5},
  {&(_tg__ZTV3C25__6E25x14[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E25x14[];
extern  VTBL_ENTRY _ZTV6E25x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x14[];
Class_Descriptor cd_E25x14 = {  "E25x14", // class name
  bases_E25x14, 4,
  &(vtc_E25x14[0]), // expected_vtbl_contents
  &(vtt_E25x14[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6E25x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E25x14),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E25x14),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  G25x14y0  : E25x14 , F1 {
  int ff;
  ~G25x14y0(); // tgen
  G25x14y0(); // tgen
};
//SIG(1 G25x14y0) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G25x14y0 ::~G25x14y0(){ note_dtor("G25x14y0", this);} // tgen
G25x14y0 ::G25x14y0(){ note_ctor("G25x14y0", this);} // tgen

static void Test_G25x14y0()
{
  extern Class_Descriptor cd_G25x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x14y0, buf);
    G25x14y0 *dp, &lv = *(dp=new (buf) G25x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x14y0)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x14*), 0, "G25x14y0");
    check_base_class_offset(lv, (B0*)(C25*)(E25x14*), ABISELECT(40,28), "G25x14y0");
    check_base_class_offset(lv, (C25*)(E25x14*), 0, "G25x14y0");
    check_base_class_offset(lv, (D0*)(E25x14*), ABISELECT(44,32), "G25x14y0");
    check_base_class_offset(lv, (E25x14*), 0, "G25x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G25x14y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G25x14y0.ff");
    test_class_info(&lv, &cd_G25x14y0);
    dp->~G25x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x14y0(Test_G25x14y0, "G25x14y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G25x14y0C1Ev();
extern void _ZN8G25x14y0D1Ev();
Name_Map name_map_G25x14y0[] = {
  NSPAIR(_ZN8G25x14y0C1Ev),
  NSPAIR(_ZN8G25x14y0D1Ev),
  {0,0}
};
extern Class_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_E25x14;
extern VTBL_ENTRY _ZTI6E25x14[];
extern  VTBL_ENTRY _ZTV6E25x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x14y0[] = {
  // 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_E25x14,    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 _ZTI8G25x14y0[];
extern void _ZN6E25x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x14y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x14y0[0]),
  (VTBL_ENTRY)&_ZN6E25x143fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G25x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G25x14y0[];
extern void _ZN6E25x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x14__8G25x14y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x14[0]),
  (VTBL_ENTRY)&_ZN6E25x143fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C256E25x14__8G25x14y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x14y0[] = {
  {&(_ZTV8G25x14y0[4]),  4,8},
  {&(_tg__ZTV6E25x14__8G25x14y0[4]),  4,5},
  {&(_tg__ZTV3C256E25x14__8G25x14y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x14y0[];
extern  VTBL_ENTRY _ZTV8G25x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x14y0[];
Class_Descriptor cd_G25x14y0 = {  "G25x14y0", // class name
  bases_G25x14y0, 6,
  &(vtc_G25x14y0[0]), // expected_vtbl_contents
  &(vtt_G25x14y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G25x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x14y0),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x14y0),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  G25x14y1  : virtual E25x14 , F1 {
  int ff;
  ~G25x14y1(); // tgen
  G25x14y1(); // tgen
};
//SIG(1 G25x14y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G25x14y1 ::~G25x14y1(){ note_dtor("G25x14y1", this);} // tgen
G25x14y1 ::G25x14y1(){ note_ctor("G25x14y1", this);} // tgen

static void Test_G25x14y1()
{
  extern Class_Descriptor cd_G25x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x14y1, buf);
    G25x14y1 *dp, &lv = *(dp=new (buf) G25x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x14y1)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x14*), ABISELECT(16,12), "G25x14y1");
    check_base_class_offset(lv, (B0*)(C25*)(E25x14*), ABISELECT(36,28), "G25x14y1");
    check_base_class_offset(lv, (C25*)(E25x14*), ABISELECT(16,12), "G25x14y1");
    check_base_class_offset(lv, (D0*)(E25x14*), ABISELECT(40,32), "G25x14y1");
    check_base_class_offset(lv, (E25x14*), ABISELECT(16,12), "G25x14y1");
    check_base_class_offset(lv, (F1*), 0, "G25x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x14y1.ff");
    test_class_info(&lv, &cd_G25x14y1);
    dp->~G25x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x14y1(Test_G25x14y1, "G25x14y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G25x14y1C1Ev();
extern void _ZN8G25x14y1D1Ev();
Name_Map name_map_G25x14y1[] = {
  NSPAIR(_ZN8G25x14y1C1Ev),
  NSPAIR(_ZN8G25x14y1D1Ev),
  {0,0}
};
extern Class_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_E25x14;
extern VTBL_ENTRY _ZTI6E25x14[];
extern  VTBL_ENTRY _ZTV6E25x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x14y1[] = {
  // 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_E25x14,    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 _ZTI8G25x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E25x143fooEv();
static  VTBL_ENTRY vtc_G25x14y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G25x14y1[0]),
  (VTBL_ENTRY)&_ZN6E25x143fooEv,
};
extern VTBL_ENTRY _ZTV8G25x14y1[];
extern void _ZN6E25x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x14__8G25x14y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x14[0]),
  (VTBL_ENTRY)&_ZN6E25x143fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C256E25x14__8G25x14y1[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x14y1[] = {
  {&(_ZTV8G25x14y1[5]),  5,12},
  {&(_ZTV8G25x14y1[11]),  11,12},
  {&(_tg__ZTV6E25x14__8G25x14y1[4]),  4,5},
  {&(_tg__ZTV3C256E25x14__8G25x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x14y1[];
extern  VTBL_ENTRY _ZTV8G25x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x14y1[];
Class_Descriptor cd_G25x14y1 = {  "G25x14y1", // class name
  bases_G25x14y1, 6,
  &(vtc_G25x14y1[0]), // expected_vtbl_contents
  &(vtt_G25x14y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G25x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x14y1),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x14y1),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  G25x14y2  : E25x14 , virtual F1 {
  int ff;
  ~G25x14y2(); // tgen
  G25x14y2(); // tgen
};
//SIG(1 G25x14y2) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G25x14y2 ::~G25x14y2(){ note_dtor("G25x14y2", this);} // tgen
G25x14y2 ::G25x14y2(){ note_ctor("G25x14y2", this);} // tgen

static void Test_G25x14y2()
{
  extern Class_Descriptor cd_G25x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x14y2, buf);
    G25x14y2 *dp, &lv = *(dp=new (buf) G25x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x14y2)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x14*), 0, "G25x14y2");
    check_base_class_offset(lv, (B0*)(C25*)(E25x14*), ABISELECT(24,20), "G25x14y2");
    check_base_class_offset(lv, (C25*)(E25x14*), 0, "G25x14y2");
    check_base_class_offset(lv, (D0*)(E25x14*), ABISELECT(28,24), "G25x14y2");
    check_base_class_offset(lv, (E25x14*), 0, "G25x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G25x14y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G25x14y2.ff");
    test_class_info(&lv, &cd_G25x14y2);
    dp->~G25x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x14y2(Test_G25x14y2, "G25x14y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G25x14y2C1Ev();
extern void _ZN8G25x14y2D1Ev();
Name_Map name_map_G25x14y2[] = {
  NSPAIR(_ZN8G25x14y2C1Ev),
  NSPAIR(_ZN8G25x14y2D1Ev),
  {0,0}
};
extern Class_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_E25x14;
extern VTBL_ENTRY _ZTI6E25x14[];
extern  VTBL_ENTRY _ZTV6E25x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x14y2[] = {
  // 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_E25x14,    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 _ZTI8G25x14y2[];
extern void _ZN6E25x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x14y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x14y2[0]),
  (VTBL_ENTRY)&_ZN6E25x143fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G25x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G25x14y2[];
extern void _ZN6E25x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x14__8G25x14y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x14[0]),
  (VTBL_ENTRY)&_ZN6E25x143fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C256E25x14__8G25x14y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x14y2[] = {
  {&(_ZTV8G25x14y2[5]),  5,10},
  {&(_tg__ZTV6E25x14__8G25x14y2[4]),  4,5},
  {&(_tg__ZTV3C256E25x14__8G25x14y2[3]),  3,4},
  {&(_ZTV8G25x14y2[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G25x14y2[];
extern  VTBL_ENTRY _ZTV8G25x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x14y2[];
Class_Descriptor cd_G25x14y2 = {  "G25x14y2", // class name
  bases_G25x14y2, 6,
  &(vtc_G25x14y2[0]), // expected_vtbl_contents
  &(vtt_G25x14y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G25x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x14y2),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x14y2),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  G25x14y3  : virtual E25x14 , virtual F1 {
  int ff;
  ~G25x14y3(); // tgen
  G25x14y3(); // tgen
};
//SIG(1 G25x14y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G25x14y3 ::~G25x14y3(){ note_dtor("G25x14y3", this);} // tgen
G25x14y3 ::G25x14y3(){ note_ctor("G25x14y3", this);} // tgen

static void Test_G25x14y3()
{
  extern Class_Descriptor cd_G25x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G25x14y3, buf);
    G25x14y3 *dp, &lv = *(dp=new (buf) G25x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G25x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x14y3)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x14*), ABISELECT(16,8), "G25x14y3");
    check_base_class_offset(lv, (B0*)(C25*)(E25x14*), ABISELECT(36,24), "G25x14y3");
    check_base_class_offset(lv, (C25*)(E25x14*), ABISELECT(16,8), "G25x14y3");
    check_base_class_offset(lv, (D0*)(E25x14*), ABISELECT(40,28), "G25x14y3");
    check_base_class_offset(lv, (E25x14*), ABISELECT(16,8), "G25x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G25x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G25x14y3.ff");
    test_class_info(&lv, &cd_G25x14y3);
    dp->~G25x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x14y3(Test_G25x14y3, "G25x14y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G25x14y3C1Ev();
extern void _ZN8G25x14y3D1Ev();
Name_Map name_map_G25x14y3[] = {
  NSPAIR(_ZN8G25x14y3C1Ev),
  NSPAIR(_ZN8G25x14y3D1Ev),
  {0,0}
};
extern Class_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_E25x14;
extern VTBL_ENTRY _ZTI6E25x14[];
extern  VTBL_ENTRY _ZTV6E25x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x14y3[] = {
  // 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_E25x14,    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 _ZTI8G25x14y3[];
extern void _ZN6E25x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x14y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x14y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G25x14y3[0]),
  (VTBL_ENTRY)&_ZN6E25x143fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G25x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G25x14y3[];
extern void _ZN6E25x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x14__8G25x14y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x14[0]),
  (VTBL_ENTRY)&_ZN6E25x143fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C256E25x14__8G25x14y3[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x14y3[] = {
  {&(_ZTV8G25x14y3[6]),  6,16},
  {&(_ZTV8G25x14y3[11]),  11,16},
  {&(_ZTV8G25x14y3[15]),  15,16},
  {&(_tg__ZTV6E25x14__8G25x14y3[4]),  4,5},
  {&(_tg__ZTV3C256E25x14__8G25x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x14y3[];
extern  VTBL_ENTRY _ZTV8G25x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x14y3[];
Class_Descriptor cd_G25x14y3 = {  "G25x14y3", // class name
  bases_G25x14y3, 6,
  &(vtc_G25x14y3[0]), // expected_vtbl_contents
  &(vtt_G25x14y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G25x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x14y3),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x14y3),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  G25x14y4  : E25x14 , F0 {
  int ff;
  ~G25x14y4(); // tgen
  G25x14y4(); // tgen
};
//SIG(1 G25x14y4) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G25x14y4 ::~G25x14y4(){ note_dtor("G25x14y4", this);} // tgen
G25x14y4 ::G25x14y4(){ note_ctor("G25x14y4", this);} // tgen

static void Test_G25x14y4()
{
  extern Class_Descriptor cd_G25x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G25x14y4, buf);
    G25x14y4 *dp, &lv = *(dp=new (buf) G25x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G25x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x14y4)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x14*), 0, "G25x14y4");
    check_base_class_offset(lv, (B0*)(C25*)(E25x14*), ABISELECT(28,24), "G25x14y4");
    check_base_class_offset(lv, (C25*)(E25x14*), 0, "G25x14y4");
    check_base_class_offset(lv, (D0*)(E25x14*), ABISELECT(32,28), "G25x14y4");
    check_base_class_offset(lv, (E25x14*), 0, "G25x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G25x14y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G25x14y4.ff");
    test_class_info(&lv, &cd_G25x14y4);
    dp->~G25x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x14y4(Test_G25x14y4, "G25x14y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G25x14y4C1Ev();
extern void _ZN8G25x14y4D1Ev();
Name_Map name_map_G25x14y4[] = {
  NSPAIR(_ZN8G25x14y4C1Ev),
  NSPAIR(_ZN8G25x14y4D1Ev),
  {0,0}
};
extern Class_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_E25x14;
extern VTBL_ENTRY _ZTI6E25x14[];
extern  VTBL_ENTRY _ZTV6E25x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x14y4[] = {
  // 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_E25x14,    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 _ZTI8G25x14y4[];
extern void _ZN6E25x143fooEv();
static  VTBL_ENTRY vtc_G25x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x14y4[0]),
  (VTBL_ENTRY)&_ZN6E25x143fooEv,
};
extern VTBL_ENTRY _ZTV8G25x14y4[];
extern void _ZN6E25x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x14__8G25x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x14[0]),
  (VTBL_ENTRY)&_ZN6E25x143fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C256E25x14__8G25x14y4[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x14y4[] = {
  {&(_ZTV8G25x14y4[4]),  4,5},
  {&(_tg__ZTV6E25x14__8G25x14y4[4]),  4,5},
  {&(_tg__ZTV3C256E25x14__8G25x14y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x14y4[];
extern  VTBL_ENTRY _ZTV8G25x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x14y4[];
Class_Descriptor cd_G25x14y4 = {  "G25x14y4", // class name
  bases_G25x14y4, 6,
  &(vtc_G25x14y4[0]), // expected_vtbl_contents
  &(vtt_G25x14y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G25x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x14y4),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x14y4),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  G25x14y5  : virtual E25x14 , F0 {
  int ff;
  ~G25x14y5(); // tgen
  G25x14y5(); // tgen
};
//SIG(1 G25x14y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G25x14y5 ::~G25x14y5(){ note_dtor("G25x14y5", this);} // tgen
G25x14y5 ::G25x14y5(){ note_ctor("G25x14y5", this);} // tgen

static void Test_G25x14y5()
{
  extern Class_Descriptor cd_G25x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x14y5, buf);
    G25x14y5 *dp, &lv = *(dp=new (buf) G25x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x14y5)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x14*), ABISELECT(16,12), "G25x14y5");
    check_base_class_offset(lv, (B0*)(C25*)(E25x14*), ABISELECT(36,28), "G25x14y5");
    check_base_class_offset(lv, (C25*)(E25x14*), ABISELECT(16,12), "G25x14y5");
    check_base_class_offset(lv, (D0*)(E25x14*), ABISELECT(40,32), "G25x14y5");
    check_base_class_offset(lv, (E25x14*), ABISELECT(16,12), "G25x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G25x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x14y5.ff");
    test_class_info(&lv, &cd_G25x14y5);
    dp->~G25x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x14y5(Test_G25x14y5, "G25x14y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G25x14y5C1Ev();
extern void _ZN8G25x14y5D1Ev();
Name_Map name_map_G25x14y5[] = {
  NSPAIR(_ZN8G25x14y5C1Ev),
  NSPAIR(_ZN8G25x14y5D1Ev),
  {0,0}
};
extern Class_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_E25x14;
extern VTBL_ENTRY _ZTI6E25x14[];
extern  VTBL_ENTRY _ZTV6E25x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x14y5[] = {
  // 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_E25x14,    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 _ZTI8G25x14y5[];
extern void _ZN6E25x143fooEv();
static  VTBL_ENTRY vtc_G25x14y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x14y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G25x14y5[0]),
  (VTBL_ENTRY)&_ZN6E25x143fooEv,
};
extern VTBL_ENTRY _ZTV8G25x14y5[];
extern void _ZN6E25x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x14__8G25x14y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x14[0]),
  (VTBL_ENTRY)&_ZN6E25x143fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C256E25x14__8G25x14y5[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x14y5[] = {
  {&(_ZTV8G25x14y5[5]),  5,11},
  {&(_ZTV8G25x14y5[10]),  10,11},
  {&(_tg__ZTV6E25x14__8G25x14y5[4]),  4,5},
  {&(_tg__ZTV3C256E25x14__8G25x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x14y5[];
extern  VTBL_ENTRY _ZTV8G25x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x14y5[];
Class_Descriptor cd_G25x14y5 = {  "G25x14y5", // class name
  bases_G25x14y5, 6,
  &(vtc_G25x14y5[0]), // expected_vtbl_contents
  &(vtt_G25x14y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G25x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x14y5),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x14y5),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  G25x14y6  : E25x14 , virtual F0 {
  int ff;
  ~G25x14y6(); // tgen
  G25x14y6(); // tgen
};
//SIG(1 G25x14y6) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G25x14y6 ::~G25x14y6(){ note_dtor("G25x14y6", this);} // tgen
G25x14y6 ::G25x14y6(){ note_ctor("G25x14y6", this);} // tgen

static void Test_G25x14y6()
{
  extern Class_Descriptor cd_G25x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G25x14y6, buf);
    G25x14y6 *dp, &lv = *(dp=new (buf) G25x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G25x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x14y6)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x14*), 0, "G25x14y6");
    check_base_class_offset(lv, (B0*)(C25*)(E25x14*), ABISELECT(24,20), "G25x14y6");
    check_base_class_offset(lv, (C25*)(E25x14*), 0, "G25x14y6");
    check_base_class_offset(lv, (D0*)(E25x14*), ABISELECT(28,24), "G25x14y6");
    check_base_class_offset(lv, (E25x14*), 0, "G25x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G25x14y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G25x14y6.ff");
    test_class_info(&lv, &cd_G25x14y6);
    dp->~G25x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x14y6(Test_G25x14y6, "G25x14y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G25x14y6C1Ev();
extern void _ZN8G25x14y6D1Ev();
Name_Map name_map_G25x14y6[] = {
  NSPAIR(_ZN8G25x14y6C1Ev),
  NSPAIR(_ZN8G25x14y6D1Ev),
  {0,0}
};
extern Class_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_E25x14;
extern VTBL_ENTRY _ZTI6E25x14[];
extern  VTBL_ENTRY _ZTV6E25x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x14y6[] = {
  // 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_E25x14,    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 _ZTI8G25x14y6[];
extern void _ZN6E25x143fooEv();
static  VTBL_ENTRY vtc_G25x14y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x14y6[0]),
  (VTBL_ENTRY)&_ZN6E25x143fooEv,
};
extern VTBL_ENTRY _ZTV8G25x14y6[];
extern void _ZN6E25x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x14__8G25x14y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x14[0]),
  (VTBL_ENTRY)&_ZN6E25x143fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C256E25x14__8G25x14y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x14y6[] = {
  {&(_ZTV8G25x14y6[5]),  5,6},
  {&(_tg__ZTV6E25x14__8G25x14y6[4]),  4,5},
  {&(_tg__ZTV3C256E25x14__8G25x14y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x14y6[];
extern  VTBL_ENTRY _ZTV8G25x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x14y6[];
Class_Descriptor cd_G25x14y6 = {  "G25x14y6", // class name
  bases_G25x14y6, 6,
  &(vtc_G25x14y6[0]), // expected_vtbl_contents
  &(vtt_G25x14y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G25x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x14y6),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x14y6),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  G25x14y7  : virtual E25x14 , virtual F0 {
  int ff;
  ~G25x14y7(); // tgen
  G25x14y7(); // tgen
};
//SIG(1 G25x14y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G25x14y7 ::~G25x14y7(){ note_dtor("G25x14y7", this);} // tgen
G25x14y7 ::G25x14y7(){ note_ctor("G25x14y7", this);} // tgen

static void Test_G25x14y7()
{
  extern Class_Descriptor cd_G25x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x14y7, buf);
    G25x14y7 *dp, &lv = *(dp=new (buf) G25x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x14y7)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x14*), ABISELECT(16,8), "G25x14y7");
    check_base_class_offset(lv, (B0*)(C25*)(E25x14*), ABISELECT(36,24), "G25x14y7");
    check_base_class_offset(lv, (C25*)(E25x14*), ABISELECT(16,8), "G25x14y7");
    check_base_class_offset(lv, (D0*)(E25x14*), ABISELECT(40,28), "G25x14y7");
    check_base_class_offset(lv, (E25x14*), ABISELECT(16,8), "G25x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G25x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G25x14y7.ff");
    test_class_info(&lv, &cd_G25x14y7);
    dp->~G25x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x14y7(Test_G25x14y7, "G25x14y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G25x14y7C1Ev();
extern void _ZN8G25x14y7D1Ev();
Name_Map name_map_G25x14y7[] = {
  NSPAIR(_ZN8G25x14y7C1Ev),
  NSPAIR(_ZN8G25x14y7D1Ev),
  {0,0}
};
extern Class_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_E25x14;
extern VTBL_ENTRY _ZTI6E25x14[];
extern  VTBL_ENTRY _ZTV6E25x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x14y7[] = {
  // 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_E25x14,    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 _ZTI8G25x14y7[];
extern void _ZN6E25x143fooEv();
static  VTBL_ENTRY vtc_G25x14y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x14y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G25x14y7[0]),
  (VTBL_ENTRY)&_ZN6E25x143fooEv,
};
extern VTBL_ENTRY _ZTV8G25x14y7[];
extern void _ZN6E25x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x14__8G25x14y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x14[0]),
  (VTBL_ENTRY)&_ZN6E25x143fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C256E25x14__8G25x14y7[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x14y7[] = {
  {&(_ZTV8G25x14y7[6]),  6,12},
  {&(_ZTV8G25x14y7[11]),  11,12},
  {&(_tg__ZTV6E25x14__8G25x14y7[4]),  4,5},
  {&(_tg__ZTV3C256E25x14__8G25x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x14y7[];
extern  VTBL_ENTRY _ZTV8G25x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x14y7[];
Class_Descriptor cd_G25x14y7 = {  "G25x14y7", // class name
  bases_G25x14y7, 6,
  &(vtc_G25x14y7[0]), // expected_vtbl_contents
  &(vtt_G25x14y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G25x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x14y7),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x14y7),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  E26x14  : C26 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E26x143fooEv
  ~E26x14(); // tgen
  E26x14(); // tgen
};
//SIG(-1 E26x14) C1{ BC2{ VBC3{ Fi} VBC4{ Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E26x14 ::foo(){vfunc_called(this, "_ZN6E26x143fooEv");}
E26x14 ::~E26x14(){ note_dtor("E26x14", this);} // tgen
E26x14 ::E26x14(){ note_ctor("E26x14", this);} // tgen

static void Test_E26x14()
{
  extern Class_Descriptor cd_E26x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E26x14, buf);
    E26x14 *dp, &lv = *(dp=new (buf) E26x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E26x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E26x14)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(16,12), "E26x14");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(20,16), "E26x14");
    check_base_class_offset(lv, (C26*), 0, "E26x14");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E26x14");
    check_field_offset(lv, fd, ABISELECT(12,8), "E26x14.fd");
    test_class_info(&lv, &cd_E26x14);
    dp->~E26x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE26x14(Test_E26x14, "E26x14", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6E26x14C1Ev();
extern void _ZN6E26x14D1Ev();
Name_Map name_map_E26x14[] = {
  NSPAIR(_ZN6E26x14C1Ev),
  NSPAIR(_ZN6E26x14D1Ev),
  {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_E26x14[] = {
  // 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 _ZTI6E26x14[];
extern void _ZN6E26x143fooEv();
static  VTBL_ENTRY vtc_E26x14[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x14[0]),
  (VTBL_ENTRY)&_ZN6E26x143fooEv,
};
extern VTBL_ENTRY _ZTV6E26x14[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__6E26x14[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_E26x14[] = {
  {&(_ZTV6E26x14[5]),  5,6},
  {&(_tg__ZTV3C26__6E26x14[4]),  4,5},
};
extern VTBL_ENTRY _ZTI6E26x14[];
extern  VTBL_ENTRY _ZTV6E26x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x14[];
Class_Descriptor cd_E26x14 = {  "E26x14", // class name
  bases_E26x14, 4,
  &(vtc_E26x14[0]), // expected_vtbl_contents
  &(vtt_E26x14[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6E26x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E26x14),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E26x14),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  G26x14y0  : E26x14 , F1 {
  int ff;
  ~G26x14y0(); // tgen
  G26x14y0(); // tgen
};
//SIG(1 G26x14y0) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G26x14y0 ::~G26x14y0(){ note_dtor("G26x14y0", this);} // tgen
G26x14y0 ::G26x14y0(){ note_ctor("G26x14y0", this);} // tgen

static void Test_G26x14y0()
{
  extern Class_Descriptor cd_G26x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x14y0, buf);
    G26x14y0 *dp, &lv = *(dp=new (buf) G26x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x14y0)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x14*), ABISELECT(32,24), "G26x14y0");
    check_base_class_offset(lv, (B0*)(C26*)(E26x14*), ABISELECT(36,28), "G26x14y0");
    check_base_class_offset(lv, (C26*)(E26x14*), 0, "G26x14y0");
    check_base_class_offset(lv, (D0*)(E26x14*), ABISELECT(40,32), "G26x14y0");
    check_base_class_offset(lv, (E26x14*), 0, "G26x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G26x14y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G26x14y0.ff");
    test_class_info(&lv, &cd_G26x14y0);
    dp->~G26x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x14y0(Test_G26x14y0, "G26x14y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G26x14y0C1Ev();
extern void _ZN8G26x14y0D1Ev();
Name_Map name_map_G26x14y0[] = {
  NSPAIR(_ZN8G26x14y0C1Ev),
  NSPAIR(_ZN8G26x14y0D1Ev),
  {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_E26x14;
extern VTBL_ENTRY _ZTI6E26x14[];
extern  VTBL_ENTRY _ZTV6E26x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x14y0[] = {
  // 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_E26x14,    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 _ZTI8G26x14y0[];
extern void _ZN6E26x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x14y0[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x14y0[0]),
  (VTBL_ENTRY)&_ZN6E26x143fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G26x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G26x14y0[];
extern void _ZN6E26x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x14__8G26x14y0[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x14[0]),
  (VTBL_ENTRY)&_ZN6E26x143fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C266E26x14__8G26x14y0[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x14y0[] = {
  {&(_ZTV8G26x14y0[5]),  5,9},
  {&(_tg__ZTV6E26x14__8G26x14y0[5]),  5,6},
  {&(_tg__ZTV3C266E26x14__8G26x14y0[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x14y0[];
extern  VTBL_ENTRY _ZTV8G26x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x14y0[];
Class_Descriptor cd_G26x14y0 = {  "G26x14y0", // class name
  bases_G26x14y0, 6,
  &(vtc_G26x14y0[0]), // expected_vtbl_contents
  &(vtt_G26x14y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G26x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x14y0),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x14y0),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  G26x14y1  : virtual E26x14 , F1 {
  int ff;
  ~G26x14y1(); // tgen
  G26x14y1(); // tgen
};
//SIG(1 G26x14y1) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G26x14y1 ::~G26x14y1(){ note_dtor("G26x14y1", this);} // tgen
G26x14y1 ::G26x14y1(){ note_ctor("G26x14y1", this);} // tgen

static void Test_G26x14y1()
{
  extern Class_Descriptor cd_G26x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x14y1, buf);
    G26x14y1 *dp, &lv = *(dp=new (buf) G26x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x14y1)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x14*), ABISELECT(32,24), "G26x14y1");
    check_base_class_offset(lv, (B0*)(C26*)(E26x14*), ABISELECT(36,28), "G26x14y1");
    check_base_class_offset(lv, (C26*)(E26x14*), ABISELECT(16,12), "G26x14y1");
    check_base_class_offset(lv, (D0*)(E26x14*), ABISELECT(40,32), "G26x14y1");
    check_base_class_offset(lv, (E26x14*), ABISELECT(16,12), "G26x14y1");
    check_base_class_offset(lv, (F1*), 0, "G26x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x14y1.ff");
    test_class_info(&lv, &cd_G26x14y1);
    dp->~G26x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x14y1(Test_G26x14y1, "G26x14y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G26x14y1C1Ev();
extern void _ZN8G26x14y1D1Ev();
Name_Map name_map_G26x14y1[] = {
  NSPAIR(_ZN8G26x14y1C1Ev),
  NSPAIR(_ZN8G26x14y1D1Ev),
  {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_E26x14;
extern VTBL_ENTRY _ZTI6E26x14[];
extern  VTBL_ENTRY _ZTV6E26x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x14y1[] = {
  // 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_E26x14,    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 _ZTI8G26x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E26x143fooEv();
static  VTBL_ENTRY vtc_G26x14y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G26x14y1[0]),
  (VTBL_ENTRY)&_ZN6E26x143fooEv,
};
extern VTBL_ENTRY _ZTV8G26x14y1[];
extern void _ZN6E26x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x14__8G26x14y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x14[0]),
  (VTBL_ENTRY)&_ZN6E26x143fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C266E26x14__8G26x14y1[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x14y1[] = {
  {&(_ZTV8G26x14y1[6]),  6,14},
  {&(_ZTV8G26x14y1[13]),  13,14},
  {&(_tg__ZTV6E26x14__8G26x14y1[5]),  5,6},
  {&(_tg__ZTV3C266E26x14__8G26x14y1[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x14y1[];
extern  VTBL_ENTRY _ZTV8G26x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x14y1[];
Class_Descriptor cd_G26x14y1 = {  "G26x14y1", // class name
  bases_G26x14y1, 6,
  &(vtc_G26x14y1[0]), // expected_vtbl_contents
  &(vtt_G26x14y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G26x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x14y1),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x14y1),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  G26x14y2  : E26x14 , virtual F1 {
  int ff;
  ~G26x14y2(); // tgen
  G26x14y2(); // tgen
};
//SIG(1 G26x14y2) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G26x14y2 ::~G26x14y2(){ note_dtor("G26x14y2", this);} // tgen
G26x14y2 ::G26x14y2(){ note_ctor("G26x14y2", this);} // tgen

static void Test_G26x14y2()
{
  extern Class_Descriptor cd_G26x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x14y2, buf);
    G26x14y2 *dp, &lv = *(dp=new (buf) G26x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x14y2)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x14*), ABISELECT(20,16), "G26x14y2");
    check_base_class_offset(lv, (B0*)(C26*)(E26x14*), ABISELECT(24,20), "G26x14y2");
    check_base_class_offset(lv, (C26*)(E26x14*), 0, "G26x14y2");
    check_base_class_offset(lv, (D0*)(E26x14*), ABISELECT(28,24), "G26x14y2");
    check_base_class_offset(lv, (E26x14*), 0, "G26x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G26x14y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G26x14y2.ff");
    test_class_info(&lv, &cd_G26x14y2);
    dp->~G26x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x14y2(Test_G26x14y2, "G26x14y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G26x14y2C1Ev();
extern void _ZN8G26x14y2D1Ev();
Name_Map name_map_G26x14y2[] = {
  NSPAIR(_ZN8G26x14y2C1Ev),
  NSPAIR(_ZN8G26x14y2D1Ev),
  {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_E26x14;
extern VTBL_ENTRY _ZTI6E26x14[];
extern  VTBL_ENTRY _ZTV6E26x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x14y2[] = {
  // 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_E26x14,    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 _ZTI8G26x14y2[];
extern void _ZN6E26x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x14y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x14y2[0]),
  (VTBL_ENTRY)&_ZN6E26x143fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI8G26x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G26x14y2[];
extern void _ZN6E26x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x14__8G26x14y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x14[0]),
  (VTBL_ENTRY)&_ZN6E26x143fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C266E26x14__8G26x14y2[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x14y2[] = {
  {&(_ZTV8G26x14y2[6]),  6,11},
  {&(_tg__ZTV6E26x14__8G26x14y2[5]),  5,6},
  {&(_tg__ZTV3C266E26x14__8G26x14y2[4]),  4,5},
  {&(_ZTV8G26x14y2[10]),  10,11},
};
extern VTBL_ENTRY _ZTI8G26x14y2[];
extern  VTBL_ENTRY _ZTV8G26x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x14y2[];
Class_Descriptor cd_G26x14y2 = {  "G26x14y2", // class name
  bases_G26x14y2, 6,
  &(vtc_G26x14y2[0]), // expected_vtbl_contents
  &(vtt_G26x14y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G26x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x14y2),11, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x14y2),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  G26x14y3  : virtual E26x14 , virtual F1 {
  int ff;
  ~G26x14y3(); // tgen
  G26x14y3(); // tgen
};
//SIG(1 G26x14y3) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G26x14y3 ::~G26x14y3(){ note_dtor("G26x14y3", this);} // tgen
G26x14y3 ::G26x14y3(){ note_ctor("G26x14y3", this);} // tgen

static void Test_G26x14y3()
{
  extern Class_Descriptor cd_G26x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G26x14y3, buf);
    G26x14y3 *dp, &lv = *(dp=new (buf) G26x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G26x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x14y3)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x14*), ABISELECT(32,20), "G26x14y3");
    check_base_class_offset(lv, (B0*)(C26*)(E26x14*), ABISELECT(36,24), "G26x14y3");
    check_base_class_offset(lv, (C26*)(E26x14*), ABISELECT(16,8), "G26x14y3");
    check_base_class_offset(lv, (D0*)(E26x14*), ABISELECT(40,28), "G26x14y3");
    check_base_class_offset(lv, (E26x14*), ABISELECT(16,8), "G26x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G26x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G26x14y3.ff");
    test_class_info(&lv, &cd_G26x14y3);
    dp->~G26x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x14y3(Test_G26x14y3, "G26x14y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G26x14y3C1Ev();
extern void _ZN8G26x14y3D1Ev();
Name_Map name_map_G26x14y3[] = {
  NSPAIR(_ZN8G26x14y3C1Ev),
  NSPAIR(_ZN8G26x14y3D1Ev),
  {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_E26x14;
extern VTBL_ENTRY _ZTI6E26x14[];
extern  VTBL_ENTRY _ZTV6E26x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x14y3[] = {
  // 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_E26x14,    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 _ZTI8G26x14y3[];
extern void _ZN6E26x143fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x14y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x14y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G26x14y3[0]),
  (VTBL_ENTRY)&_ZN6E26x143fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G26x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G26x14y3[];
extern void _ZN6E26x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x14__8G26x14y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x14[0]),
  (VTBL_ENTRY)&_ZN6E26x143fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C266E26x14__8G26x14y3[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x14y3[] = {
  {&(_ZTV8G26x14y3[7]),  7,18},
  {&(_ZTV8G26x14y3[13]),  13,18},
  {&(_ZTV8G26x14y3[17]),  17,18},
  {&(_tg__ZTV6E26x14__8G26x14y3[5]),  5,6},
  {&(_tg__ZTV3C266E26x14__8G26x14y3[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x14y3[];
extern  VTBL_ENTRY _ZTV8G26x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x14y3[];
Class_Descriptor cd_G26x14y3 = {  "G26x14y3", // class name
  bases_G26x14y3, 6,
  &(vtc_G26x14y3[0]), // expected_vtbl_contents
  &(vtt_G26x14y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G26x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x14y3),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x14y3),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  G26x14y4  : E26x14 , F0 {
  int ff;
  ~G26x14y4(); // tgen
  G26x14y4(); // tgen
};
//SIG(1 G26x14y4) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G26x14y4 ::~G26x14y4(){ note_dtor("G26x14y4", this);} // tgen
G26x14y4 ::G26x14y4(){ note_ctor("G26x14y4", this);} // tgen

static void Test_G26x14y4()
{
  extern Class_Descriptor cd_G26x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G26x14y4, buf);
    G26x14y4 *dp, &lv = *(dp=new (buf) G26x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G26x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x14y4)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x14*), ABISELECT(24,20), "G26x14y4");
    check_base_class_offset(lv, (B0*)(C26*)(E26x14*), ABISELECT(28,24), "G26x14y4");
    check_base_class_offset(lv, (C26*)(E26x14*), 0, "G26x14y4");
    check_base_class_offset(lv, (D0*)(E26x14*), ABISELECT(32,28), "G26x14y4");
    check_base_class_offset(lv, (E26x14*), 0, "G26x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G26x14y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G26x14y4.ff");
    test_class_info(&lv, &cd_G26x14y4);
    dp->~G26x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x14y4(Test_G26x14y4, "G26x14y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G26x14y4C1Ev();
extern void _ZN8G26x14y4D1Ev();
Name_Map name_map_G26x14y4[] = {
  NSPAIR(_ZN8G26x14y4C1Ev),
  NSPAIR(_ZN8G26x14y4D1Ev),
  {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_E26x14;
extern VTBL_ENTRY _ZTI6E26x14[];
extern  VTBL_ENTRY _ZTV6E26x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x14y4[] = {
  // 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_E26x14,    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 _ZTI8G26x14y4[];
extern void _ZN6E26x143fooEv();
static  VTBL_ENTRY vtc_G26x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x14y4[0]),
  (VTBL_ENTRY)&_ZN6E26x143fooEv,
};
extern VTBL_ENTRY _ZTV8G26x14y4[];
extern void _ZN6E26x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x14__8G26x14y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x14[0]),
  (VTBL_ENTRY)&_ZN6E26x143fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C266E26x14__8G26x14y4[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x14y4[] = {
  {&(_ZTV8G26x14y4[5]),  5,6},
  {&(_tg__ZTV6E26x14__8G26x14y4[5]),  5,6},
  {&(_tg__ZTV3C266E26x14__8G26x14y4[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x14y4[];
extern  VTBL_ENTRY _ZTV8G26x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x14y4[];
Class_Descriptor cd_G26x14y4 = {  "G26x14y4", // class name
  bases_G26x14y4, 6,
  &(vtc_G26x14y4[0]), // expected_vtbl_contents
  &(vtt_G26x14y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G26x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x14y4),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x14y4),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  G26x14y5  : virtual E26x14 , F0 {
  int ff;
  ~G26x14y5(); // tgen
  G26x14y5(); // tgen
};
//SIG(1 G26x14y5) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G26x14y5 ::~G26x14y5(){ note_dtor("G26x14y5", this);} // tgen
G26x14y5 ::G26x14y5(){ note_ctor("G26x14y5", this);} // tgen

static void Test_G26x14y5()
{
  extern Class_Descriptor cd_G26x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x14y5, buf);
    G26x14y5 *dp, &lv = *(dp=new (buf) G26x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x14y5)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x14*), ABISELECT(32,24), "G26x14y5");
    check_base_class_offset(lv, (B0*)(C26*)(E26x14*), ABISELECT(36,28), "G26x14y5");
    check_base_class_offset(lv, (C26*)(E26x14*), ABISELECT(16,12), "G26x14y5");
    check_base_class_offset(lv, (D0*)(E26x14*), ABISELECT(40,32), "G26x14y5");
    check_base_class_offset(lv, (E26x14*), ABISELECT(16,12), "G26x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G26x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x14y5.ff");
    test_class_info(&lv, &cd_G26x14y5);
    dp->~G26x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x14y5(Test_G26x14y5, "G26x14y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G26x14y5C1Ev();
extern void _ZN8G26x14y5D1Ev();
Name_Map name_map_G26x14y5[] = {
  NSPAIR(_ZN8G26x14y5C1Ev),
  NSPAIR(_ZN8G26x14y5D1Ev),
  {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_E26x14;
extern VTBL_ENTRY _ZTI6E26x14[];
extern  VTBL_ENTRY _ZTV6E26x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x14y5[] = {
  // 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_E26x14,    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 _ZTI8G26x14y5[];
extern void _ZN6E26x143fooEv();
static  VTBL_ENTRY vtc_G26x14y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x14y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G26x14y5[0]),
  (VTBL_ENTRY)&_ZN6E26x143fooEv,
};
extern VTBL_ENTRY _ZTV8G26x14y5[];
extern void _ZN6E26x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x14__8G26x14y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x14[0]),
  (VTBL_ENTRY)&_ZN6E26x143fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C266E26x14__8G26x14y5[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x14y5[] = {
  {&(_ZTV8G26x14y5[6]),  6,13},
  {&(_ZTV8G26x14y5[12]),  12,13},
  {&(_tg__ZTV6E26x14__8G26x14y5[5]),  5,6},
  {&(_tg__ZTV3C266E26x14__8G26x14y5[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x14y5[];
extern  VTBL_ENTRY _ZTV8G26x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x14y5[];
Class_Descriptor cd_G26x14y5 = {  "G26x14y5", // class name
  bases_G26x14y5, 6,
  &(vtc_G26x14y5[0]), // expected_vtbl_contents
  &(vtt_G26x14y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G26x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x14y5),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x14y5),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  G26x14y6  : E26x14 , virtual F0 {
  int ff;
  ~G26x14y6(); // tgen
  G26x14y6(); // tgen
};
//SIG(1 G26x14y6) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G26x14y6 ::~G26x14y6(){ note_dtor("G26x14y6", this);} // tgen
G26x14y6 ::G26x14y6(){ note_ctor("G26x14y6", this);} // tgen

static void Test_G26x14y6()
{
  extern Class_Descriptor cd_G26x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G26x14y6, buf);
    G26x14y6 *dp, &lv = *(dp=new (buf) G26x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G26x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x14y6)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x14*), ABISELECT(20,16), "G26x14y6");
    check_base_class_offset(lv, (B0*)(C26*)(E26x14*), ABISELECT(24,20), "G26x14y6");
    check_base_class_offset(lv, (C26*)(E26x14*), 0, "G26x14y6");
    check_base_class_offset(lv, (D0*)(E26x14*), ABISELECT(28,24), "G26x14y6");
    check_base_class_offset(lv, (E26x14*), 0, "G26x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G26x14y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G26x14y6.ff");
    test_class_info(&lv, &cd_G26x14y6);
    dp->~G26x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x14y6(Test_G26x14y6, "G26x14y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN8G26x14y6C1Ev();
extern void _ZN8G26x14y6D1Ev();
Name_Map name_map_G26x14y6[] = {
  NSPAIR(_ZN8G26x14y6C1Ev),
  NSPAIR(_ZN8G26x14y6D1Ev),
  {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_E26x14;
extern VTBL_ENTRY _ZTI6E26x14[];
extern  VTBL_ENTRY _ZTV6E26x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x14y6[] = {
  // 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_E26x14,    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 _ZTI8G26x14y6[];
extern void _ZN6E26x143fooEv();
static  VTBL_ENTRY vtc_G26x14y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x14y6[0]),
  (VTBL_ENTRY)&_ZN6E26x143fooEv,
};
extern VTBL_ENTRY _ZTV8G26x14y6[];
extern void _ZN6E26x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x14__8G26x14y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x14[0]),
  (VTBL_ENTRY)&_ZN6E26x143fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C266E26x14__8G26x14y6[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x14y6[] = {
  {&(_ZTV8G26x14y6[6]),  6,7},
  {&(_tg__ZTV6E26x14__8G26x14y6[5]),  5,6},
  {&(_tg__ZTV3C266E26x14__8G26x14y6[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x14y6[];
extern  VTBL_ENTRY _ZTV8G26x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x14y6[];
Class_Descriptor cd_G26x14y6 = {  "G26x14y6", // class name
  bases_G26x14y6, 6,
  &(vtc_G26x14y6[0]), // expected_vtbl_contents
  &(vtt_G26x14y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI8G26x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x14y6),7, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x14y6),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  G26x14y7  : virtual E26x14 , virtual F0 {
  int ff;
  ~G26x14y7(); // tgen
  G26x14y7(); // tgen
};
//SIG(1 G26x14y7) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G26x14y7 ::~G26x14y7(){ note_dtor("G26x14y7", this);} // tgen
G26x14y7 ::G26x14y7(){ note_ctor("G26x14y7", this);} // tgen

static void Test_G26x14y7()
{
  extern Class_Descriptor cd_G26x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x14y7, buf);
    G26x14y7 *dp, &lv = *(dp=new (buf) G26x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x14y7)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x14*), ABISELECT(32,20), "G26x14y7");
    check_base_class_offset(lv, (B0*)(C26*)(E26x14*), ABISELECT(36,24), "G26x14y7");
    check_base_class_offset(lv, (C26*)(E26x14*), ABISELECT(16,8), "G26x14y7");
    check_base_class_offset(lv, (D0*)(E26x14*), ABISELECT(40,28), "G26x14y7");
    check_base_class_offset(lv, (E26x14*), ABISELECT(16,8), "G26x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G26x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G26x14y7.ff");
    test_class_info(&lv, &cd_G26x14y7);
    dp->~G26x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x14y7(Test_G26x14y7, "G26x14y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G26x14y7C1Ev();
extern void _ZN8G26x14y7D1Ev();
Name_Map name_map_G26x14y7[] = {
  NSPAIR(_ZN8G26x14y7C1Ev),
  NSPAIR(_ZN8G26x14y7D1Ev),
  {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_E26x14;
extern VTBL_ENTRY _ZTI6E26x14[];
extern  VTBL_ENTRY _ZTV6E26x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x14y7[] = {
  // 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_E26x14,    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 _ZTI8G26x14y7[];
extern void _ZN6E26x143fooEv();
static  VTBL_ENTRY vtc_G26x14y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x14y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G26x14y7[0]),
  (VTBL_ENTRY)&_ZN6E26x143fooEv,
};
extern VTBL_ENTRY _ZTV8G26x14y7[];
extern void _ZN6E26x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x14__8G26x14y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x14[0]),
  (VTBL_ENTRY)&_ZN6E26x143fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C266E26x14__8G26x14y7[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x14y7[] = {
  {&(_ZTV8G26x14y7[7]),  7,14},
  {&(_ZTV8G26x14y7[13]),  13,14},
  {&(_tg__ZTV6E26x14__8G26x14y7[5]),  5,6},
  {&(_tg__ZTV3C266E26x14__8G26x14y7[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x14y7[];
extern  VTBL_ENTRY _ZTV8G26x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x14y7[];
Class_Descriptor cd_G26x14y7 = {  "G26x14y7", // class name
  bases_G26x14y7, 6,
  &(vtc_G26x14y7[0]), // expected_vtbl_contents
  &(vtt_G26x14y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G26x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x14y7),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x14y7),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  E27x14  : C27 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E27x143fooEv
  ~E27x14(); // tgen
  E27x14(); // tgen
};
//SIG(-1 E27x14) C1{ BC2{ VBC3{ v1 Fi} VBC4{ Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E27x14 ::foo(){vfunc_called(this, "_ZN6E27x143fooEv");}
E27x14 ::~E27x14(){ note_dtor("E27x14", this);} // tgen
E27x14 ::E27x14(){ note_ctor("E27x14", this);} // tgen

static void Test_E27x14()
{
  extern Class_Descriptor cd_E27x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E27x14, buf);
    E27x14 *dp, &lv = *(dp=new (buf) E27x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E27x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E27x14)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(16,12), "E27x14");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(28,20), "E27x14");
    check_base_class_offset(lv, (C27*), 0, "E27x14");
    check_base_class_offset(lv, (D0*), ABISELECT(32,24), "E27x14");
    check_field_offset(lv, fd, ABISELECT(12,8), "E27x14.fd");
    test_class_info(&lv, &cd_E27x14);
    dp->~E27x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE27x14(Test_E27x14, "E27x14", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E27x14C1Ev();
extern void _ZN6E27x14D1Ev();
Name_Map name_map_E27x14[] = {
  NSPAIR(_ZN6E27x14C1Ev),
  NSPAIR(_ZN6E27x14D1Ev),
  {0,0}
};
extern Class_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_E27x14[] = {
  // 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 _ZTI6E27x14[];
extern void _ZN6E27x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv)();
extern void ABISELECT(_ZThn16_N6E27x143fooEv,_ZThn12_N6E27x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E27x14[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x14[0]),
  (VTBL_ENTRY)&_ZN6E27x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E27x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv),
};
extern VTBL_ENTRY _ZTV6E27x14[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__6E27x14[] = {
  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__6E27x14[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_E27x14[] = {
  {&(_ZTV6E27x14[5]),  5,10},
  {&(_tg__ZTV3C27__6E27x14[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__6E27x14[3]),  3,4},
  {&(_ZTV6E27x14[9]),  9,10},
};
extern VTBL_ENTRY _ZTI6E27x14[];
extern  VTBL_ENTRY _ZTV6E27x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x14[];
static VTBL_ENTRY alt_thunk_names467[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x143fooEv,_ZThn12_N6E27x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E27x14 = {  "E27x14", // class name
  bases_E27x14, 4,
  &(vtc_E27x14[0]), // expected_vtbl_contents
  &(vtt_E27x14[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E27x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E27x14),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E27x14),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names467,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x14y0  : E27x14 , F1 {
  int ff;
  ~G27x14y0(); // tgen
  G27x14y0(); // tgen
};
//SIG(1 G27x14y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G27x14y0 ::~G27x14y0(){ note_dtor("G27x14y0", this);} // tgen
G27x14y0 ::G27x14y0(){ note_ctor("G27x14y0", this);} // tgen

static void Test_G27x14y0()
{
  extern Class_Descriptor cd_G27x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x14y0, buf);
    G27x14y0 *dp, &lv = *(dp=new (buf) G27x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x14y0)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x14*), ABISELECT(32,24), "G27x14y0");
    check_base_class_offset(lv, (B0*)(C27*)(E27x14*), ABISELECT(44,32), "G27x14y0");
    check_base_class_offset(lv, (C27*)(E27x14*), 0, "G27x14y0");
    check_base_class_offset(lv, (D0*)(E27x14*), ABISELECT(48,36), "G27x14y0");
    check_base_class_offset(lv, (E27x14*), 0, "G27x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G27x14y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G27x14y0.ff");
    test_class_info(&lv, &cd_G27x14y0);
    dp->~G27x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x14y0(Test_G27x14y0, "G27x14y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G27x14y0C1Ev();
extern void _ZN8G27x14y0D1Ev();
Name_Map name_map_G27x14y0[] = {
  NSPAIR(_ZN8G27x14y0C1Ev),
  NSPAIR(_ZN8G27x14y0D1Ev),
  {0,0}
};
extern Class_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_E27x14;
extern VTBL_ENTRY _ZTI6E27x14[];
extern  VTBL_ENTRY _ZTV6E27x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x14y0[] = {
  // 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_E27x14,    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 _ZTI8G27x14y0[];
extern void _ZN6E27x143fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv)();
extern void ABISELECT(_ZThn32_N6E27x143fooEv,_ZThn24_N6E27x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x14y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x14y0[0]),
  (VTBL_ENTRY)&_ZN6E27x143fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G27x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G27x14y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv),
};
extern VTBL_ENTRY _ZTV8G27x14y0[];
extern void _ZN6E27x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x14__8G27x14y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x14[0]),
  (VTBL_ENTRY)&_ZN6E27x143fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C276E27x14__8G27x14y0[] = {
  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__3C276E27x14__8G27x14y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv)();
extern void ABISELECT(_ZThn32_N6E27x143fooEv,_ZThn24_N6E27x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x14__8G27x14y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E27x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv),
};
static  VTT_ENTRY vtt_G27x14y0[] = {
  {&(_ZTV8G27x14y0[5]),  5,13},
  {&(_tg__ZTV6E27x14__8G27x14y0[5]),  5,6},
  {&(_tg__ZTV3C276E27x14__8G27x14y0[4]),  4,5},
  {&(_tg__ZTV2A1__3C276E27x14__8G27x14y0[3]),  3,4},
  {&(_tg__ZTV2A1__6E27x14__8G27x14y0[3]),  3,4},
  {&(_ZTV8G27x14y0[12]),  12,13},
};
extern VTBL_ENTRY _ZTI8G27x14y0[];
extern  VTBL_ENTRY _ZTV8G27x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x14y0[];
static VTBL_ENTRY alt_thunk_names468[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C273fooEv,_ZThn24_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x143fooEv,_ZThn24_N6E27x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x143fooEv,_ZThn24_N6E27x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x14y0 = {  "G27x14y0", // class name
  bases_G27x14y0, 6,
  &(vtc_G27x14y0[0]), // expected_vtbl_contents
  &(vtt_G27x14y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G27x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x14y0),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x14y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names468,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x14y1  : virtual E27x14 , F1 {
  int ff;
  ~G27x14y1(); // tgen
  G27x14y1(); // tgen
};
//SIG(1 G27x14y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G27x14y1 ::~G27x14y1(){ note_dtor("G27x14y1", this);} // tgen
G27x14y1 ::G27x14y1(){ note_ctor("G27x14y1", this);} // tgen

static void Test_G27x14y1()
{
  extern Class_Descriptor cd_G27x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x14y1, buf);
    G27x14y1 *dp, &lv = *(dp=new (buf) G27x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x14y1)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x14*), ABISELECT(32,24), "G27x14y1");
    check_base_class_offset(lv, (B0*)(C27*)(E27x14*), ABISELECT(44,32), "G27x14y1");
    check_base_class_offset(lv, (C27*)(E27x14*), ABISELECT(16,12), "G27x14y1");
    check_base_class_offset(lv, (D0*)(E27x14*), ABISELECT(48,36), "G27x14y1");
    check_base_class_offset(lv, (E27x14*), ABISELECT(16,12), "G27x14y1");
    check_base_class_offset(lv, (F1*), 0, "G27x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x14y1.ff");
    test_class_info(&lv, &cd_G27x14y1);
    dp->~G27x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x14y1(Test_G27x14y1, "G27x14y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G27x14y1C1Ev();
extern void _ZN8G27x14y1D1Ev();
Name_Map name_map_G27x14y1[] = {
  NSPAIR(_ZN8G27x14y1C1Ev),
  NSPAIR(_ZN8G27x14y1D1Ev),
  {0,0}
};
extern Class_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_E27x14;
extern VTBL_ENTRY _ZTI6E27x14[];
extern  VTBL_ENTRY _ZTV6E27x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x14y1[] = {
  // 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_E27x14,    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 _ZTI8G27x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E27x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv)();
extern void ABISELECT(_ZThn16_N6E27x143fooEv,_ZThn12_N6E27x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x14y1[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G27x14y1[0]),
  (VTBL_ENTRY)&_ZN6E27x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G27x14y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv),
};
extern VTBL_ENTRY _ZTV8G27x14y1[];
extern void _ZN6E27x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x14__8G27x14y1[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x14[0]),
  (VTBL_ENTRY)&_ZN6E27x143fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C276E27x14__8G27x14y1[] = {
  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__3C276E27x14__8G27x14y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv)();
extern void ABISELECT(_ZThn16_N6E27x143fooEv,_ZThn12_N6E27x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x14__8G27x14y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E27x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv),
};
static  VTT_ENTRY vtt_G27x14y1[] = {
  {&(_ZTV8G27x14y1[6]),  6,18},
  {&(_ZTV8G27x14y1[13]),  13,18},
  {&(_ZTV8G27x14y1[17]),  17,18},
  {&(_tg__ZTV6E27x14__8G27x14y1[5]),  5,6},
  {&(_tg__ZTV3C276E27x14__8G27x14y1[4]),  4,5},
  {&(_tg__ZTV2A1__3C276E27x14__8G27x14y1[3]),  3,4},
  {&(_tg__ZTV2A1__6E27x14__8G27x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x14y1[];
extern  VTBL_ENTRY _ZTV8G27x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x14y1[];
static VTBL_ENTRY alt_thunk_names469[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x143fooEv,_ZThn12_N6E27x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x143fooEv,_ZThn12_N6E27x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x14y1 = {  "G27x14y1", // class name
  bases_G27x14y1, 6,
  &(vtc_G27x14y1[0]), // expected_vtbl_contents
  &(vtt_G27x14y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G27x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x14y1),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x14y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names469,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x14y2  : E27x14 , virtual F1 {
  int ff;
  ~G27x14y2(); // tgen
  G27x14y2(); // tgen
};
//SIG(1 G27x14y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G27x14y2 ::~G27x14y2(){ note_dtor("G27x14y2", this);} // tgen
G27x14y2 ::G27x14y2(){ note_ctor("G27x14y2", this);} // tgen

static void Test_G27x14y2()
{
  extern Class_Descriptor cd_G27x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G27x14y2, buf);
    G27x14y2 *dp, &lv = *(dp=new (buf) G27x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G27x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x14y2)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x14*), ABISELECT(24,16), "G27x14y2");
    check_base_class_offset(lv, (B0*)(C27*)(E27x14*), ABISELECT(36,24), "G27x14y2");
    check_base_class_offset(lv, (C27*)(E27x14*), 0, "G27x14y2");
    check_base_class_offset(lv, (D0*)(E27x14*), ABISELECT(40,28), "G27x14y2");
    check_base_class_offset(lv, (E27x14*), 0, "G27x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G27x14y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G27x14y2.ff");
    test_class_info(&lv, &cd_G27x14y2);
    dp->~G27x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x14y2(Test_G27x14y2, "G27x14y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G27x14y2C1Ev();
extern void _ZN8G27x14y2D1Ev();
Name_Map name_map_G27x14y2[] = {
  NSPAIR(_ZN8G27x14y2C1Ev),
  NSPAIR(_ZN8G27x14y2D1Ev),
  {0,0}
};
extern Class_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_E27x14;
extern VTBL_ENTRY _ZTI6E27x14[];
extern  VTBL_ENTRY _ZTV6E27x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x14y2[] = {
  // 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_E27x14,    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 _ZTI8G27x14y2[];
extern void _ZN6E27x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv)();
extern void ABISELECT(_ZThn24_N6E27x143fooEv,_ZThn16_N6E27x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G27x14y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x14y2[0]),
  (VTBL_ENTRY)&_ZN6E27x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G27x14y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G27x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G27x14y2[];
extern void _ZN6E27x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x14__8G27x14y2[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x14[0]),
  (VTBL_ENTRY)&_ZN6E27x143fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C276E27x14__8G27x14y2[] = {
  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__3C276E27x14__8G27x14y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv)();
extern void ABISELECT(_ZThn24_N6E27x143fooEv,_ZThn16_N6E27x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x14__8G27x14y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E27x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv),
};
static  VTT_ENTRY vtt_G27x14y2[] = {
  {&(_ZTV8G27x14y2[6]),  6,15},
  {&(_tg__ZTV6E27x14__8G27x14y2[5]),  5,6},
  {&(_tg__ZTV3C276E27x14__8G27x14y2[4]),  4,5},
  {&(_tg__ZTV2A1__3C276E27x14__8G27x14y2[3]),  3,4},
  {&(_tg__ZTV2A1__6E27x14__8G27x14y2[3]),  3,4},
  {&(_ZTV8G27x14y2[10]),  10,15},
  {&(_ZTV8G27x14y2[14]),  14,15},
};
extern VTBL_ENTRY _ZTI8G27x14y2[];
extern  VTBL_ENTRY _ZTV8G27x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x14y2[];
static VTBL_ENTRY alt_thunk_names470[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x143fooEv,_ZThn16_N6E27x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x143fooEv,_ZThn16_N6E27x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x14y2 = {  "G27x14y2", // class name
  bases_G27x14y2, 6,
  &(vtc_G27x14y2[0]), // expected_vtbl_contents
  &(vtt_G27x14y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G27x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x14y2),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x14y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names470,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x14y3  : virtual E27x14 , virtual F1 {
  int ff;
  ~G27x14y3(); // tgen
  G27x14y3(); // tgen
};
//SIG(1 G27x14y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G27x14y3 ::~G27x14y3(){ note_dtor("G27x14y3", this);} // tgen
G27x14y3 ::G27x14y3(){ note_ctor("G27x14y3", this);} // tgen

static void Test_G27x14y3()
{
  extern Class_Descriptor cd_G27x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G27x14y3, buf);
    G27x14y3 *dp, &lv = *(dp=new (buf) G27x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G27x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x14y3)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x14*), ABISELECT(32,20), "G27x14y3");
    check_base_class_offset(lv, (B0*)(C27*)(E27x14*), ABISELECT(44,28), "G27x14y3");
    check_base_class_offset(lv, (C27*)(E27x14*), ABISELECT(16,8), "G27x14y3");
    check_base_class_offset(lv, (D0*)(E27x14*), ABISELECT(48,32), "G27x14y3");
    check_base_class_offset(lv, (E27x14*), ABISELECT(16,8), "G27x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G27x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G27x14y3.ff");
    test_class_info(&lv, &cd_G27x14y3);
    dp->~G27x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x14y3(Test_G27x14y3, "G27x14y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G27x14y3C1Ev();
extern void _ZN8G27x14y3D1Ev();
Name_Map name_map_G27x14y3[] = {
  NSPAIR(_ZN8G27x14y3C1Ev),
  NSPAIR(_ZN8G27x14y3D1Ev),
  {0,0}
};
extern Class_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_E27x14;
extern VTBL_ENTRY _ZTI6E27x14[];
extern  VTBL_ENTRY _ZTV6E27x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x14y3[] = {
  // 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_E27x14,    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 _ZTI8G27x14y3[];
extern void _ZN6E27x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv)();
extern void ABISELECT(_ZThn16_N6E27x143fooEv,_ZThn12_N6E27x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G27x14y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x14y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G27x14y3[0]),
  (VTBL_ENTRY)&_ZN6E27x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G27x14y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G27x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G27x14y3[];
extern void _ZN6E27x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x14__8G27x14y3[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x14[0]),
  (VTBL_ENTRY)&_ZN6E27x143fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C276E27x14__8G27x14y3[] = {
  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__3C276E27x14__8G27x14y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv)();
extern void ABISELECT(_ZThn16_N6E27x143fooEv,_ZThn12_N6E27x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x14__8G27x14y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E27x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv),
};
static  VTT_ENTRY vtt_G27x14y3[] = {
  {&(_ZTV8G27x14y3[7]),  7,22},
  {&(_ZTV8G27x14y3[13]),  13,22},
  {&(_ZTV8G27x14y3[17]),  17,22},
  {&(_ZTV8G27x14y3[21]),  21,22},
  {&(_tg__ZTV6E27x14__8G27x14y3[5]),  5,6},
  {&(_tg__ZTV3C276E27x14__8G27x14y3[4]),  4,5},
  {&(_tg__ZTV2A1__3C276E27x14__8G27x14y3[3]),  3,4},
  {&(_tg__ZTV2A1__6E27x14__8G27x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x14y3[];
extern  VTBL_ENTRY _ZTV8G27x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x14y3[];
static VTBL_ENTRY alt_thunk_names471[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x143fooEv,_ZThn12_N6E27x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x143fooEv,_ZThn12_N6E27x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x14y3 = {  "G27x14y3", // class name
  bases_G27x14y3, 6,
  &(vtc_G27x14y3[0]), // expected_vtbl_contents
  &(vtt_G27x14y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G27x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x14y3),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x14y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names471,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x14y4  : E27x14 , F0 {
  int ff;
  ~G27x14y4(); // tgen
  G27x14y4(); // tgen
};
//SIG(1 G27x14y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G27x14y4 ::~G27x14y4(){ note_dtor("G27x14y4", this);} // tgen
G27x14y4 ::G27x14y4(){ note_ctor("G27x14y4", this);} // tgen

static void Test_G27x14y4()
{
  extern Class_Descriptor cd_G27x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G27x14y4, buf);
    G27x14y4 *dp, &lv = *(dp=new (buf) G27x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G27x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x14y4)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x14*), ABISELECT(24,20), "G27x14y4");
    check_base_class_offset(lv, (B0*)(C27*)(E27x14*), ABISELECT(36,28), "G27x14y4");
    check_base_class_offset(lv, (C27*)(E27x14*), 0, "G27x14y4");
    check_base_class_offset(lv, (D0*)(E27x14*), ABISELECT(40,32), "G27x14y4");
    check_base_class_offset(lv, (E27x14*), 0, "G27x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G27x14y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G27x14y4.ff");
    test_class_info(&lv, &cd_G27x14y4);
    dp->~G27x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x14y4(Test_G27x14y4, "G27x14y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G27x14y4C1Ev();
extern void _ZN8G27x14y4D1Ev();
Name_Map name_map_G27x14y4[] = {
  NSPAIR(_ZN8G27x14y4C1Ev),
  NSPAIR(_ZN8G27x14y4D1Ev),
  {0,0}
};
extern Class_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_E27x14;
extern VTBL_ENTRY _ZTI6E27x14[];
extern  VTBL_ENTRY _ZTV6E27x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x14y4[] = {
  // 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_E27x14,    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 _ZTI8G27x14y4[];
extern void _ZN6E27x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv)();
extern void ABISELECT(_ZThn24_N6E27x143fooEv,_ZThn20_N6E27x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x14y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x14y4[0]),
  (VTBL_ENTRY)&_ZN6E27x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G27x14y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv),
};
extern VTBL_ENTRY _ZTV8G27x14y4[];
extern void _ZN6E27x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x14__8G27x14y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x14[0]),
  (VTBL_ENTRY)&_ZN6E27x143fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C276E27x14__8G27x14y4[] = {
  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__3C276E27x14__8G27x14y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv)();
extern void ABISELECT(_ZThn24_N6E27x143fooEv,_ZThn20_N6E27x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x14__8G27x14y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E27x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv),
};
static  VTT_ENTRY vtt_G27x14y4[] = {
  {&(_ZTV8G27x14y4[5]),  5,10},
  {&(_tg__ZTV6E27x14__8G27x14y4[5]),  5,6},
  {&(_tg__ZTV3C276E27x14__8G27x14y4[4]),  4,5},
  {&(_tg__ZTV2A1__3C276E27x14__8G27x14y4[3]),  3,4},
  {&(_tg__ZTV2A1__6E27x14__8G27x14y4[3]),  3,4},
  {&(_ZTV8G27x14y4[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G27x14y4[];
extern  VTBL_ENTRY _ZTV8G27x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x14y4[];
static VTBL_ENTRY alt_thunk_names472[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x143fooEv,_ZThn20_N6E27x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x143fooEv,_ZThn20_N6E27x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x14y4 = {  "G27x14y4", // class name
  bases_G27x14y4, 6,
  &(vtc_G27x14y4[0]), // expected_vtbl_contents
  &(vtt_G27x14y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G27x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x14y4),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x14y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names472,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x14y5  : virtual E27x14 , F0 {
  int ff;
  ~G27x14y5(); // tgen
  G27x14y5(); // tgen
};
//SIG(1 G27x14y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G27x14y5 ::~G27x14y5(){ note_dtor("G27x14y5", this);} // tgen
G27x14y5 ::G27x14y5(){ note_ctor("G27x14y5", this);} // tgen

static void Test_G27x14y5()
{
  extern Class_Descriptor cd_G27x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x14y5, buf);
    G27x14y5 *dp, &lv = *(dp=new (buf) G27x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x14y5)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x14*), ABISELECT(32,24), "G27x14y5");
    check_base_class_offset(lv, (B0*)(C27*)(E27x14*), ABISELECT(44,32), "G27x14y5");
    check_base_class_offset(lv, (C27*)(E27x14*), ABISELECT(16,12), "G27x14y5");
    check_base_class_offset(lv, (D0*)(E27x14*), ABISELECT(48,36), "G27x14y5");
    check_base_class_offset(lv, (E27x14*), ABISELECT(16,12), "G27x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G27x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x14y5.ff");
    test_class_info(&lv, &cd_G27x14y5);
    dp->~G27x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x14y5(Test_G27x14y5, "G27x14y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G27x14y5C1Ev();
extern void _ZN8G27x14y5D1Ev();
Name_Map name_map_G27x14y5[] = {
  NSPAIR(_ZN8G27x14y5C1Ev),
  NSPAIR(_ZN8G27x14y5D1Ev),
  {0,0}
};
extern Class_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_E27x14;
extern VTBL_ENTRY _ZTI6E27x14[];
extern  VTBL_ENTRY _ZTV6E27x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x14y5[] = {
  // 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_E27x14,    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 _ZTI8G27x14y5[];
extern void _ZN6E27x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv)();
extern void ABISELECT(_ZThn16_N6E27x143fooEv,_ZThn12_N6E27x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x14y5[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x14y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G27x14y5[0]),
  (VTBL_ENTRY)&_ZN6E27x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G27x14y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv),
};
extern VTBL_ENTRY _ZTV8G27x14y5[];
extern void _ZN6E27x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x14__8G27x14y5[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x14[0]),
  (VTBL_ENTRY)&_ZN6E27x143fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C276E27x14__8G27x14y5[] = {
  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__3C276E27x14__8G27x14y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv)();
extern void ABISELECT(_ZThn16_N6E27x143fooEv,_ZThn12_N6E27x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x14__8G27x14y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E27x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv),
};
static  VTT_ENTRY vtt_G27x14y5[] = {
  {&(_ZTV8G27x14y5[6]),  6,17},
  {&(_ZTV8G27x14y5[12]),  12,17},
  {&(_ZTV8G27x14y5[16]),  16,17},
  {&(_tg__ZTV6E27x14__8G27x14y5[5]),  5,6},
  {&(_tg__ZTV3C276E27x14__8G27x14y5[4]),  4,5},
  {&(_tg__ZTV2A1__3C276E27x14__8G27x14y5[3]),  3,4},
  {&(_tg__ZTV2A1__6E27x14__8G27x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x14y5[];
extern  VTBL_ENTRY _ZTV8G27x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x14y5[];
static VTBL_ENTRY alt_thunk_names473[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x143fooEv,_ZThn12_N6E27x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x143fooEv,_ZThn12_N6E27x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x14y5 = {  "G27x14y5", // class name
  bases_G27x14y5, 6,
  &(vtc_G27x14y5[0]), // expected_vtbl_contents
  &(vtt_G27x14y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G27x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x14y5),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x14y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names473,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x14y6  : E27x14 , virtual F0 {
  int ff;
  ~G27x14y6(); // tgen
  G27x14y6(); // tgen
};
//SIG(1 G27x14y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G27x14y6 ::~G27x14y6(){ note_dtor("G27x14y6", this);} // tgen
G27x14y6 ::G27x14y6(){ note_ctor("G27x14y6", this);} // tgen

static void Test_G27x14y6()
{
  extern Class_Descriptor cd_G27x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G27x14y6, buf);
    G27x14y6 *dp, &lv = *(dp=new (buf) G27x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G27x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x14y6)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x14*), ABISELECT(24,16), "G27x14y6");
    check_base_class_offset(lv, (B0*)(C27*)(E27x14*), ABISELECT(36,24), "G27x14y6");
    check_base_class_offset(lv, (C27*)(E27x14*), 0, "G27x14y6");
    check_base_class_offset(lv, (D0*)(E27x14*), ABISELECT(40,28), "G27x14y6");
    check_base_class_offset(lv, (E27x14*), 0, "G27x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G27x14y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G27x14y6.ff");
    test_class_info(&lv, &cd_G27x14y6);
    dp->~G27x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x14y6(Test_G27x14y6, "G27x14y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G27x14y6C1Ev();
extern void _ZN8G27x14y6D1Ev();
Name_Map name_map_G27x14y6[] = {
  NSPAIR(_ZN8G27x14y6C1Ev),
  NSPAIR(_ZN8G27x14y6D1Ev),
  {0,0}
};
extern Class_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_E27x14;
extern VTBL_ENTRY _ZTI6E27x14[];
extern  VTBL_ENTRY _ZTV6E27x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x14y6[] = {
  // 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_E27x14,    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 _ZTI8G27x14y6[];
extern void _ZN6E27x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv)();
extern void ABISELECT(_ZThn24_N6E27x143fooEv,_ZThn16_N6E27x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x14y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x14y6[0]),
  (VTBL_ENTRY)&_ZN6E27x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G27x14y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv),
};
extern VTBL_ENTRY _ZTV8G27x14y6[];
extern void _ZN6E27x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x14__8G27x14y6[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x14[0]),
  (VTBL_ENTRY)&_ZN6E27x143fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C276E27x14__8G27x14y6[] = {
  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__3C276E27x14__8G27x14y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv)();
extern void ABISELECT(_ZThn24_N6E27x143fooEv,_ZThn16_N6E27x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x14__8G27x14y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E27x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv),
};
static  VTT_ENTRY vtt_G27x14y6[] = {
  {&(_ZTV8G27x14y6[6]),  6,11},
  {&(_tg__ZTV6E27x14__8G27x14y6[5]),  5,6},
  {&(_tg__ZTV3C276E27x14__8G27x14y6[4]),  4,5},
  {&(_tg__ZTV2A1__3C276E27x14__8G27x14y6[3]),  3,4},
  {&(_tg__ZTV2A1__6E27x14__8G27x14y6[3]),  3,4},
  {&(_ZTV8G27x14y6[10]),  10,11},
};
extern VTBL_ENTRY _ZTI8G27x14y6[];
extern  VTBL_ENTRY _ZTV8G27x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x14y6[];
static VTBL_ENTRY alt_thunk_names474[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x143fooEv,_ZThn16_N6E27x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x143fooEv,_ZThn16_N6E27x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x14y6 = {  "G27x14y6", // class name
  bases_G27x14y6, 6,
  &(vtc_G27x14y6[0]), // expected_vtbl_contents
  &(vtt_G27x14y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G27x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x14y6),11, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x14y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names474,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x14y7  : virtual E27x14 , virtual F0 {
  int ff;
  ~G27x14y7(); // tgen
  G27x14y7(); // tgen
};
//SIG(1 G27x14y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G27x14y7 ::~G27x14y7(){ note_dtor("G27x14y7", this);} // tgen
G27x14y7 ::G27x14y7(){ note_ctor("G27x14y7", this);} // tgen

static void Test_G27x14y7()
{
  extern Class_Descriptor cd_G27x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x14y7, buf);
    G27x14y7 *dp, &lv = *(dp=new (buf) G27x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x14y7)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x14*), ABISELECT(32,20), "G27x14y7");
    check_base_class_offset(lv, (B0*)(C27*)(E27x14*), ABISELECT(44,28), "G27x14y7");
    check_base_class_offset(lv, (C27*)(E27x14*), ABISELECT(16,8), "G27x14y7");
    check_base_class_offset(lv, (D0*)(E27x14*), ABISELECT(48,32), "G27x14y7");
    check_base_class_offset(lv, (E27x14*), ABISELECT(16,8), "G27x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G27x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G27x14y7.ff");
    test_class_info(&lv, &cd_G27x14y7);
    dp->~G27x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x14y7(Test_G27x14y7, "G27x14y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G27x14y7C1Ev();
extern void _ZN8G27x14y7D1Ev();
Name_Map name_map_G27x14y7[] = {
  NSPAIR(_ZN8G27x14y7C1Ev),
  NSPAIR(_ZN8G27x14y7D1Ev),
  {0,0}
};
extern Class_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_E27x14;
extern VTBL_ENTRY _ZTI6E27x14[];
extern  VTBL_ENTRY _ZTV6E27x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x14y7[] = {
  // 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_E27x14,    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 _ZTI8G27x14y7[];
extern void _ZN6E27x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv)();
extern void ABISELECT(_ZThn16_N6E27x143fooEv,_ZThn12_N6E27x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x14y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x14y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G27x14y7[0]),
  (VTBL_ENTRY)&_ZN6E27x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G27x14y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv),
};
extern VTBL_ENTRY _ZTV8G27x14y7[];
extern void _ZN6E27x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x14__8G27x14y7[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x14[0]),
  (VTBL_ENTRY)&_ZN6E27x143fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C276E27x14__8G27x14y7[] = {
  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__3C276E27x14__8G27x14y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv)();
extern void ABISELECT(_ZThn16_N6E27x143fooEv,_ZThn12_N6E27x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x14__8G27x14y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E27x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv),
};
static  VTT_ENTRY vtt_G27x14y7[] = {
  {&(_ZTV8G27x14y7[7]),  7,18},
  {&(_ZTV8G27x14y7[13]),  13,18},
  {&(_ZTV8G27x14y7[17]),  17,18},
  {&(_tg__ZTV6E27x14__8G27x14y7[5]),  5,6},
  {&(_tg__ZTV3C276E27x14__8G27x14y7[4]),  4,5},
  {&(_tg__ZTV2A1__3C276E27x14__8G27x14y7[3]),  3,4},
  {&(_tg__ZTV2A1__6E27x14__8G27x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x14y7[];
extern  VTBL_ENTRY _ZTV8G27x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x14y7[];
static VTBL_ENTRY alt_thunk_names475[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x143fooEv,_ZTv0_n12_N6E27x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x143fooEv,_ZThn12_N6E27x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x143fooEv,_ZThn12_N6E27x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x14y7 = {  "G27x14y7", // class name
  bases_G27x14y7, 6,
  &(vtc_G27x14y7[0]), // expected_vtbl_contents
  &(vtt_G27x14y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G27x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x14y7),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x14y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names475,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E28x14  : C28 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E28x143fooEv
  ~E28x14(); // tgen
  E28x14(); // tgen
};
//SIG(-1 E28x14) C1{ BC2{ BC3{ Fi} VBC4{ v1 Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E28x14 ::foo(){vfunc_called(this, "_ZN6E28x143fooEv");}
E28x14 ::~E28x14(){ note_dtor("E28x14", this);} // tgen
E28x14 ::E28x14(){ note_ctor("E28x14", this);} // tgen

static void Test_E28x14()
{
  extern Class_Descriptor cd_E28x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E28x14, buf);
    E28x14 *dp, &lv = *(dp=new (buf) E28x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E28x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E28x14)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(8,4), "E28x14");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(24,16), "E28x14");
    check_base_class_offset(lv, (C28*), 0, "E28x14");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E28x14");
    check_field_offset(lv, fd, ABISELECT(16,12), "E28x14.fd");
    test_class_info(&lv, &cd_E28x14);
    dp->~E28x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE28x14(Test_E28x14, "E28x14", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E28x14C1Ev();
extern void _ZN6E28x14D1Ev();
Name_Map name_map_E28x14[] = {
  NSPAIR(_ZN6E28x14C1Ev),
  NSPAIR(_ZN6E28x14D1Ev),
  {0,0}
};
extern Class_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_E28x14[] = {
  // 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 _ZTI6E28x14[];
extern void _ZN6E28x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv)();
extern void ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn16_N6E28x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E28x14[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x14[0]),
  (VTBL_ENTRY)&_ZN6E28x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E28x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv),
};
extern VTBL_ENTRY _ZTV6E28x14[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__6E28x14[] = {
  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__6E28x14[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_E28x14[] = {
  {&(_ZTV6E28x14[4]),  4,9},
  {&(_tg__ZTV3C28__6E28x14[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__6E28x14[3]),  3,4},
  {&(_ZTV6E28x14[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6E28x14[];
extern  VTBL_ENTRY _ZTV6E28x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x14[];
static VTBL_ENTRY alt_thunk_names476[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn16_N6E28x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E28x14 = {  "E28x14", // class name
  bases_E28x14, 4,
  &(vtc_E28x14[0]), // expected_vtbl_contents
  &(vtt_E28x14[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E28x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E28x14),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E28x14),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names476,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x14y0  : E28x14 , F1 {
  int ff;
  ~G28x14y0(); // tgen
  G28x14y0(); // tgen
};
//SIG(1 G28x14y0) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G28x14y0 ::~G28x14y0(){ note_dtor("G28x14y0", this);} // tgen
G28x14y0 ::G28x14y0(){ note_ctor("G28x14y0", this);} // tgen

static void Test_G28x14y0()
{
  extern Class_Descriptor cd_G28x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x14y0, buf);
    G28x14y0 *dp, &lv = *(dp=new (buf) G28x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x14y0)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x14*), ABISELECT(8,4), "G28x14y0");
    check_base_class_offset(lv, (B1*)(C28*)(E28x14*), ABISELECT(40,28), "G28x14y0");
    check_base_class_offset(lv, (C28*)(E28x14*), 0, "G28x14y0");
    check_base_class_offset(lv, (D0*)(E28x14*), ABISELECT(52,36), "G28x14y0");
    check_base_class_offset(lv, (E28x14*), 0, "G28x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G28x14y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G28x14y0.ff");
    test_class_info(&lv, &cd_G28x14y0);
    dp->~G28x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x14y0(Test_G28x14y0, "G28x14y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G28x14y0C1Ev();
extern void _ZN8G28x14y0D1Ev();
Name_Map name_map_G28x14y0[] = {
  NSPAIR(_ZN8G28x14y0C1Ev),
  NSPAIR(_ZN8G28x14y0D1Ev),
  {0,0}
};
extern Class_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_E28x14;
extern VTBL_ENTRY _ZTI6E28x14[];
extern  VTBL_ENTRY _ZTV6E28x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x14y0[] = {
  // 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_E28x14,    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 _ZTI8G28x14y0[];
extern void _ZN6E28x143fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv)();
extern void ABISELECT(_ZThn40_N6E28x143fooEv,_ZThn28_N6E28x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x14y0[0]),
  (VTBL_ENTRY)&_ZN6E28x143fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G28x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G28x14y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv),
};
extern VTBL_ENTRY _ZTV8G28x14y0[];
extern void _ZN6E28x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x14__8G28x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x14[0]),
  (VTBL_ENTRY)&_ZN6E28x143fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C286E28x14__8G28x14y0[] = {
  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__3C286E28x14__8G28x14y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv)();
extern void ABISELECT(_ZThn40_N6E28x143fooEv,_ZThn28_N6E28x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x14__8G28x14y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E28x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv),
};
static  VTT_ENTRY vtt_G28x14y0[] = {
  {&(_ZTV8G28x14y0[4]),  4,12},
  {&(_tg__ZTV6E28x14__8G28x14y0[4]),  4,5},
  {&(_tg__ZTV3C286E28x14__8G28x14y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C286E28x14__8G28x14y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E28x14__8G28x14y0[3]),  3,4},
  {&(_ZTV8G28x14y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI8G28x14y0[];
extern  VTBL_ENTRY _ZTV8G28x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x14y0[];
static VTBL_ENTRY alt_thunk_names477[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C283fooEv,_ZThn28_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E28x143fooEv,_ZThn28_N6E28x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E28x143fooEv,_ZThn28_N6E28x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x14y0 = {  "G28x14y0", // class name
  bases_G28x14y0, 6,
  &(vtc_G28x14y0[0]), // expected_vtbl_contents
  &(vtt_G28x14y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G28x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x14y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x14y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names477,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x14y1  : virtual E28x14 , F1 {
  int ff;
  ~G28x14y1(); // tgen
  G28x14y1(); // tgen
};
//SIG(1 G28x14y1) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G28x14y1 ::~G28x14y1(){ note_dtor("G28x14y1", this);} // tgen
G28x14y1 ::G28x14y1(){ note_ctor("G28x14y1", this);} // tgen

static void Test_G28x14y1()
{
  extern Class_Descriptor cd_G28x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x14y1, buf);
    G28x14y1 *dp, &lv = *(dp=new (buf) G28x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x14y1)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x14*), ABISELECT(24,16), "G28x14y1");
    check_base_class_offset(lv, (B1*)(C28*)(E28x14*), ABISELECT(40,28), "G28x14y1");
    check_base_class_offset(lv, (C28*)(E28x14*), ABISELECT(16,12), "G28x14y1");
    check_base_class_offset(lv, (D0*)(E28x14*), ABISELECT(52,36), "G28x14y1");
    check_base_class_offset(lv, (E28x14*), ABISELECT(16,12), "G28x14y1");
    check_base_class_offset(lv, (F1*), 0, "G28x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x14y1.ff");
    test_class_info(&lv, &cd_G28x14y1);
    dp->~G28x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x14y1(Test_G28x14y1, "G28x14y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G28x14y1C1Ev();
extern void _ZN8G28x14y1D1Ev();
Name_Map name_map_G28x14y1[] = {
  NSPAIR(_ZN8G28x14y1C1Ev),
  NSPAIR(_ZN8G28x14y1D1Ev),
  {0,0}
};
extern Class_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_E28x14;
extern VTBL_ENTRY _ZTI6E28x14[];
extern  VTBL_ENTRY _ZTV6E28x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x14y1[] = {
  // 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_E28x14,    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 _ZTI8G28x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E28x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv)();
extern void ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn16_N6E28x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x14y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G28x14y1[0]),
  (VTBL_ENTRY)&_ZN6E28x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G28x14y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv),
};
extern VTBL_ENTRY _ZTV8G28x14y1[];
extern void _ZN6E28x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x14__8G28x14y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x14[0]),
  (VTBL_ENTRY)&_ZN6E28x143fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C286E28x14__8G28x14y1[] = {
  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__3C286E28x14__8G28x14y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv)();
extern void ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn16_N6E28x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x14__8G28x14y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E28x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv),
};
static  VTT_ENTRY vtt_G28x14y1[] = {
  {&(_ZTV8G28x14y1[5]),  5,16},
  {&(_ZTV8G28x14y1[11]),  11,16},
  {&(_ZTV8G28x14y1[15]),  15,16},
  {&(_tg__ZTV6E28x14__8G28x14y1[4]),  4,5},
  {&(_tg__ZTV3C286E28x14__8G28x14y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C286E28x14__8G28x14y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E28x14__8G28x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x14y1[];
extern  VTBL_ENTRY _ZTV8G28x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x14y1[];
static VTBL_ENTRY alt_thunk_names478[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn16_N6E28x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn16_N6E28x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x14y1 = {  "G28x14y1", // class name
  bases_G28x14y1, 6,
  &(vtc_G28x14y1[0]), // expected_vtbl_contents
  &(vtt_G28x14y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G28x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x14y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x14y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names478,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x14y2  : E28x14 , virtual F1 {
  int ff;
  ~G28x14y2(); // tgen
  G28x14y2(); // tgen
};
//SIG(1 G28x14y2) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G28x14y2 ::~G28x14y2(){ note_dtor("G28x14y2", this);} // tgen
G28x14y2 ::G28x14y2(){ note_ctor("G28x14y2", this);} // tgen

static void Test_G28x14y2()
{
  extern Class_Descriptor cd_G28x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x14y2, buf);
    G28x14y2 *dp, &lv = *(dp=new (buf) G28x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x14y2)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x14*), ABISELECT(8,4), "G28x14y2");
    check_base_class_offset(lv, (B1*)(C28*)(E28x14*), ABISELECT(24,20), "G28x14y2");
    check_base_class_offset(lv, (C28*)(E28x14*), 0, "G28x14y2");
    check_base_class_offset(lv, (D0*)(E28x14*), ABISELECT(36,28), "G28x14y2");
    check_base_class_offset(lv, (E28x14*), 0, "G28x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G28x14y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G28x14y2.ff");
    test_class_info(&lv, &cd_G28x14y2);
    dp->~G28x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x14y2(Test_G28x14y2, "G28x14y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G28x14y2C1Ev();
extern void _ZN8G28x14y2D1Ev();
Name_Map name_map_G28x14y2[] = {
  NSPAIR(_ZN8G28x14y2C1Ev),
  NSPAIR(_ZN8G28x14y2D1Ev),
  {0,0}
};
extern Class_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_E28x14;
extern VTBL_ENTRY _ZTI6E28x14[];
extern  VTBL_ENTRY _ZTV6E28x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x14y2[] = {
  // 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_E28x14,    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 _ZTI8G28x14y2[];
extern void _ZN6E28x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv)();
extern void ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn20_N6E28x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G28x14y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x14y2[0]),
  (VTBL_ENTRY)&_ZN6E28x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G28x14y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G28x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G28x14y2[];
extern void _ZN6E28x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x14__8G28x14y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x14[0]),
  (VTBL_ENTRY)&_ZN6E28x143fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C286E28x14__8G28x14y2[] = {
  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__3C286E28x14__8G28x14y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv)();
extern void ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn20_N6E28x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x14__8G28x14y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E28x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv),
};
static  VTT_ENTRY vtt_G28x14y2[] = {
  {&(_ZTV8G28x14y2[5]),  5,14},
  {&(_tg__ZTV6E28x14__8G28x14y2[4]),  4,5},
  {&(_tg__ZTV3C286E28x14__8G28x14y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C286E28x14__8G28x14y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E28x14__8G28x14y2[3]),  3,4},
  {&(_ZTV8G28x14y2[9]),  9,14},
  {&(_ZTV8G28x14y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI8G28x14y2[];
extern  VTBL_ENTRY _ZTV8G28x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x14y2[];
static VTBL_ENTRY alt_thunk_names479[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn20_N6E28x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn20_N6E28x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x14y2 = {  "G28x14y2", // class name
  bases_G28x14y2, 6,
  &(vtc_G28x14y2[0]), // expected_vtbl_contents
  &(vtt_G28x14y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G28x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x14y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x14y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names479,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x14y3  : virtual E28x14 , virtual F1 {
  int ff;
  ~G28x14y3(); // tgen
  G28x14y3(); // tgen
};
//SIG(1 G28x14y3) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G28x14y3 ::~G28x14y3(){ note_dtor("G28x14y3", this);} // tgen
G28x14y3 ::G28x14y3(){ note_ctor("G28x14y3", this);} // tgen

static void Test_G28x14y3()
{
  extern Class_Descriptor cd_G28x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G28x14y3, buf);
    G28x14y3 *dp, &lv = *(dp=new (buf) G28x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G28x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x14y3)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x14*), ABISELECT(24,12), "G28x14y3");
    check_base_class_offset(lv, (B1*)(C28*)(E28x14*), ABISELECT(40,24), "G28x14y3");
    check_base_class_offset(lv, (C28*)(E28x14*), ABISELECT(16,8), "G28x14y3");
    check_base_class_offset(lv, (D0*)(E28x14*), ABISELECT(52,32), "G28x14y3");
    check_base_class_offset(lv, (E28x14*), ABISELECT(16,8), "G28x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G28x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G28x14y3.ff");
    test_class_info(&lv, &cd_G28x14y3);
    dp->~G28x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x14y3(Test_G28x14y3, "G28x14y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G28x14y3C1Ev();
extern void _ZN8G28x14y3D1Ev();
Name_Map name_map_G28x14y3[] = {
  NSPAIR(_ZN8G28x14y3C1Ev),
  NSPAIR(_ZN8G28x14y3D1Ev),
  {0,0}
};
extern Class_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_E28x14;
extern VTBL_ENTRY _ZTI6E28x14[];
extern  VTBL_ENTRY _ZTV6E28x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x14y3[] = {
  // 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_E28x14,    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 _ZTI8G28x14y3[];
extern void _ZN6E28x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv)();
extern void ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn16_N6E28x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G28x14y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x14y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G28x14y3[0]),
  (VTBL_ENTRY)&_ZN6E28x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G28x14y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G28x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G28x14y3[];
extern void _ZN6E28x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x14__8G28x14y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x14[0]),
  (VTBL_ENTRY)&_ZN6E28x143fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C286E28x14__8G28x14y3[] = {
  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__3C286E28x14__8G28x14y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv)();
extern void ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn16_N6E28x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x14__8G28x14y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E28x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv),
};
static  VTT_ENTRY vtt_G28x14y3[] = {
  {&(_ZTV8G28x14y3[6]),  6,20},
  {&(_ZTV8G28x14y3[11]),  11,20},
  {&(_ZTV8G28x14y3[15]),  15,20},
  {&(_ZTV8G28x14y3[19]),  19,20},
  {&(_tg__ZTV6E28x14__8G28x14y3[4]),  4,5},
  {&(_tg__ZTV3C286E28x14__8G28x14y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C286E28x14__8G28x14y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E28x14__8G28x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x14y3[];
extern  VTBL_ENTRY _ZTV8G28x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x14y3[];
static VTBL_ENTRY alt_thunk_names480[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn16_N6E28x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn16_N6E28x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x14y3 = {  "G28x14y3", // class name
  bases_G28x14y3, 6,
  &(vtc_G28x14y3[0]), // expected_vtbl_contents
  &(vtt_G28x14y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G28x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x14y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x14y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names480,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x14y4  : E28x14 , F0 {
  int ff;
  ~G28x14y4(); // tgen
  G28x14y4(); // tgen
};
//SIG(1 G28x14y4) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G28x14y4 ::~G28x14y4(){ note_dtor("G28x14y4", this);} // tgen
G28x14y4 ::G28x14y4(){ note_ctor("G28x14y4", this);} // tgen

static void Test_G28x14y4()
{
  extern Class_Descriptor cd_G28x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G28x14y4, buf);
    G28x14y4 *dp, &lv = *(dp=new (buf) G28x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G28x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x14y4)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x14*), ABISELECT(8,4), "G28x14y4");
    check_base_class_offset(lv, (B1*)(C28*)(E28x14*), ABISELECT(32,24), "G28x14y4");
    check_base_class_offset(lv, (C28*)(E28x14*), 0, "G28x14y4");
    check_base_class_offset(lv, (D0*)(E28x14*), ABISELECT(44,32), "G28x14y4");
    check_base_class_offset(lv, (E28x14*), 0, "G28x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G28x14y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G28x14y4.ff");
    test_class_info(&lv, &cd_G28x14y4);
    dp->~G28x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x14y4(Test_G28x14y4, "G28x14y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G28x14y4C1Ev();
extern void _ZN8G28x14y4D1Ev();
Name_Map name_map_G28x14y4[] = {
  NSPAIR(_ZN8G28x14y4C1Ev),
  NSPAIR(_ZN8G28x14y4D1Ev),
  {0,0}
};
extern Class_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_E28x14;
extern VTBL_ENTRY _ZTI6E28x14[];
extern  VTBL_ENTRY _ZTV6E28x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x14y4[] = {
  // 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_E28x14,    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 _ZTI8G28x14y4[];
extern void _ZN6E28x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv)();
extern void ABISELECT(_ZThn32_N6E28x143fooEv,_ZThn24_N6E28x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x14y4[0]),
  (VTBL_ENTRY)&_ZN6E28x143fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G28x14y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv),
};
extern VTBL_ENTRY _ZTV8G28x14y4[];
extern void _ZN6E28x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x14__8G28x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x14[0]),
  (VTBL_ENTRY)&_ZN6E28x143fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C286E28x14__8G28x14y4[] = {
  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__3C286E28x14__8G28x14y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv)();
extern void ABISELECT(_ZThn32_N6E28x143fooEv,_ZThn24_N6E28x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x14__8G28x14y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E28x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv),
};
static  VTT_ENTRY vtt_G28x14y4[] = {
  {&(_ZTV8G28x14y4[4]),  4,9},
  {&(_tg__ZTV6E28x14__8G28x14y4[4]),  4,5},
  {&(_tg__ZTV3C286E28x14__8G28x14y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C286E28x14__8G28x14y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E28x14__8G28x14y4[3]),  3,4},
  {&(_ZTV8G28x14y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G28x14y4[];
extern  VTBL_ENTRY _ZTV8G28x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x14y4[];
static VTBL_ENTRY alt_thunk_names481[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x143fooEv,_ZThn24_N6E28x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x143fooEv,_ZThn24_N6E28x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x14y4 = {  "G28x14y4", // class name
  bases_G28x14y4, 6,
  &(vtc_G28x14y4[0]), // expected_vtbl_contents
  &(vtt_G28x14y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G28x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x14y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x14y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names481,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x14y5  : virtual E28x14 , F0 {
  int ff;
  ~G28x14y5(); // tgen
  G28x14y5(); // tgen
};
//SIG(1 G28x14y5) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G28x14y5 ::~G28x14y5(){ note_dtor("G28x14y5", this);} // tgen
G28x14y5 ::G28x14y5(){ note_ctor("G28x14y5", this);} // tgen

static void Test_G28x14y5()
{
  extern Class_Descriptor cd_G28x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x14y5, buf);
    G28x14y5 *dp, &lv = *(dp=new (buf) G28x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x14y5)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x14*), ABISELECT(24,16), "G28x14y5");
    check_base_class_offset(lv, (B1*)(C28*)(E28x14*), ABISELECT(40,28), "G28x14y5");
    check_base_class_offset(lv, (C28*)(E28x14*), ABISELECT(16,12), "G28x14y5");
    check_base_class_offset(lv, (D0*)(E28x14*), ABISELECT(52,36), "G28x14y5");
    check_base_class_offset(lv, (E28x14*), ABISELECT(16,12), "G28x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G28x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x14y5.ff");
    test_class_info(&lv, &cd_G28x14y5);
    dp->~G28x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x14y5(Test_G28x14y5, "G28x14y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G28x14y5C1Ev();
extern void _ZN8G28x14y5D1Ev();
Name_Map name_map_G28x14y5[] = {
  NSPAIR(_ZN8G28x14y5C1Ev),
  NSPAIR(_ZN8G28x14y5D1Ev),
  {0,0}
};
extern Class_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_E28x14;
extern VTBL_ENTRY _ZTI6E28x14[];
extern  VTBL_ENTRY _ZTV6E28x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x14y5[] = {
  // 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_E28x14,    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 _ZTI8G28x14y5[];
extern void _ZN6E28x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv)();
extern void ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn16_N6E28x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x14y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x14y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G28x14y5[0]),
  (VTBL_ENTRY)&_ZN6E28x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G28x14y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv),
};
extern VTBL_ENTRY _ZTV8G28x14y5[];
extern void _ZN6E28x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x14__8G28x14y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x14[0]),
  (VTBL_ENTRY)&_ZN6E28x143fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C286E28x14__8G28x14y5[] = {
  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__3C286E28x14__8G28x14y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv)();
extern void ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn16_N6E28x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x14__8G28x14y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E28x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv),
};
static  VTT_ENTRY vtt_G28x14y5[] = {
  {&(_ZTV8G28x14y5[5]),  5,15},
  {&(_ZTV8G28x14y5[10]),  10,15},
  {&(_ZTV8G28x14y5[14]),  14,15},
  {&(_tg__ZTV6E28x14__8G28x14y5[4]),  4,5},
  {&(_tg__ZTV3C286E28x14__8G28x14y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C286E28x14__8G28x14y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E28x14__8G28x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x14y5[];
extern  VTBL_ENTRY _ZTV8G28x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x14y5[];
static VTBL_ENTRY alt_thunk_names482[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn16_N6E28x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn16_N6E28x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x14y5 = {  "G28x14y5", // class name
  bases_G28x14y5, 6,
  &(vtc_G28x14y5[0]), // expected_vtbl_contents
  &(vtt_G28x14y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G28x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x14y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x14y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names482,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x14y6  : E28x14 , virtual F0 {
  int ff;
  ~G28x14y6(); // tgen
  G28x14y6(); // tgen
};
//SIG(1 G28x14y6) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G28x14y6 ::~G28x14y6(){ note_dtor("G28x14y6", this);} // tgen
G28x14y6 ::G28x14y6(){ note_ctor("G28x14y6", this);} // tgen

static void Test_G28x14y6()
{
  extern Class_Descriptor cd_G28x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G28x14y6, buf);
    G28x14y6 *dp, &lv = *(dp=new (buf) G28x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G28x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x14y6)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x14*), ABISELECT(8,4), "G28x14y6");
    check_base_class_offset(lv, (B1*)(C28*)(E28x14*), ABISELECT(24,20), "G28x14y6");
    check_base_class_offset(lv, (C28*)(E28x14*), 0, "G28x14y6");
    check_base_class_offset(lv, (D0*)(E28x14*), ABISELECT(36,28), "G28x14y6");
    check_base_class_offset(lv, (E28x14*), 0, "G28x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G28x14y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G28x14y6.ff");
    test_class_info(&lv, &cd_G28x14y6);
    dp->~G28x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x14y6(Test_G28x14y6, "G28x14y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G28x14y6C1Ev();
extern void _ZN8G28x14y6D1Ev();
Name_Map name_map_G28x14y6[] = {
  NSPAIR(_ZN8G28x14y6C1Ev),
  NSPAIR(_ZN8G28x14y6D1Ev),
  {0,0}
};
extern Class_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_E28x14;
extern VTBL_ENTRY _ZTI6E28x14[];
extern  VTBL_ENTRY _ZTV6E28x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x14y6[] = {
  // 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_E28x14,    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 _ZTI8G28x14y6[];
extern void _ZN6E28x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv)();
extern void ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn20_N6E28x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x14y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x14y6[0]),
  (VTBL_ENTRY)&_ZN6E28x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G28x14y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv),
};
extern VTBL_ENTRY _ZTV8G28x14y6[];
extern void _ZN6E28x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x14__8G28x14y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x14[0]),
  (VTBL_ENTRY)&_ZN6E28x143fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C286E28x14__8G28x14y6[] = {
  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__3C286E28x14__8G28x14y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv)();
extern void ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn20_N6E28x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x14__8G28x14y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E28x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv),
};
static  VTT_ENTRY vtt_G28x14y6[] = {
  {&(_ZTV8G28x14y6[5]),  5,10},
  {&(_tg__ZTV6E28x14__8G28x14y6[4]),  4,5},
  {&(_tg__ZTV3C286E28x14__8G28x14y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C286E28x14__8G28x14y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E28x14__8G28x14y6[3]),  3,4},
  {&(_ZTV8G28x14y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G28x14y6[];
extern  VTBL_ENTRY _ZTV8G28x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x14y6[];
static VTBL_ENTRY alt_thunk_names483[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn20_N6E28x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn20_N6E28x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x14y6 = {  "G28x14y6", // class name
  bases_G28x14y6, 6,
  &(vtc_G28x14y6[0]), // expected_vtbl_contents
  &(vtt_G28x14y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G28x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x14y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x14y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names483,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x14y7  : virtual E28x14 , virtual F0 {
  int ff;
  ~G28x14y7(); // tgen
  G28x14y7(); // tgen
};
//SIG(1 G28x14y7) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G28x14y7 ::~G28x14y7(){ note_dtor("G28x14y7", this);} // tgen
G28x14y7 ::G28x14y7(){ note_ctor("G28x14y7", this);} // tgen

static void Test_G28x14y7()
{
  extern Class_Descriptor cd_G28x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G28x14y7, buf);
    G28x14y7 *dp, &lv = *(dp=new (buf) G28x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G28x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x14y7)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x14*), ABISELECT(24,12), "G28x14y7");
    check_base_class_offset(lv, (B1*)(C28*)(E28x14*), ABISELECT(40,24), "G28x14y7");
    check_base_class_offset(lv, (C28*)(E28x14*), ABISELECT(16,8), "G28x14y7");
    check_base_class_offset(lv, (D0*)(E28x14*), ABISELECT(52,32), "G28x14y7");
    check_base_class_offset(lv, (E28x14*), ABISELECT(16,8), "G28x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G28x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G28x14y7.ff");
    test_class_info(&lv, &cd_G28x14y7);
    dp->~G28x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x14y7(Test_G28x14y7, "G28x14y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G28x14y7C1Ev();
extern void _ZN8G28x14y7D1Ev();
Name_Map name_map_G28x14y7[] = {
  NSPAIR(_ZN8G28x14y7C1Ev),
  NSPAIR(_ZN8G28x14y7D1Ev),
  {0,0}
};
extern Class_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_E28x14;
extern VTBL_ENTRY _ZTI6E28x14[];
extern  VTBL_ENTRY _ZTV6E28x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x14y7[] = {
  // 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_E28x14,    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 _ZTI8G28x14y7[];
extern void _ZN6E28x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv)();
extern void ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn16_N6E28x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x14y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x14y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G28x14y7[0]),
  (VTBL_ENTRY)&_ZN6E28x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G28x14y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv),
};
extern VTBL_ENTRY _ZTV8G28x14y7[];
extern void _ZN6E28x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x14__8G28x14y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x14[0]),
  (VTBL_ENTRY)&_ZN6E28x143fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C286E28x14__8G28x14y7[] = {
  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__3C286E28x14__8G28x14y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv)();
extern void ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn16_N6E28x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x14__8G28x14y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E28x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv),
};
static  VTT_ENTRY vtt_G28x14y7[] = {
  {&(_ZTV8G28x14y7[6]),  6,16},
  {&(_ZTV8G28x14y7[11]),  11,16},
  {&(_ZTV8G28x14y7[15]),  15,16},
  {&(_tg__ZTV6E28x14__8G28x14y7[4]),  4,5},
  {&(_tg__ZTV3C286E28x14__8G28x14y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C286E28x14__8G28x14y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E28x14__8G28x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x14y7[];
extern  VTBL_ENTRY _ZTV8G28x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x14y7[];
static VTBL_ENTRY alt_thunk_names484[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x143fooEv,_ZTv0_n12_N6E28x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn16_N6E28x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x143fooEv,_ZThn16_N6E28x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x14y7 = {  "G28x14y7", // class name
  bases_G28x14y7, 6,
  &(vtc_G28x14y7[0]), // expected_vtbl_contents
  &(vtt_G28x14y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G28x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x14y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x14y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names484,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E29x14  : C29 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E29x143fooEv
  ~E29x14(); // tgen
  E29x14(); // tgen
};
//SIG(-1 E29x14) C1{ BC2{ BC3{ v1 Fi} VBC4{ v1 Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E29x14 ::foo(){vfunc_called(this, "_ZN6E29x143fooEv");}
E29x14 ::~E29x14(){ note_dtor("E29x14", this);} // tgen
E29x14 ::E29x14(){ note_ctor("E29x14", this);} // tgen

static void Test_E29x14()
{
  extern Class_Descriptor cd_E29x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E29x14, buf);
    E29x14 *dp, &lv = *(dp=new (buf) E29x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E29x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E29x14)");
    check_base_class_offset(lv, (A1*)(C29*), 0, "E29x14");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(24,16), "E29x14");
    check_base_class_offset(lv, (C29*), 0, "E29x14");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E29x14");
    check_field_offset(lv, fd, ABISELECT(16,12), "E29x14.fd");
    test_class_info(&lv, &cd_E29x14);
    dp->~E29x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE29x14(Test_E29x14, "E29x14", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E29x14C1Ev();
extern void _ZN6E29x14D1Ev();
Name_Map name_map_E29x14[] = {
  NSPAIR(_ZN6E29x14C1Ev),
  NSPAIR(_ZN6E29x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x14[] = {
  // 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 _ZTI6E29x14[];
extern void _ZN6E29x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv)();
extern void ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn16_N6E29x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E29x14[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x14[0]),
  (VTBL_ENTRY)&_ZN6E29x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E29x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv),
};
extern VTBL_ENTRY _ZTV6E29x14[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__6E29x14[] = {
  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__6E29x14[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_E29x14[] = {
  {&(_ZTV6E29x14[4]),  4,9},
  {&(_tg__ZTV3C29__6E29x14[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__6E29x14[3]),  3,4},
  {&(_ZTV6E29x14[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6E29x14[];
extern  VTBL_ENTRY _ZTV6E29x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x14[];
static VTBL_ENTRY alt_thunk_names485[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn16_N6E29x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E29x14 = {  "E29x14", // class name
  bases_E29x14, 4,
  &(vtc_E29x14[0]), // expected_vtbl_contents
  &(vtt_E29x14[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E29x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E29x14),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E29x14),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names485,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x14y0  : E29x14 , F1 {
  int ff;
  ~G29x14y0(); // tgen
  G29x14y0(); // tgen
};
//SIG(1 G29x14y0) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G29x14y0 ::~G29x14y0(){ note_dtor("G29x14y0", this);} // tgen
G29x14y0 ::G29x14y0(){ note_ctor("G29x14y0", this);} // tgen

static void Test_G29x14y0()
{
  extern Class_Descriptor cd_G29x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x14y0, buf);
    G29x14y0 *dp, &lv = *(dp=new (buf) G29x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x14y0)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x14*), 0, "G29x14y0");
    check_base_class_offset(lv, (B1*)(C29*)(E29x14*), ABISELECT(40,28), "G29x14y0");
    check_base_class_offset(lv, (C29*)(E29x14*), 0, "G29x14y0");
    check_base_class_offset(lv, (D0*)(E29x14*), ABISELECT(52,36), "G29x14y0");
    check_base_class_offset(lv, (E29x14*), 0, "G29x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G29x14y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G29x14y0.ff");
    test_class_info(&lv, &cd_G29x14y0);
    dp->~G29x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x14y0(Test_G29x14y0, "G29x14y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G29x14y0C1Ev();
extern void _ZN8G29x14y0D1Ev();
Name_Map name_map_G29x14y0[] = {
  NSPAIR(_ZN8G29x14y0C1Ev),
  NSPAIR(_ZN8G29x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x14;
extern VTBL_ENTRY _ZTI6E29x14[];
extern  VTBL_ENTRY _ZTV6E29x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x14y0[] = {
  // 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_E29x14,    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 _ZTI8G29x14y0[];
extern void _ZN6E29x143fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv)();
extern void ABISELECT(_ZThn40_N6E29x143fooEv,_ZThn28_N6E29x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x14y0[0]),
  (VTBL_ENTRY)&_ZN6E29x143fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G29x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G29x14y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv),
};
extern VTBL_ENTRY _ZTV8G29x14y0[];
extern void _ZN6E29x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x14__8G29x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x14[0]),
  (VTBL_ENTRY)&_ZN6E29x143fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C296E29x14__8G29x14y0[] = {
  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__3C296E29x14__8G29x14y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv)();
extern void ABISELECT(_ZThn40_N6E29x143fooEv,_ZThn28_N6E29x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x14__8G29x14y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E29x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv),
};
static  VTT_ENTRY vtt_G29x14y0[] = {
  {&(_ZTV8G29x14y0[4]),  4,12},
  {&(_tg__ZTV6E29x14__8G29x14y0[4]),  4,5},
  {&(_tg__ZTV3C296E29x14__8G29x14y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C296E29x14__8G29x14y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E29x14__8G29x14y0[3]),  3,4},
  {&(_ZTV8G29x14y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI8G29x14y0[];
extern  VTBL_ENTRY _ZTV8G29x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x14y0[];
static VTBL_ENTRY alt_thunk_names486[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C293fooEv,_ZThn28_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E29x143fooEv,_ZThn28_N6E29x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E29x143fooEv,_ZThn28_N6E29x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x14y0 = {  "G29x14y0", // class name
  bases_G29x14y0, 6,
  &(vtc_G29x14y0[0]), // expected_vtbl_contents
  &(vtt_G29x14y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G29x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x14y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x14y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names486,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x14y1  : virtual E29x14 , F1 {
  int ff;
  ~G29x14y1(); // tgen
  G29x14y1(); // tgen
};
//SIG(1 G29x14y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G29x14y1 ::~G29x14y1(){ note_dtor("G29x14y1", this);} // tgen
G29x14y1 ::G29x14y1(){ note_ctor("G29x14y1", this);} // tgen

static void Test_G29x14y1()
{
  extern Class_Descriptor cd_G29x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x14y1, buf);
    G29x14y1 *dp, &lv = *(dp=new (buf) G29x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x14y1)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x14*), ABISELECT(16,12), "G29x14y1");
    check_base_class_offset(lv, (B1*)(C29*)(E29x14*), ABISELECT(40,28), "G29x14y1");
    check_base_class_offset(lv, (C29*)(E29x14*), ABISELECT(16,12), "G29x14y1");
    check_base_class_offset(lv, (D0*)(E29x14*), ABISELECT(52,36), "G29x14y1");
    check_base_class_offset(lv, (E29x14*), ABISELECT(16,12), "G29x14y1");
    check_base_class_offset(lv, (F1*), 0, "G29x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x14y1.ff");
    test_class_info(&lv, &cd_G29x14y1);
    dp->~G29x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x14y1(Test_G29x14y1, "G29x14y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G29x14y1C1Ev();
extern void _ZN8G29x14y1D1Ev();
Name_Map name_map_G29x14y1[] = {
  NSPAIR(_ZN8G29x14y1C1Ev),
  NSPAIR(_ZN8G29x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x14;
extern VTBL_ENTRY _ZTI6E29x14[];
extern  VTBL_ENTRY _ZTV6E29x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x14y1[] = {
  // 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_E29x14,    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 _ZTI8G29x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E29x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv)();
extern void ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn16_N6E29x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x14y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G29x14y1[0]),
  (VTBL_ENTRY)&_ZN6E29x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G29x14y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv),
};
extern VTBL_ENTRY _ZTV8G29x14y1[];
extern void _ZN6E29x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x14__8G29x14y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x14[0]),
  (VTBL_ENTRY)&_ZN6E29x143fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C296E29x14__8G29x14y1[] = {
  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__3C296E29x14__8G29x14y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv)();
extern void ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn16_N6E29x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x14__8G29x14y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E29x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv),
};
static  VTT_ENTRY vtt_G29x14y1[] = {
  {&(_ZTV8G29x14y1[5]),  5,16},
  {&(_ZTV8G29x14y1[11]),  11,16},
  {&(_ZTV8G29x14y1[15]),  15,16},
  {&(_tg__ZTV6E29x14__8G29x14y1[4]),  4,5},
  {&(_tg__ZTV3C296E29x14__8G29x14y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C296E29x14__8G29x14y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E29x14__8G29x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x14y1[];
extern  VTBL_ENTRY _ZTV8G29x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x14y1[];
static VTBL_ENTRY alt_thunk_names487[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn16_N6E29x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn16_N6E29x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x14y1 = {  "G29x14y1", // class name
  bases_G29x14y1, 6,
  &(vtc_G29x14y1[0]), // expected_vtbl_contents
  &(vtt_G29x14y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G29x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x14y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x14y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names487,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x14y2  : E29x14 , virtual F1 {
  int ff;
  ~G29x14y2(); // tgen
  G29x14y2(); // tgen
};
//SIG(1 G29x14y2) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G29x14y2 ::~G29x14y2(){ note_dtor("G29x14y2", this);} // tgen
G29x14y2 ::G29x14y2(){ note_ctor("G29x14y2", this);} // tgen

static void Test_G29x14y2()
{
  extern Class_Descriptor cd_G29x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x14y2, buf);
    G29x14y2 *dp, &lv = *(dp=new (buf) G29x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x14y2)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x14*), 0, "G29x14y2");
    check_base_class_offset(lv, (B1*)(C29*)(E29x14*), ABISELECT(24,20), "G29x14y2");
    check_base_class_offset(lv, (C29*)(E29x14*), 0, "G29x14y2");
    check_base_class_offset(lv, (D0*)(E29x14*), ABISELECT(36,28), "G29x14y2");
    check_base_class_offset(lv, (E29x14*), 0, "G29x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G29x14y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G29x14y2.ff");
    test_class_info(&lv, &cd_G29x14y2);
    dp->~G29x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x14y2(Test_G29x14y2, "G29x14y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G29x14y2C1Ev();
extern void _ZN8G29x14y2D1Ev();
Name_Map name_map_G29x14y2[] = {
  NSPAIR(_ZN8G29x14y2C1Ev),
  NSPAIR(_ZN8G29x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x14;
extern VTBL_ENTRY _ZTI6E29x14[];
extern  VTBL_ENTRY _ZTV6E29x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x14y2[] = {
  // 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_E29x14,    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 _ZTI8G29x14y2[];
extern void _ZN6E29x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv)();
extern void ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn20_N6E29x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G29x14y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x14y2[0]),
  (VTBL_ENTRY)&_ZN6E29x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G29x14y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G29x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G29x14y2[];
extern void _ZN6E29x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x14__8G29x14y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x14[0]),
  (VTBL_ENTRY)&_ZN6E29x143fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C296E29x14__8G29x14y2[] = {
  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__3C296E29x14__8G29x14y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv)();
extern void ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn20_N6E29x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x14__8G29x14y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E29x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv),
};
static  VTT_ENTRY vtt_G29x14y2[] = {
  {&(_ZTV8G29x14y2[5]),  5,14},
  {&(_tg__ZTV6E29x14__8G29x14y2[4]),  4,5},
  {&(_tg__ZTV3C296E29x14__8G29x14y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C296E29x14__8G29x14y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E29x14__8G29x14y2[3]),  3,4},
  {&(_ZTV8G29x14y2[9]),  9,14},
  {&(_ZTV8G29x14y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI8G29x14y2[];
extern  VTBL_ENTRY _ZTV8G29x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x14y2[];
static VTBL_ENTRY alt_thunk_names488[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn20_N6E29x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn20_N6E29x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x14y2 = {  "G29x14y2", // class name
  bases_G29x14y2, 6,
  &(vtc_G29x14y2[0]), // expected_vtbl_contents
  &(vtt_G29x14y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G29x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x14y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x14y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names488,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x14y3  : virtual E29x14 , virtual F1 {
  int ff;
  ~G29x14y3(); // tgen
  G29x14y3(); // tgen
};
//SIG(1 G29x14y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G29x14y3 ::~G29x14y3(){ note_dtor("G29x14y3", this);} // tgen
G29x14y3 ::G29x14y3(){ note_ctor("G29x14y3", this);} // tgen

static void Test_G29x14y3()
{
  extern Class_Descriptor cd_G29x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G29x14y3, buf);
    G29x14y3 *dp, &lv = *(dp=new (buf) G29x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G29x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x14y3)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x14*), ABISELECT(16,8), "G29x14y3");
    check_base_class_offset(lv, (B1*)(C29*)(E29x14*), ABISELECT(40,24), "G29x14y3");
    check_base_class_offset(lv, (C29*)(E29x14*), ABISELECT(16,8), "G29x14y3");
    check_base_class_offset(lv, (D0*)(E29x14*), ABISELECT(52,32), "G29x14y3");
    check_base_class_offset(lv, (E29x14*), ABISELECT(16,8), "G29x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G29x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G29x14y3.ff");
    test_class_info(&lv, &cd_G29x14y3);
    dp->~G29x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x14y3(Test_G29x14y3, "G29x14y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G29x14y3C1Ev();
extern void _ZN8G29x14y3D1Ev();
Name_Map name_map_G29x14y3[] = {
  NSPAIR(_ZN8G29x14y3C1Ev),
  NSPAIR(_ZN8G29x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x14;
extern VTBL_ENTRY _ZTI6E29x14[];
extern  VTBL_ENTRY _ZTV6E29x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x14y3[] = {
  // 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_E29x14,    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 _ZTI8G29x14y3[];
extern void _ZN6E29x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv)();
extern void ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn16_N6E29x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G29x14y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x14y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G29x14y3[0]),
  (VTBL_ENTRY)&_ZN6E29x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G29x14y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G29x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G29x14y3[];
extern void _ZN6E29x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x14__8G29x14y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x14[0]),
  (VTBL_ENTRY)&_ZN6E29x143fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C296E29x14__8G29x14y3[] = {
  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__3C296E29x14__8G29x14y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv)();
extern void ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn16_N6E29x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x14__8G29x14y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E29x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv),
};
static  VTT_ENTRY vtt_G29x14y3[] = {
  {&(_ZTV8G29x14y3[6]),  6,20},
  {&(_ZTV8G29x14y3[11]),  11,20},
  {&(_ZTV8G29x14y3[15]),  15,20},
  {&(_ZTV8G29x14y3[19]),  19,20},
  {&(_tg__ZTV6E29x14__8G29x14y3[4]),  4,5},
  {&(_tg__ZTV3C296E29x14__8G29x14y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C296E29x14__8G29x14y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E29x14__8G29x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x14y3[];
extern  VTBL_ENTRY _ZTV8G29x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x14y3[];
static VTBL_ENTRY alt_thunk_names489[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn16_N6E29x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn16_N6E29x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x14y3 = {  "G29x14y3", // class name
  bases_G29x14y3, 6,
  &(vtc_G29x14y3[0]), // expected_vtbl_contents
  &(vtt_G29x14y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G29x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x14y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x14y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names489,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x14y4  : E29x14 , F0 {
  int ff;
  ~G29x14y4(); // tgen
  G29x14y4(); // tgen
};
//SIG(1 G29x14y4) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G29x14y4 ::~G29x14y4(){ note_dtor("G29x14y4", this);} // tgen
G29x14y4 ::G29x14y4(){ note_ctor("G29x14y4", this);} // tgen

static void Test_G29x14y4()
{
  extern Class_Descriptor cd_G29x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G29x14y4, buf);
    G29x14y4 *dp, &lv = *(dp=new (buf) G29x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G29x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x14y4)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x14*), 0, "G29x14y4");
    check_base_class_offset(lv, (B1*)(C29*)(E29x14*), ABISELECT(32,24), "G29x14y4");
    check_base_class_offset(lv, (C29*)(E29x14*), 0, "G29x14y4");
    check_base_class_offset(lv, (D0*)(E29x14*), ABISELECT(44,32), "G29x14y4");
    check_base_class_offset(lv, (E29x14*), 0, "G29x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G29x14y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G29x14y4.ff");
    test_class_info(&lv, &cd_G29x14y4);
    dp->~G29x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x14y4(Test_G29x14y4, "G29x14y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G29x14y4C1Ev();
extern void _ZN8G29x14y4D1Ev();
Name_Map name_map_G29x14y4[] = {
  NSPAIR(_ZN8G29x14y4C1Ev),
  NSPAIR(_ZN8G29x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x14;
extern VTBL_ENTRY _ZTI6E29x14[];
extern  VTBL_ENTRY _ZTV6E29x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x14y4[] = {
  // 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_E29x14,    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 _ZTI8G29x14y4[];
extern void _ZN6E29x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv)();
extern void ABISELECT(_ZThn32_N6E29x143fooEv,_ZThn24_N6E29x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x14y4[0]),
  (VTBL_ENTRY)&_ZN6E29x143fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G29x14y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv),
};
extern VTBL_ENTRY _ZTV8G29x14y4[];
extern void _ZN6E29x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x14__8G29x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x14[0]),
  (VTBL_ENTRY)&_ZN6E29x143fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C296E29x14__8G29x14y4[] = {
  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__3C296E29x14__8G29x14y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv)();
extern void ABISELECT(_ZThn32_N6E29x143fooEv,_ZThn24_N6E29x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x14__8G29x14y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E29x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv),
};
static  VTT_ENTRY vtt_G29x14y4[] = {
  {&(_ZTV8G29x14y4[4]),  4,9},
  {&(_tg__ZTV6E29x14__8G29x14y4[4]),  4,5},
  {&(_tg__ZTV3C296E29x14__8G29x14y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C296E29x14__8G29x14y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E29x14__8G29x14y4[3]),  3,4},
  {&(_ZTV8G29x14y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G29x14y4[];
extern  VTBL_ENTRY _ZTV8G29x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x14y4[];
static VTBL_ENTRY alt_thunk_names490[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x143fooEv,_ZThn24_N6E29x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x143fooEv,_ZThn24_N6E29x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x14y4 = {  "G29x14y4", // class name
  bases_G29x14y4, 6,
  &(vtc_G29x14y4[0]), // expected_vtbl_contents
  &(vtt_G29x14y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G29x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x14y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x14y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names490,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x14y5  : virtual E29x14 , F0 {
  int ff;
  ~G29x14y5(); // tgen
  G29x14y5(); // tgen
};
//SIG(1 G29x14y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G29x14y5 ::~G29x14y5(){ note_dtor("G29x14y5", this);} // tgen
G29x14y5 ::G29x14y5(){ note_ctor("G29x14y5", this);} // tgen

static void Test_G29x14y5()
{
  extern Class_Descriptor cd_G29x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x14y5, buf);
    G29x14y5 *dp, &lv = *(dp=new (buf) G29x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x14y5)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x14*), ABISELECT(16,12), "G29x14y5");
    check_base_class_offset(lv, (B1*)(C29*)(E29x14*), ABISELECT(40,28), "G29x14y5");
    check_base_class_offset(lv, (C29*)(E29x14*), ABISELECT(16,12), "G29x14y5");
    check_base_class_offset(lv, (D0*)(E29x14*), ABISELECT(52,36), "G29x14y5");
    check_base_class_offset(lv, (E29x14*), ABISELECT(16,12), "G29x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G29x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x14y5.ff");
    test_class_info(&lv, &cd_G29x14y5);
    dp->~G29x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x14y5(Test_G29x14y5, "G29x14y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G29x14y5C1Ev();
extern void _ZN8G29x14y5D1Ev();
Name_Map name_map_G29x14y5[] = {
  NSPAIR(_ZN8G29x14y5C1Ev),
  NSPAIR(_ZN8G29x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x14;
extern VTBL_ENTRY _ZTI6E29x14[];
extern  VTBL_ENTRY _ZTV6E29x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x14y5[] = {
  // 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_E29x14,    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 _ZTI8G29x14y5[];
extern void _ZN6E29x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv)();
extern void ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn16_N6E29x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x14y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x14y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G29x14y5[0]),
  (VTBL_ENTRY)&_ZN6E29x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G29x14y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv),
};
extern VTBL_ENTRY _ZTV8G29x14y5[];
extern void _ZN6E29x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x14__8G29x14y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x14[0]),
  (VTBL_ENTRY)&_ZN6E29x143fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C296E29x14__8G29x14y5[] = {
  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__3C296E29x14__8G29x14y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv)();
extern void ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn16_N6E29x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x14__8G29x14y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E29x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv),
};
static  VTT_ENTRY vtt_G29x14y5[] = {
  {&(_ZTV8G29x14y5[5]),  5,15},
  {&(_ZTV8G29x14y5[10]),  10,15},
  {&(_ZTV8G29x14y5[14]),  14,15},
  {&(_tg__ZTV6E29x14__8G29x14y5[4]),  4,5},
  {&(_tg__ZTV3C296E29x14__8G29x14y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C296E29x14__8G29x14y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E29x14__8G29x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x14y5[];
extern  VTBL_ENTRY _ZTV8G29x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x14y5[];
static VTBL_ENTRY alt_thunk_names491[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn16_N6E29x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn16_N6E29x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x14y5 = {  "G29x14y5", // class name
  bases_G29x14y5, 6,
  &(vtc_G29x14y5[0]), // expected_vtbl_contents
  &(vtt_G29x14y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G29x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x14y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x14y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names491,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x14y6  : E29x14 , virtual F0 {
  int ff;
  ~G29x14y6(); // tgen
  G29x14y6(); // tgen
};
//SIG(1 G29x14y6) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G29x14y6 ::~G29x14y6(){ note_dtor("G29x14y6", this);} // tgen
G29x14y6 ::G29x14y6(){ note_ctor("G29x14y6", this);} // tgen

static void Test_G29x14y6()
{
  extern Class_Descriptor cd_G29x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G29x14y6, buf);
    G29x14y6 *dp, &lv = *(dp=new (buf) G29x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G29x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x14y6)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x14*), 0, "G29x14y6");
    check_base_class_offset(lv, (B1*)(C29*)(E29x14*), ABISELECT(24,20), "G29x14y6");
    check_base_class_offset(lv, (C29*)(E29x14*), 0, "G29x14y6");
    check_base_class_offset(lv, (D0*)(E29x14*), ABISELECT(36,28), "G29x14y6");
    check_base_class_offset(lv, (E29x14*), 0, "G29x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G29x14y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G29x14y6.ff");
    test_class_info(&lv, &cd_G29x14y6);
    dp->~G29x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x14y6(Test_G29x14y6, "G29x14y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G29x14y6C1Ev();
extern void _ZN8G29x14y6D1Ev();
Name_Map name_map_G29x14y6[] = {
  NSPAIR(_ZN8G29x14y6C1Ev),
  NSPAIR(_ZN8G29x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x14;
extern VTBL_ENTRY _ZTI6E29x14[];
extern  VTBL_ENTRY _ZTV6E29x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x14y6[] = {
  // 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_E29x14,    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 _ZTI8G29x14y6[];
extern void _ZN6E29x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv)();
extern void ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn20_N6E29x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x14y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x14y6[0]),
  (VTBL_ENTRY)&_ZN6E29x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G29x14y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv),
};
extern VTBL_ENTRY _ZTV8G29x14y6[];
extern void _ZN6E29x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x14__8G29x14y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x14[0]),
  (VTBL_ENTRY)&_ZN6E29x143fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C296E29x14__8G29x14y6[] = {
  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__3C296E29x14__8G29x14y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv)();
extern void ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn20_N6E29x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x14__8G29x14y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E29x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv),
};
static  VTT_ENTRY vtt_G29x14y6[] = {
  {&(_ZTV8G29x14y6[5]),  5,10},
  {&(_tg__ZTV6E29x14__8G29x14y6[4]),  4,5},
  {&(_tg__ZTV3C296E29x14__8G29x14y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C296E29x14__8G29x14y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E29x14__8G29x14y6[3]),  3,4},
  {&(_ZTV8G29x14y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G29x14y6[];
extern  VTBL_ENTRY _ZTV8G29x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x14y6[];
static VTBL_ENTRY alt_thunk_names492[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn20_N6E29x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn20_N6E29x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x14y6 = {  "G29x14y6", // class name
  bases_G29x14y6, 6,
  &(vtc_G29x14y6[0]), // expected_vtbl_contents
  &(vtt_G29x14y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G29x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x14y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x14y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names492,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x14y7  : virtual E29x14 , virtual F0 {
  int ff;
  ~G29x14y7(); // tgen
  G29x14y7(); // tgen
};
//SIG(1 G29x14y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G29x14y7 ::~G29x14y7(){ note_dtor("G29x14y7", this);} // tgen
G29x14y7 ::G29x14y7(){ note_ctor("G29x14y7", this);} // tgen

static void Test_G29x14y7()
{
  extern Class_Descriptor cd_G29x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G29x14y7, buf);
    G29x14y7 *dp, &lv = *(dp=new (buf) G29x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G29x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x14y7)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x14*), ABISELECT(16,8), "G29x14y7");
    check_base_class_offset(lv, (B1*)(C29*)(E29x14*), ABISELECT(40,24), "G29x14y7");
    check_base_class_offset(lv, (C29*)(E29x14*), ABISELECT(16,8), "G29x14y7");
    check_base_class_offset(lv, (D0*)(E29x14*), ABISELECT(52,32), "G29x14y7");
    check_base_class_offset(lv, (E29x14*), ABISELECT(16,8), "G29x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G29x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G29x14y7.ff");
    test_class_info(&lv, &cd_G29x14y7);
    dp->~G29x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x14y7(Test_G29x14y7, "G29x14y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G29x14y7C1Ev();
extern void _ZN8G29x14y7D1Ev();
Name_Map name_map_G29x14y7[] = {
  NSPAIR(_ZN8G29x14y7C1Ev),
  NSPAIR(_ZN8G29x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x14;
extern VTBL_ENTRY _ZTI6E29x14[];
extern  VTBL_ENTRY _ZTV6E29x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x14y7[] = {
  // 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_E29x14,    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 _ZTI8G29x14y7[];
extern void _ZN6E29x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv)();
extern void ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn16_N6E29x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x14y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x14y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G29x14y7[0]),
  (VTBL_ENTRY)&_ZN6E29x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G29x14y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv),
};
extern VTBL_ENTRY _ZTV8G29x14y7[];
extern void _ZN6E29x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x14__8G29x14y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x14[0]),
  (VTBL_ENTRY)&_ZN6E29x143fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C296E29x14__8G29x14y7[] = {
  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__3C296E29x14__8G29x14y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv)();
extern void ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn16_N6E29x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x14__8G29x14y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E29x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv),
};
static  VTT_ENTRY vtt_G29x14y7[] = {
  {&(_ZTV8G29x14y7[6]),  6,16},
  {&(_ZTV8G29x14y7[11]),  11,16},
  {&(_ZTV8G29x14y7[15]),  15,16},
  {&(_tg__ZTV6E29x14__8G29x14y7[4]),  4,5},
  {&(_tg__ZTV3C296E29x14__8G29x14y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C296E29x14__8G29x14y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E29x14__8G29x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x14y7[];
extern  VTBL_ENTRY _ZTV8G29x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x14y7[];
static VTBL_ENTRY alt_thunk_names493[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x143fooEv,_ZTv0_n12_N6E29x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn16_N6E29x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x143fooEv,_ZThn16_N6E29x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x14y7 = {  "G29x14y7", // class name
  bases_G29x14y7, 6,
  &(vtc_G29x14y7[0]), // expected_vtbl_contents
  &(vtt_G29x14y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G29x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x14y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x14y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names493,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E30x14  : C30 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E30x143fooEv
  ~E30x14(); // tgen
  E30x14(); // tgen
};
//SIG(-1 E30x14) C1{ BC2{ VBC3{ Fi} VBC4{ v1 Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E30x14 ::foo(){vfunc_called(this, "_ZN6E30x143fooEv");}
E30x14 ::~E30x14(){ note_dtor("E30x14", this);} // tgen
E30x14 ::E30x14(){ note_ctor("E30x14", this);} // tgen

static void Test_E30x14()
{
  extern Class_Descriptor cd_E30x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E30x14, buf);
    E30x14 *dp, &lv = *(dp=new (buf) E30x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E30x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E30x14)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(16,12), "E30x14");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(24,16), "E30x14");
    check_base_class_offset(lv, (C30*), 0, "E30x14");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E30x14");
    check_field_offset(lv, fd, ABISELECT(12,8), "E30x14.fd");
    test_class_info(&lv, &cd_E30x14);
    dp->~E30x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE30x14(Test_E30x14, "E30x14", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E30x14C1Ev();
extern void _ZN6E30x14D1Ev();
Name_Map name_map_E30x14[] = {
  NSPAIR(_ZN6E30x14C1Ev),
  NSPAIR(_ZN6E30x14D1Ev),
  {0,0}
};
extern Class_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_E30x14[] = {
  // 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 _ZTI6E30x14[];
extern void _ZN6E30x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv)();
extern void ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn16_N6E30x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E30x14[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x14[0]),
  (VTBL_ENTRY)&_ZN6E30x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E30x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv),
};
extern VTBL_ENTRY _ZTV6E30x14[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__6E30x14[] = {
  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__6E30x14[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_E30x14[] = {
  {&(_ZTV6E30x14[5]),  5,10},
  {&(_tg__ZTV3C30__6E30x14[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__6E30x14[3]),  3,4},
  {&(_ZTV6E30x14[9]),  9,10},
};
extern VTBL_ENTRY _ZTI6E30x14[];
extern  VTBL_ENTRY _ZTV6E30x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x14[];
static VTBL_ENTRY alt_thunk_names494[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn16_N6E30x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E30x14 = {  "E30x14", // class name
  bases_E30x14, 4,
  &(vtc_E30x14[0]), // expected_vtbl_contents
  &(vtt_E30x14[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E30x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E30x14),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E30x14),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names494,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x14y0  : E30x14 , F1 {
  int ff;
  ~G30x14y0(); // tgen
  G30x14y0(); // tgen
};
//SIG(1 G30x14y0) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G30x14y0 ::~G30x14y0(){ note_dtor("G30x14y0", this);} // tgen
G30x14y0 ::G30x14y0(){ note_ctor("G30x14y0", this);} // tgen

static void Test_G30x14y0()
{
  extern Class_Descriptor cd_G30x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x14y0, buf);
    G30x14y0 *dp, &lv = *(dp=new (buf) G30x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x14y0)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x14*), ABISELECT(32,24), "G30x14y0");
    check_base_class_offset(lv, (B1*)(C30*)(E30x14*), ABISELECT(40,28), "G30x14y0");
    check_base_class_offset(lv, (C30*)(E30x14*), 0, "G30x14y0");
    check_base_class_offset(lv, (D0*)(E30x14*), ABISELECT(52,36), "G30x14y0");
    check_base_class_offset(lv, (E30x14*), 0, "G30x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G30x14y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G30x14y0.ff");
    test_class_info(&lv, &cd_G30x14y0);
    dp->~G30x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x14y0(Test_G30x14y0, "G30x14y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G30x14y0C1Ev();
extern void _ZN8G30x14y0D1Ev();
Name_Map name_map_G30x14y0[] = {
  NSPAIR(_ZN8G30x14y0C1Ev),
  NSPAIR(_ZN8G30x14y0D1Ev),
  {0,0}
};
extern Class_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_E30x14;
extern VTBL_ENTRY _ZTI6E30x14[];
extern  VTBL_ENTRY _ZTV6E30x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x14y0[] = {
  // 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_E30x14,    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 _ZTI8G30x14y0[];
extern void _ZN6E30x143fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv)();
extern void ABISELECT(_ZThn40_N6E30x143fooEv,_ZThn28_N6E30x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x14y0[0]),
  (VTBL_ENTRY)&_ZN6E30x143fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G30x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G30x14y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv),
};
extern VTBL_ENTRY _ZTV8G30x14y0[];
extern void _ZN6E30x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x14__8G30x14y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x14[0]),
  (VTBL_ENTRY)&_ZN6E30x143fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C306E30x14__8G30x14y0[] = {
  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__3C306E30x14__8G30x14y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv)();
extern void ABISELECT(_ZThn40_N6E30x143fooEv,_ZThn28_N6E30x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x14__8G30x14y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E30x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv),
};
static  VTT_ENTRY vtt_G30x14y0[] = {
  {&(_ZTV8G30x14y0[5]),  5,13},
  {&(_tg__ZTV6E30x14__8G30x14y0[5]),  5,6},
  {&(_tg__ZTV3C306E30x14__8G30x14y0[4]),  4,5},
  {&(_tg__ZTV2B1__3C306E30x14__8G30x14y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E30x14__8G30x14y0[3]),  3,4},
  {&(_ZTV8G30x14y0[12]),  12,13},
};
extern VTBL_ENTRY _ZTI8G30x14y0[];
extern  VTBL_ENTRY _ZTV8G30x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x14y0[];
static VTBL_ENTRY alt_thunk_names495[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C303fooEv,_ZThn28_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E30x143fooEv,_ZThn28_N6E30x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E30x143fooEv,_ZThn28_N6E30x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x14y0 = {  "G30x14y0", // class name
  bases_G30x14y0, 6,
  &(vtc_G30x14y0[0]), // expected_vtbl_contents
  &(vtt_G30x14y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G30x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x14y0),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x14y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names495,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x14y1  : virtual E30x14 , F1 {
  int ff;
  ~G30x14y1(); // tgen
  G30x14y1(); // tgen
};
//SIG(1 G30x14y1) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G30x14y1 ::~G30x14y1(){ note_dtor("G30x14y1", this);} // tgen
G30x14y1 ::G30x14y1(){ note_ctor("G30x14y1", this);} // tgen

static void Test_G30x14y1()
{
  extern Class_Descriptor cd_G30x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x14y1, buf);
    G30x14y1 *dp, &lv = *(dp=new (buf) G30x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x14y1)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x14*), ABISELECT(32,24), "G30x14y1");
    check_base_class_offset(lv, (B1*)(C30*)(E30x14*), ABISELECT(40,28), "G30x14y1");
    check_base_class_offset(lv, (C30*)(E30x14*), ABISELECT(16,12), "G30x14y1");
    check_base_class_offset(lv, (D0*)(E30x14*), ABISELECT(52,36), "G30x14y1");
    check_base_class_offset(lv, (E30x14*), ABISELECT(16,12), "G30x14y1");
    check_base_class_offset(lv, (F1*), 0, "G30x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x14y1.ff");
    test_class_info(&lv, &cd_G30x14y1);
    dp->~G30x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x14y1(Test_G30x14y1, "G30x14y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G30x14y1C1Ev();
extern void _ZN8G30x14y1D1Ev();
Name_Map name_map_G30x14y1[] = {
  NSPAIR(_ZN8G30x14y1C1Ev),
  NSPAIR(_ZN8G30x14y1D1Ev),
  {0,0}
};
extern Class_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_E30x14;
extern VTBL_ENTRY _ZTI6E30x14[];
extern  VTBL_ENTRY _ZTV6E30x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x14y1[] = {
  // 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_E30x14,    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 _ZTI8G30x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E30x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv)();
extern void ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn16_N6E30x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x14y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G30x14y1[0]),
  (VTBL_ENTRY)&_ZN6E30x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G30x14y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv),
};
extern VTBL_ENTRY _ZTV8G30x14y1[];
extern void _ZN6E30x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x14__8G30x14y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x14[0]),
  (VTBL_ENTRY)&_ZN6E30x143fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C306E30x14__8G30x14y1[] = {
  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__3C306E30x14__8G30x14y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv)();
extern void ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn16_N6E30x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x14__8G30x14y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E30x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv),
};
static  VTT_ENTRY vtt_G30x14y1[] = {
  {&(_ZTV8G30x14y1[6]),  6,18},
  {&(_ZTV8G30x14y1[13]),  13,18},
  {&(_ZTV8G30x14y1[17]),  17,18},
  {&(_tg__ZTV6E30x14__8G30x14y1[5]),  5,6},
  {&(_tg__ZTV3C306E30x14__8G30x14y1[4]),  4,5},
  {&(_tg__ZTV2B1__3C306E30x14__8G30x14y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E30x14__8G30x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x14y1[];
extern  VTBL_ENTRY _ZTV8G30x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x14y1[];
static VTBL_ENTRY alt_thunk_names496[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn16_N6E30x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn16_N6E30x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x14y1 = {  "G30x14y1", // class name
  bases_G30x14y1, 6,
  &(vtc_G30x14y1[0]), // expected_vtbl_contents
  &(vtt_G30x14y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G30x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x14y1),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x14y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names496,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x14y2  : E30x14 , virtual F1 {
  int ff;
  ~G30x14y2(); // tgen
  G30x14y2(); // tgen
};
//SIG(1 G30x14y2) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G30x14y2 ::~G30x14y2(){ note_dtor("G30x14y2", this);} // tgen
G30x14y2 ::G30x14y2(){ note_ctor("G30x14y2", this);} // tgen

static void Test_G30x14y2()
{
  extern Class_Descriptor cd_G30x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x14y2, buf);
    G30x14y2 *dp, &lv = *(dp=new (buf) G30x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x14y2)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x14*), ABISELECT(20,16), "G30x14y2");
    check_base_class_offset(lv, (B1*)(C30*)(E30x14*), ABISELECT(24,20), "G30x14y2");
    check_base_class_offset(lv, (C30*)(E30x14*), 0, "G30x14y2");
    check_base_class_offset(lv, (D0*)(E30x14*), ABISELECT(36,28), "G30x14y2");
    check_base_class_offset(lv, (E30x14*), 0, "G30x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G30x14y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G30x14y2.ff");
    test_class_info(&lv, &cd_G30x14y2);
    dp->~G30x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x14y2(Test_G30x14y2, "G30x14y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G30x14y2C1Ev();
extern void _ZN8G30x14y2D1Ev();
Name_Map name_map_G30x14y2[] = {
  NSPAIR(_ZN8G30x14y2C1Ev),
  NSPAIR(_ZN8G30x14y2D1Ev),
  {0,0}
};
extern Class_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_E30x14;
extern VTBL_ENTRY _ZTI6E30x14[];
extern  VTBL_ENTRY _ZTV6E30x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x14y2[] = {
  // 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_E30x14,    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 _ZTI8G30x14y2[];
extern void _ZN6E30x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv)();
extern void ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn20_N6E30x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G30x14y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x14y2[0]),
  (VTBL_ENTRY)&_ZN6E30x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G30x14y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G30x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G30x14y2[];
extern void _ZN6E30x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x14__8G30x14y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x14[0]),
  (VTBL_ENTRY)&_ZN6E30x143fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C306E30x14__8G30x14y2[] = {
  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__3C306E30x14__8G30x14y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv)();
extern void ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn20_N6E30x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x14__8G30x14y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E30x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv),
};
static  VTT_ENTRY vtt_G30x14y2[] = {
  {&(_ZTV8G30x14y2[6]),  6,15},
  {&(_tg__ZTV6E30x14__8G30x14y2[5]),  5,6},
  {&(_tg__ZTV3C306E30x14__8G30x14y2[4]),  4,5},
  {&(_tg__ZTV2B1__3C306E30x14__8G30x14y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E30x14__8G30x14y2[3]),  3,4},
  {&(_ZTV8G30x14y2[10]),  10,15},
  {&(_ZTV8G30x14y2[14]),  14,15},
};
extern VTBL_ENTRY _ZTI8G30x14y2[];
extern  VTBL_ENTRY _ZTV8G30x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x14y2[];
static VTBL_ENTRY alt_thunk_names497[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn20_N6E30x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn20_N6E30x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x14y2 = {  "G30x14y2", // class name
  bases_G30x14y2, 6,
  &(vtc_G30x14y2[0]), // expected_vtbl_contents
  &(vtt_G30x14y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G30x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x14y2),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x14y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names497,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x14y3  : virtual E30x14 , virtual F1 {
  int ff;
  ~G30x14y3(); // tgen
  G30x14y3(); // tgen
};
//SIG(1 G30x14y3) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G30x14y3 ::~G30x14y3(){ note_dtor("G30x14y3", this);} // tgen
G30x14y3 ::G30x14y3(){ note_ctor("G30x14y3", this);} // tgen

static void Test_G30x14y3()
{
  extern Class_Descriptor cd_G30x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G30x14y3, buf);
    G30x14y3 *dp, &lv = *(dp=new (buf) G30x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G30x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x14y3)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x14*), ABISELECT(32,20), "G30x14y3");
    check_base_class_offset(lv, (B1*)(C30*)(E30x14*), ABISELECT(40,24), "G30x14y3");
    check_base_class_offset(lv, (C30*)(E30x14*), ABISELECT(16,8), "G30x14y3");
    check_base_class_offset(lv, (D0*)(E30x14*), ABISELECT(52,32), "G30x14y3");
    check_base_class_offset(lv, (E30x14*), ABISELECT(16,8), "G30x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G30x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G30x14y3.ff");
    test_class_info(&lv, &cd_G30x14y3);
    dp->~G30x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x14y3(Test_G30x14y3, "G30x14y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G30x14y3C1Ev();
extern void _ZN8G30x14y3D1Ev();
Name_Map name_map_G30x14y3[] = {
  NSPAIR(_ZN8G30x14y3C1Ev),
  NSPAIR(_ZN8G30x14y3D1Ev),
  {0,0}
};
extern Class_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_E30x14;
extern VTBL_ENTRY _ZTI6E30x14[];
extern  VTBL_ENTRY _ZTV6E30x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x14y3[] = {
  // 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_E30x14,    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 _ZTI8G30x14y3[];
extern void _ZN6E30x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv)();
extern void ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn16_N6E30x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G30x14y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x14y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G30x14y3[0]),
  (VTBL_ENTRY)&_ZN6E30x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G30x14y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G30x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G30x14y3[];
extern void _ZN6E30x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x14__8G30x14y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x14[0]),
  (VTBL_ENTRY)&_ZN6E30x143fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C306E30x14__8G30x14y3[] = {
  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__3C306E30x14__8G30x14y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv)();
extern void ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn16_N6E30x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x14__8G30x14y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E30x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv),
};
static  VTT_ENTRY vtt_G30x14y3[] = {
  {&(_ZTV8G30x14y3[7]),  7,22},
  {&(_ZTV8G30x14y3[13]),  13,22},
  {&(_ZTV8G30x14y3[17]),  17,22},
  {&(_ZTV8G30x14y3[21]),  21,22},
  {&(_tg__ZTV6E30x14__8G30x14y3[5]),  5,6},
  {&(_tg__ZTV3C306E30x14__8G30x14y3[4]),  4,5},
  {&(_tg__ZTV2B1__3C306E30x14__8G30x14y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E30x14__8G30x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x14y3[];
extern  VTBL_ENTRY _ZTV8G30x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x14y3[];
static VTBL_ENTRY alt_thunk_names498[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn16_N6E30x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn16_N6E30x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x14y3 = {  "G30x14y3", // class name
  bases_G30x14y3, 6,
  &(vtc_G30x14y3[0]), // expected_vtbl_contents
  &(vtt_G30x14y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G30x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x14y3),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x14y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names498,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x14y4  : E30x14 , F0 {
  int ff;
  ~G30x14y4(); // tgen
  G30x14y4(); // tgen
};
//SIG(1 G30x14y4) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G30x14y4 ::~G30x14y4(){ note_dtor("G30x14y4", this);} // tgen
G30x14y4 ::G30x14y4(){ note_ctor("G30x14y4", this);} // tgen

static void Test_G30x14y4()
{
  extern Class_Descriptor cd_G30x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G30x14y4, buf);
    G30x14y4 *dp, &lv = *(dp=new (buf) G30x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G30x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x14y4)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x14*), ABISELECT(24,20), "G30x14y4");
    check_base_class_offset(lv, (B1*)(C30*)(E30x14*), ABISELECT(32,24), "G30x14y4");
    check_base_class_offset(lv, (C30*)(E30x14*), 0, "G30x14y4");
    check_base_class_offset(lv, (D0*)(E30x14*), ABISELECT(44,32), "G30x14y4");
    check_base_class_offset(lv, (E30x14*), 0, "G30x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G30x14y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G30x14y4.ff");
    test_class_info(&lv, &cd_G30x14y4);
    dp->~G30x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x14y4(Test_G30x14y4, "G30x14y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G30x14y4C1Ev();
extern void _ZN8G30x14y4D1Ev();
Name_Map name_map_G30x14y4[] = {
  NSPAIR(_ZN8G30x14y4C1Ev),
  NSPAIR(_ZN8G30x14y4D1Ev),
  {0,0}
};
extern Class_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_E30x14;
extern VTBL_ENTRY _ZTI6E30x14[];
extern  VTBL_ENTRY _ZTV6E30x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x14y4[] = {
  // 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_E30x14,    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 _ZTI8G30x14y4[];
extern void _ZN6E30x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv)();
extern void ABISELECT(_ZThn32_N6E30x143fooEv,_ZThn24_N6E30x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x14y4[0]),
  (VTBL_ENTRY)&_ZN6E30x143fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G30x14y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv),
};
extern VTBL_ENTRY _ZTV8G30x14y4[];
extern void _ZN6E30x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x14__8G30x14y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x14[0]),
  (VTBL_ENTRY)&_ZN6E30x143fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C306E30x14__8G30x14y4[] = {
  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__3C306E30x14__8G30x14y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv)();
extern void ABISELECT(_ZThn32_N6E30x143fooEv,_ZThn24_N6E30x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x14__8G30x14y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E30x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv),
};
static  VTT_ENTRY vtt_G30x14y4[] = {
  {&(_ZTV8G30x14y4[5]),  5,10},
  {&(_tg__ZTV6E30x14__8G30x14y4[5]),  5,6},
  {&(_tg__ZTV3C306E30x14__8G30x14y4[4]),  4,5},
  {&(_tg__ZTV2B1__3C306E30x14__8G30x14y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E30x14__8G30x14y4[3]),  3,4},
  {&(_ZTV8G30x14y4[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G30x14y4[];
extern  VTBL_ENTRY _ZTV8G30x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x14y4[];
static VTBL_ENTRY alt_thunk_names499[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x143fooEv,_ZThn24_N6E30x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x143fooEv,_ZThn24_N6E30x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x14y4 = {  "G30x14y4", // class name
  bases_G30x14y4, 6,
  &(vtc_G30x14y4[0]), // expected_vtbl_contents
  &(vtt_G30x14y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G30x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x14y4),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x14y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names499,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x14y5  : virtual E30x14 , F0 {
  int ff;
  ~G30x14y5(); // tgen
  G30x14y5(); // tgen
};
//SIG(1 G30x14y5) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G30x14y5 ::~G30x14y5(){ note_dtor("G30x14y5", this);} // tgen
G30x14y5 ::G30x14y5(){ note_ctor("G30x14y5", this);} // tgen

static void Test_G30x14y5()
{
  extern Class_Descriptor cd_G30x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x14y5, buf);
    G30x14y5 *dp, &lv = *(dp=new (buf) G30x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x14y5)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x14*), ABISELECT(32,24), "G30x14y5");
    check_base_class_offset(lv, (B1*)(C30*)(E30x14*), ABISELECT(40,28), "G30x14y5");
    check_base_class_offset(lv, (C30*)(E30x14*), ABISELECT(16,12), "G30x14y5");
    check_base_class_offset(lv, (D0*)(E30x14*), ABISELECT(52,36), "G30x14y5");
    check_base_class_offset(lv, (E30x14*), ABISELECT(16,12), "G30x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G30x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x14y5.ff");
    test_class_info(&lv, &cd_G30x14y5);
    dp->~G30x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x14y5(Test_G30x14y5, "G30x14y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G30x14y5C1Ev();
extern void _ZN8G30x14y5D1Ev();
Name_Map name_map_G30x14y5[] = {
  NSPAIR(_ZN8G30x14y5C1Ev),
  NSPAIR(_ZN8G30x14y5D1Ev),
  {0,0}
};
extern Class_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_E30x14;
extern VTBL_ENTRY _ZTI6E30x14[];
extern  VTBL_ENTRY _ZTV6E30x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x14y5[] = {
  // 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_E30x14,    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 _ZTI8G30x14y5[];
extern void _ZN6E30x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv)();
extern void ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn16_N6E30x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x14y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x14y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G30x14y5[0]),
  (VTBL_ENTRY)&_ZN6E30x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G30x14y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv),
};
extern VTBL_ENTRY _ZTV8G30x14y5[];
extern void _ZN6E30x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x14__8G30x14y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x14[0]),
  (VTBL_ENTRY)&_ZN6E30x143fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C306E30x14__8G30x14y5[] = {
  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__3C306E30x14__8G30x14y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv)();
extern void ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn16_N6E30x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x14__8G30x14y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E30x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv),
};
static  VTT_ENTRY vtt_G30x14y5[] = {
  {&(_ZTV8G30x14y5[6]),  6,17},
  {&(_ZTV8G30x14y5[12]),  12,17},
  {&(_ZTV8G30x14y5[16]),  16,17},
  {&(_tg__ZTV6E30x14__8G30x14y5[5]),  5,6},
  {&(_tg__ZTV3C306E30x14__8G30x14y5[4]),  4,5},
  {&(_tg__ZTV2B1__3C306E30x14__8G30x14y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E30x14__8G30x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x14y5[];
extern  VTBL_ENTRY _ZTV8G30x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x14y5[];
static VTBL_ENTRY alt_thunk_names500[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn16_N6E30x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn16_N6E30x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x14y5 = {  "G30x14y5", // class name
  bases_G30x14y5, 6,
  &(vtc_G30x14y5[0]), // expected_vtbl_contents
  &(vtt_G30x14y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G30x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x14y5),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x14y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names500,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x14y6  : E30x14 , virtual F0 {
  int ff;
  ~G30x14y6(); // tgen
  G30x14y6(); // tgen
};
//SIG(1 G30x14y6) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G30x14y6 ::~G30x14y6(){ note_dtor("G30x14y6", this);} // tgen
G30x14y6 ::G30x14y6(){ note_ctor("G30x14y6", this);} // tgen

static void Test_G30x14y6()
{
  extern Class_Descriptor cd_G30x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G30x14y6, buf);
    G30x14y6 *dp, &lv = *(dp=new (buf) G30x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G30x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x14y6)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x14*), ABISELECT(20,16), "G30x14y6");
    check_base_class_offset(lv, (B1*)(C30*)(E30x14*), ABISELECT(24,20), "G30x14y6");
    check_base_class_offset(lv, (C30*)(E30x14*), 0, "G30x14y6");
    check_base_class_offset(lv, (D0*)(E30x14*), ABISELECT(36,28), "G30x14y6");
    check_base_class_offset(lv, (E30x14*), 0, "G30x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G30x14y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G30x14y6.ff");
    test_class_info(&lv, &cd_G30x14y6);
    dp->~G30x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x14y6(Test_G30x14y6, "G30x14y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G30x14y6C1Ev();
extern void _ZN8G30x14y6D1Ev();
Name_Map name_map_G30x14y6[] = {
  NSPAIR(_ZN8G30x14y6C1Ev),
  NSPAIR(_ZN8G30x14y6D1Ev),
  {0,0}
};
extern Class_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_E30x14;
extern VTBL_ENTRY _ZTI6E30x14[];
extern  VTBL_ENTRY _ZTV6E30x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x14y6[] = {
  // 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_E30x14,    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 _ZTI8G30x14y6[];
extern void _ZN6E30x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv)();
extern void ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn20_N6E30x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x14y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x14y6[0]),
  (VTBL_ENTRY)&_ZN6E30x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G30x14y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv),
};
extern VTBL_ENTRY _ZTV8G30x14y6[];
extern void _ZN6E30x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x14__8G30x14y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x14[0]),
  (VTBL_ENTRY)&_ZN6E30x143fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C306E30x14__8G30x14y6[] = {
  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__3C306E30x14__8G30x14y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv)();
extern void ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn20_N6E30x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x14__8G30x14y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E30x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv),
};
static  VTT_ENTRY vtt_G30x14y6[] = {
  {&(_ZTV8G30x14y6[6]),  6,11},
  {&(_tg__ZTV6E30x14__8G30x14y6[5]),  5,6},
  {&(_tg__ZTV3C306E30x14__8G30x14y6[4]),  4,5},
  {&(_tg__ZTV2B1__3C306E30x14__8G30x14y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E30x14__8G30x14y6[3]),  3,4},
  {&(_ZTV8G30x14y6[10]),  10,11},
};
extern VTBL_ENTRY _ZTI8G30x14y6[];
extern  VTBL_ENTRY _ZTV8G30x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x14y6[];
static VTBL_ENTRY alt_thunk_names501[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn20_N6E30x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn20_N6E30x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x14y6 = {  "G30x14y6", // class name
  bases_G30x14y6, 6,
  &(vtc_G30x14y6[0]), // expected_vtbl_contents
  &(vtt_G30x14y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G30x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x14y6),11, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x14y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names501,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x14y7  : virtual E30x14 , virtual F0 {
  int ff;
  ~G30x14y7(); // tgen
  G30x14y7(); // tgen
};
//SIG(1 G30x14y7) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G30x14y7 ::~G30x14y7(){ note_dtor("G30x14y7", this);} // tgen
G30x14y7 ::G30x14y7(){ note_ctor("G30x14y7", this);} // tgen

static void Test_G30x14y7()
{
  extern Class_Descriptor cd_G30x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G30x14y7, buf);
    G30x14y7 *dp, &lv = *(dp=new (buf) G30x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G30x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x14y7)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x14*), ABISELECT(32,20), "G30x14y7");
    check_base_class_offset(lv, (B1*)(C30*)(E30x14*), ABISELECT(40,24), "G30x14y7");
    check_base_class_offset(lv, (C30*)(E30x14*), ABISELECT(16,8), "G30x14y7");
    check_base_class_offset(lv, (D0*)(E30x14*), ABISELECT(52,32), "G30x14y7");
    check_base_class_offset(lv, (E30x14*), ABISELECT(16,8), "G30x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G30x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G30x14y7.ff");
    test_class_info(&lv, &cd_G30x14y7);
    dp->~G30x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x14y7(Test_G30x14y7, "G30x14y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G30x14y7C1Ev();
extern void _ZN8G30x14y7D1Ev();
Name_Map name_map_G30x14y7[] = {
  NSPAIR(_ZN8G30x14y7C1Ev),
  NSPAIR(_ZN8G30x14y7D1Ev),
  {0,0}
};
extern Class_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_E30x14;
extern VTBL_ENTRY _ZTI6E30x14[];
extern  VTBL_ENTRY _ZTV6E30x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x14y7[] = {
  // 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_E30x14,    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 _ZTI8G30x14y7[];
extern void _ZN6E30x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv)();
extern void ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn16_N6E30x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x14y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x14y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G30x14y7[0]),
  (VTBL_ENTRY)&_ZN6E30x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G30x14y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv),
};
extern VTBL_ENTRY _ZTV8G30x14y7[];
extern void _ZN6E30x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x14__8G30x14y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x14[0]),
  (VTBL_ENTRY)&_ZN6E30x143fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C306E30x14__8G30x14y7[] = {
  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__3C306E30x14__8G30x14y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv)();
extern void ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn16_N6E30x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x14__8G30x14y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E30x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv),
};
static  VTT_ENTRY vtt_G30x14y7[] = {
  {&(_ZTV8G30x14y7[7]),  7,18},
  {&(_ZTV8G30x14y7[13]),  13,18},
  {&(_ZTV8G30x14y7[17]),  17,18},
  {&(_tg__ZTV6E30x14__8G30x14y7[5]),  5,6},
  {&(_tg__ZTV3C306E30x14__8G30x14y7[4]),  4,5},
  {&(_tg__ZTV2B1__3C306E30x14__8G30x14y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E30x14__8G30x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x14y7[];
extern  VTBL_ENTRY _ZTV8G30x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x14y7[];
static VTBL_ENTRY alt_thunk_names502[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x143fooEv,_ZTv0_n12_N6E30x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn16_N6E30x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x143fooEv,_ZThn16_N6E30x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x14y7 = {  "G30x14y7", // class name
  bases_G30x14y7, 6,
  &(vtc_G30x14y7[0]), // expected_vtbl_contents
  &(vtt_G30x14y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G30x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x14y7),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x14y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names502,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E31x14  : C31 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E31x143fooEv
  ~E31x14(); // tgen
  E31x14(); // tgen
};
//SIG(-1 E31x14) C1{ BC2{ VBC3{ v1 Fi} VBC4{ v1 Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E31x14 ::foo(){vfunc_called(this, "_ZN6E31x143fooEv");}
E31x14 ::~E31x14(){ note_dtor("E31x14", this);} // tgen
E31x14 ::E31x14(){ note_ctor("E31x14", this);} // tgen

static void Test_E31x14()
{
  extern Class_Descriptor cd_E31x14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E31x14, buf);
    E31x14 *dp, &lv = *(dp=new (buf) E31x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E31x14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E31x14)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(16,12), "E31x14");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(32,20), "E31x14");
    check_base_class_offset(lv, (C31*), 0, "E31x14");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E31x14");
    check_field_offset(lv, fd, ABISELECT(12,8), "E31x14.fd");
    test_class_info(&lv, &cd_E31x14);
    dp->~E31x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE31x14(Test_E31x14, "E31x14", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E31x14C1Ev();
extern void _ZN6E31x14D1Ev();
Name_Map name_map_E31x14[] = {
  NSPAIR(_ZN6E31x14C1Ev),
  NSPAIR(_ZN6E31x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x14[] = {
  // 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 _ZTI6E31x14[];
extern void _ZN6E31x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn16_N6E31x143fooEv,_ZThn12_N6E31x143fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn20_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E31x14[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&_ZN6E31x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
extern VTBL_ENTRY _ZTV6E31x14[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__6E31x14[] = {
  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__6E31x14[] = {
  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__6E31x14[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_E31x14[] = {
  {&(_ZTV6E31x14[5]),  5,14},
  {&(_tg__ZTV3C31__6E31x14[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__6E31x14[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__6E31x14[3]),  3,4},
  {&(_ZTV6E31x14[9]),  9,14},
  {&(_ZTV6E31x14[13]),  13,14},
};
extern VTBL_ENTRY _ZTI6E31x14[];
extern  VTBL_ENTRY _ZTV6E31x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x14[];
static VTBL_ENTRY alt_thunk_names503[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn20_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x143fooEv,_ZThn12_N6E31x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E31x14 = {  "E31x14", // class name
  bases_E31x14, 4,
  &(vtc_E31x14[0]), // expected_vtbl_contents
  &(vtt_E31x14[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E31x14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E31x14),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E31x14),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names503,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x14y0  : E31x14 , F1 {
  int ff;
  ~G31x14y0(); // tgen
  G31x14y0(); // tgen
};
//SIG(1 G31x14y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G31x14y0 ::~G31x14y0(){ note_dtor("G31x14y0", this);} // tgen
G31x14y0 ::G31x14y0(){ note_ctor("G31x14y0", this);} // tgen

static void Test_G31x14y0()
{
  extern Class_Descriptor cd_G31x14y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G31x14y0, buf);
    G31x14y0 *dp, &lv = *(dp=new (buf) G31x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G31x14y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x14y0)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x14*), ABISELECT(32,24), "G31x14y0");
    check_base_class_offset(lv, (B1*)(C31*)(E31x14*), ABISELECT(48,32), "G31x14y0");
    check_base_class_offset(lv, (C31*)(E31x14*), 0, "G31x14y0");
    check_base_class_offset(lv, (D0*)(E31x14*), ABISELECT(60,40), "G31x14y0");
    check_base_class_offset(lv, (E31x14*), 0, "G31x14y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G31x14y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G31x14y0.ff");
    test_class_info(&lv, &cd_G31x14y0);
    dp->~G31x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x14y0(Test_G31x14y0, "G31x14y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G31x14y0C1Ev();
extern void _ZN8G31x14y0D1Ev();
Name_Map name_map_G31x14y0[] = {
  NSPAIR(_ZN8G31x14y0C1Ev),
  NSPAIR(_ZN8G31x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x14;
extern VTBL_ENTRY _ZTI6E31x14[];
extern  VTBL_ENTRY _ZTV6E31x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x14y0[] = {
  // 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_E31x14,    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 _ZTI8G31x14y0[];
extern void _ZN6E31x143fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn24_N6E31x143fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn48_N6E31x143fooEv,_ZThn32_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x14y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x14y0[0]),
  (VTBL_ENTRY)&_ZN6E31x143fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G31x14y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G31x14y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G31x14y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
extern VTBL_ENTRY _ZTV8G31x14y0[];
extern void _ZN6E31x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x14__8G31x14y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&_ZN6E31x143fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C316E31x14__8G31x14y0[] = {
  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__3C316E31x14__8G31x14y0[] = {
  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__3C316E31x14__8G31x14y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn24_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x14__8G31x14y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn48_N6E31x143fooEv,_ZThn32_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x14__8G31x14y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
static  VTT_ENTRY vtt_G31x14y0[] = {
  {&(_ZTV8G31x14y0[5]),  5,17},
  {&(_tg__ZTV6E31x14__8G31x14y0[5]),  5,6},
  {&(_tg__ZTV3C316E31x14__8G31x14y0[4]),  4,5},
  {&(_tg__ZTV2A1__3C316E31x14__8G31x14y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C316E31x14__8G31x14y0[3]),  3,4},
  {&(_tg__ZTV2A1__6E31x14__8G31x14y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x14__8G31x14y0[3]),  3,4},
  {&(_ZTV8G31x14y0[12]),  12,17},
  {&(_ZTV8G31x14y0[16]),  16,17},
};
extern VTBL_ENTRY _ZTI8G31x14y0[];
extern  VTBL_ENTRY _ZTV8G31x14y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x14y0[];
static VTBL_ENTRY alt_thunk_names504[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N3C313fooEv,_ZThn32_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn24_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x143fooEv,_ZThn32_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn24_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x143fooEv,_ZThn32_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn24_N6E31x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x14y0 = {  "G31x14y0", // class name
  bases_G31x14y0, 6,
  &(vtc_G31x14y0[0]), // expected_vtbl_contents
  &(vtt_G31x14y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G31x14y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x14y0),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x14y0),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names504,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x14y1  : virtual E31x14 , F1 {
  int ff;
  ~G31x14y1(); // tgen
  G31x14y1(); // tgen
};
//SIG(1 G31x14y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G31x14y1 ::~G31x14y1(){ note_dtor("G31x14y1", this);} // tgen
G31x14y1 ::G31x14y1(){ note_ctor("G31x14y1", this);} // tgen

static void Test_G31x14y1()
{
  extern Class_Descriptor cd_G31x14y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G31x14y1, buf);
    G31x14y1 *dp, &lv = *(dp=new (buf) G31x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G31x14y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x14y1)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x14*), ABISELECT(32,24), "G31x14y1");
    check_base_class_offset(lv, (B1*)(C31*)(E31x14*), ABISELECT(48,32), "G31x14y1");
    check_base_class_offset(lv, (C31*)(E31x14*), ABISELECT(16,12), "G31x14y1");
    check_base_class_offset(lv, (D0*)(E31x14*), ABISELECT(60,40), "G31x14y1");
    check_base_class_offset(lv, (E31x14*), ABISELECT(16,12), "G31x14y1");
    check_base_class_offset(lv, (F1*), 0, "G31x14y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x14y1.ff");
    test_class_info(&lv, &cd_G31x14y1);
    dp->~G31x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x14y1(Test_G31x14y1, "G31x14y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G31x14y1C1Ev();
extern void _ZN8G31x14y1D1Ev();
Name_Map name_map_G31x14y1[] = {
  NSPAIR(_ZN8G31x14y1C1Ev),
  NSPAIR(_ZN8G31x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x14;
extern VTBL_ENTRY _ZTI6E31x14[];
extern  VTBL_ENTRY _ZTV6E31x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x14y1[] = {
  // 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_E31x14,    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 _ZTI8G31x14y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E31x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn16_N6E31x143fooEv,_ZThn12_N6E31x143fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn20_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x14y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x14y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G31x14y1[0]),
  (VTBL_ENTRY)&_ZN6E31x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G31x14y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G31x14y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
extern VTBL_ENTRY _ZTV8G31x14y1[];
extern void _ZN6E31x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x14__8G31x14y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&_ZN6E31x143fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C316E31x14__8G31x14y1[] = {
  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__3C316E31x14__8G31x14y1[] = {
  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__3C316E31x14__8G31x14y1[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn16_N6E31x143fooEv,_ZThn12_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x14__8G31x14y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn20_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x14__8G31x14y1[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
static  VTT_ENTRY vtt_G31x14y1[] = {
  {&(_ZTV8G31x14y1[6]),  6,22},
  {&(_ZTV8G31x14y1[13]),  13,22},
  {&(_ZTV8G31x14y1[17]),  17,22},
  {&(_ZTV8G31x14y1[21]),  21,22},
  {&(_tg__ZTV6E31x14__8G31x14y1[5]),  5,6},
  {&(_tg__ZTV3C316E31x14__8G31x14y1[4]),  4,5},
  {&(_tg__ZTV2A1__3C316E31x14__8G31x14y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C316E31x14__8G31x14y1[3]),  3,4},
  {&(_tg__ZTV2A1__6E31x14__8G31x14y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x14__8G31x14y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x14y1[];
extern  VTBL_ENTRY _ZTV8G31x14y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x14y1[];
static VTBL_ENTRY alt_thunk_names505[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn20_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x143fooEv,_ZThn12_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn20_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x143fooEv,_ZThn12_N6E31x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x14y1 = {  "G31x14y1", // class name
  bases_G31x14y1, 6,
  &(vtc_G31x14y1[0]), // expected_vtbl_contents
  &(vtt_G31x14y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G31x14y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x14y1),22, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x14y1),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names505,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x14y2  : E31x14 , virtual F1 {
  int ff;
  ~G31x14y2(); // tgen
  G31x14y2(); // tgen
};
//SIG(1 G31x14y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G31x14y2 ::~G31x14y2(){ note_dtor("G31x14y2", this);} // tgen
G31x14y2 ::G31x14y2(){ note_ctor("G31x14y2", this);} // tgen

static void Test_G31x14y2()
{
  extern Class_Descriptor cd_G31x14y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x14y2, buf);
    G31x14y2 *dp, &lv = *(dp=new (buf) G31x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x14y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x14y2)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x14*), ABISELECT(24,16), "G31x14y2");
    check_base_class_offset(lv, (B1*)(C31*)(E31x14*), ABISELECT(40,24), "G31x14y2");
    check_base_class_offset(lv, (C31*)(E31x14*), 0, "G31x14y2");
    check_base_class_offset(lv, (D0*)(E31x14*), ABISELECT(52,32), "G31x14y2");
    check_base_class_offset(lv, (E31x14*), 0, "G31x14y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G31x14y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G31x14y2.ff");
    test_class_info(&lv, &cd_G31x14y2);
    dp->~G31x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x14y2(Test_G31x14y2, "G31x14y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G31x14y2C1Ev();
extern void _ZN8G31x14y2D1Ev();
Name_Map name_map_G31x14y2[] = {
  NSPAIR(_ZN8G31x14y2C1Ev),
  NSPAIR(_ZN8G31x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x14;
extern VTBL_ENTRY _ZTI6E31x14[];
extern  VTBL_ENTRY _ZTV6E31x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x14y2[] = {
  // 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_E31x14,    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 _ZTI8G31x14y2[];
extern void _ZN6E31x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn24_N6E31x143fooEv,_ZThn16_N6E31x143fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn40_N6E31x143fooEv,_ZThn24_N6E31x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G31x14y2[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x14y2[0]),
  (VTBL_ENTRY)&_ZN6E31x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G31x14y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G31x14y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G31x14y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G31x14y2[];
extern void _ZN6E31x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x14__8G31x14y2[] = {
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&_ZN6E31x143fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C316E31x14__8G31x14y2[] = {
  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__3C316E31x14__8G31x14y2[] = {
  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__3C316E31x14__8G31x14y2[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn24_N6E31x143fooEv,_ZThn16_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x14__8G31x14y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn40_N6E31x143fooEv,_ZThn24_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x14__8G31x14y2[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
static  VTT_ENTRY vtt_G31x14y2[] = {
  {&(_ZTV8G31x14y2[6]),  6,19},
  {&(_tg__ZTV6E31x14__8G31x14y2[5]),  5,6},
  {&(_tg__ZTV3C316E31x14__8G31x14y2[4]),  4,5},
  {&(_tg__ZTV2A1__3C316E31x14__8G31x14y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C316E31x14__8G31x14y2[3]),  3,4},
  {&(_tg__ZTV2A1__6E31x14__8G31x14y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x14__8G31x14y2[3]),  3,4},
  {&(_ZTV8G31x14y2[10]),  10,19},
  {&(_ZTV8G31x14y2[14]),  14,19},
  {&(_ZTV8G31x14y2[18]),  18,19},
};
extern VTBL_ENTRY _ZTI8G31x14y2[];
extern  VTBL_ENTRY _ZTV8G31x14y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x14y2[];
static VTBL_ENTRY alt_thunk_names506[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x143fooEv,_ZThn24_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x143fooEv,_ZThn16_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x143fooEv,_ZThn24_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x143fooEv,_ZThn16_N6E31x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x14y2 = {  "G31x14y2", // class name
  bases_G31x14y2, 6,
  &(vtc_G31x14y2[0]), // expected_vtbl_contents
  &(vtt_G31x14y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G31x14y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x14y2),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x14y2),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names506,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x14y3  : virtual E31x14 , virtual F1 {
  int ff;
  ~G31x14y3(); // tgen
  G31x14y3(); // tgen
};
//SIG(1 G31x14y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G31x14y3 ::~G31x14y3(){ note_dtor("G31x14y3", this);} // tgen
G31x14y3 ::G31x14y3(){ note_ctor("G31x14y3", this);} // tgen

static void Test_G31x14y3()
{
  extern Class_Descriptor cd_G31x14y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G31x14y3, buf);
    G31x14y3 *dp, &lv = *(dp=new (buf) G31x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G31x14y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x14y3)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x14*), ABISELECT(32,20), "G31x14y3");
    check_base_class_offset(lv, (B1*)(C31*)(E31x14*), ABISELECT(48,28), "G31x14y3");
    check_base_class_offset(lv, (C31*)(E31x14*), ABISELECT(16,8), "G31x14y3");
    check_base_class_offset(lv, (D0*)(E31x14*), ABISELECT(60,36), "G31x14y3");
    check_base_class_offset(lv, (E31x14*), ABISELECT(16,8), "G31x14y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G31x14y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G31x14y3.ff");
    test_class_info(&lv, &cd_G31x14y3);
    dp->~G31x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x14y3(Test_G31x14y3, "G31x14y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G31x14y3C1Ev();
extern void _ZN8G31x14y3D1Ev();
Name_Map name_map_G31x14y3[] = {
  NSPAIR(_ZN8G31x14y3C1Ev),
  NSPAIR(_ZN8G31x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x14;
extern VTBL_ENTRY _ZTI6E31x14[];
extern  VTBL_ENTRY _ZTV6E31x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x14[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x14y3[] = {
  // 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_E31x14,    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 _ZTI8G31x14y3[];
extern void _ZN6E31x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn16_N6E31x143fooEv,_ZThn12_N6E31x143fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn20_N6E31x143fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G31x14y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x14y3[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G31x14y3[0]),
  (VTBL_ENTRY)&_ZN6E31x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G31x14y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G31x14y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G31x14y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G31x14y3[];
extern void _ZN6E31x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x14__8G31x14y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&_ZN6E31x143fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C316E31x14__8G31x14y3[] = {
  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__3C316E31x14__8G31x14y3[] = {
  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__3C316E31x14__8G31x14y3[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn16_N6E31x143fooEv,_ZThn12_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x14__8G31x14y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn20_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x14__8G31x14y3[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
static  VTT_ENTRY vtt_G31x14y3[] = {
  {&(_ZTV8G31x14y3[7]),  7,26},
  {&(_ZTV8G31x14y3[13]),  13,26},
  {&(_ZTV8G31x14y3[17]),  17,26},
  {&(_ZTV8G31x14y3[21]),  21,26},
  {&(_ZTV8G31x14y3[25]),  25,26},
  {&(_tg__ZTV6E31x14__8G31x14y3[5]),  5,6},
  {&(_tg__ZTV3C316E31x14__8G31x14y3[4]),  4,5},
  {&(_tg__ZTV2A1__3C316E31x14__8G31x14y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C316E31x14__8G31x14y3[3]),  3,4},
  {&(_tg__ZTV2A1__6E31x14__8G31x14y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x14__8G31x14y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x14y3[];
extern  VTBL_ENTRY _ZTV8G31x14y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x14y3[];
static VTBL_ENTRY alt_thunk_names507[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn20_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x143fooEv,_ZThn12_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn20_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x143fooEv,_ZThn12_N6E31x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x14y3 = {  "G31x14y3", // class name
  bases_G31x14y3, 6,
  &(vtc_G31x14y3[0]), // expected_vtbl_contents
  &(vtt_G31x14y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G31x14y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x14y3),26, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x14y3),11, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names507,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x14y4  : E31x14 , F0 {
  int ff;
  ~G31x14y4(); // tgen
  G31x14y4(); // tgen
};
//SIG(1 G31x14y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G31x14y4 ::~G31x14y4(){ note_dtor("G31x14y4", this);} // tgen
G31x14y4 ::G31x14y4(){ note_ctor("G31x14y4", this);} // tgen

static void Test_G31x14y4()
{
  extern Class_Descriptor cd_G31x14y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G31x14y4, buf);
    G31x14y4 *dp, &lv = *(dp=new (buf) G31x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G31x14y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x14y4)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x14*), ABISELECT(24,20), "G31x14y4");
    check_base_class_offset(lv, (B1*)(C31*)(E31x14*), ABISELECT(40,28), "G31x14y4");
    check_base_class_offset(lv, (C31*)(E31x14*), 0, "G31x14y4");
    check_base_class_offset(lv, (D0*)(E31x14*), ABISELECT(52,36), "G31x14y4");
    check_base_class_offset(lv, (E31x14*), 0, "G31x14y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G31x14y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G31x14y4.ff");
    test_class_info(&lv, &cd_G31x14y4);
    dp->~G31x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x14y4(Test_G31x14y4, "G31x14y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G31x14y4C1Ev();
extern void _ZN8G31x14y4D1Ev();
Name_Map name_map_G31x14y4[] = {
  NSPAIR(_ZN8G31x14y4C1Ev),
  NSPAIR(_ZN8G31x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x14;
extern VTBL_ENTRY _ZTI6E31x14[];
extern  VTBL_ENTRY _ZTV6E31x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x14y4[] = {
  // 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_E31x14,    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 _ZTI8G31x14y4[];
extern void _ZN6E31x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn24_N6E31x143fooEv,_ZThn20_N6E31x143fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn40_N6E31x143fooEv,_ZThn28_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x14y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x14y4[0]),
  (VTBL_ENTRY)&_ZN6E31x143fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI8G31x14y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G31x14y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
extern VTBL_ENTRY _ZTV8G31x14y4[];
extern void _ZN6E31x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x14__8G31x14y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&_ZN6E31x143fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C316E31x14__8G31x14y4[] = {
  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__3C316E31x14__8G31x14y4[] = {
  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__3C316E31x14__8G31x14y4[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn24_N6E31x143fooEv,_ZThn20_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x14__8G31x14y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn40_N6E31x143fooEv,_ZThn28_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x14__8G31x14y4[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
static  VTT_ENTRY vtt_G31x14y4[] = {
  {&(_ZTV8G31x14y4[5]),  5,14},
  {&(_tg__ZTV6E31x14__8G31x14y4[5]),  5,6},
  {&(_tg__ZTV3C316E31x14__8G31x14y4[4]),  4,5},
  {&(_tg__ZTV2A1__3C316E31x14__8G31x14y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C316E31x14__8G31x14y4[3]),  3,4},
  {&(_tg__ZTV2A1__6E31x14__8G31x14y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x14__8G31x14y4[3]),  3,4},
  {&(_ZTV8G31x14y4[9]),  9,14},
  {&(_ZTV8G31x14y4[13]),  13,14},
};
extern VTBL_ENTRY _ZTI8G31x14y4[];
extern  VTBL_ENTRY _ZTV8G31x14y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x14y4[];
static VTBL_ENTRY alt_thunk_names508[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x143fooEv,_ZThn28_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x143fooEv,_ZThn20_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x143fooEv,_ZThn28_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x143fooEv,_ZThn20_N6E31x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x14y4 = {  "G31x14y4", // class name
  bases_G31x14y4, 6,
  &(vtc_G31x14y4[0]), // expected_vtbl_contents
  &(vtt_G31x14y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G31x14y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x14y4),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x14y4),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names508,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x14y5  : virtual E31x14 , F0 {
  int ff;
  ~G31x14y5(); // tgen
  G31x14y5(); // tgen
};
//SIG(1 G31x14y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G31x14y5 ::~G31x14y5(){ note_dtor("G31x14y5", this);} // tgen
G31x14y5 ::G31x14y5(){ note_ctor("G31x14y5", this);} // tgen

static void Test_G31x14y5()
{
  extern Class_Descriptor cd_G31x14y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G31x14y5, buf);
    G31x14y5 *dp, &lv = *(dp=new (buf) G31x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G31x14y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x14y5)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x14*), ABISELECT(32,24), "G31x14y5");
    check_base_class_offset(lv, (B1*)(C31*)(E31x14*), ABISELECT(48,32), "G31x14y5");
    check_base_class_offset(lv, (C31*)(E31x14*), ABISELECT(16,12), "G31x14y5");
    check_base_class_offset(lv, (D0*)(E31x14*), ABISELECT(60,40), "G31x14y5");
    check_base_class_offset(lv, (E31x14*), ABISELECT(16,12), "G31x14y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G31x14y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x14y5.ff");
    test_class_info(&lv, &cd_G31x14y5);
    dp->~G31x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x14y5(Test_G31x14y5, "G31x14y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G31x14y5C1Ev();
extern void _ZN8G31x14y5D1Ev();
Name_Map name_map_G31x14y5[] = {
  NSPAIR(_ZN8G31x14y5C1Ev),
  NSPAIR(_ZN8G31x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x14;
extern VTBL_ENTRY _ZTI6E31x14[];
extern  VTBL_ENTRY _ZTV6E31x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x14y5[] = {
  // 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_E31x14,    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 _ZTI8G31x14y5[];
extern void _ZN6E31x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn16_N6E31x143fooEv,_ZThn12_N6E31x143fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn20_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x14y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x14y5[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G31x14y5[0]),
  (VTBL_ENTRY)&_ZN6E31x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G31x14y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G31x14y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
extern VTBL_ENTRY _ZTV8G31x14y5[];
extern void _ZN6E31x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x14__8G31x14y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&_ZN6E31x143fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C316E31x14__8G31x14y5[] = {
  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__3C316E31x14__8G31x14y5[] = {
  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__3C316E31x14__8G31x14y5[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn16_N6E31x143fooEv,_ZThn12_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x14__8G31x14y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn20_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x14__8G31x14y5[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
static  VTT_ENTRY vtt_G31x14y5[] = {
  {&(_ZTV8G31x14y5[6]),  6,21},
  {&(_ZTV8G31x14y5[12]),  12,21},
  {&(_ZTV8G31x14y5[16]),  16,21},
  {&(_ZTV8G31x14y5[20]),  20,21},
  {&(_tg__ZTV6E31x14__8G31x14y5[5]),  5,6},
  {&(_tg__ZTV3C316E31x14__8G31x14y5[4]),  4,5},
  {&(_tg__ZTV2A1__3C316E31x14__8G31x14y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C316E31x14__8G31x14y5[3]),  3,4},
  {&(_tg__ZTV2A1__6E31x14__8G31x14y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x14__8G31x14y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x14y5[];
extern  VTBL_ENTRY _ZTV8G31x14y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x14y5[];
static VTBL_ENTRY alt_thunk_names509[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn20_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x143fooEv,_ZThn12_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn20_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x143fooEv,_ZThn12_N6E31x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x14y5 = {  "G31x14y5", // class name
  bases_G31x14y5, 6,
  &(vtc_G31x14y5[0]), // expected_vtbl_contents
  &(vtt_G31x14y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G31x14y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x14y5),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x14y5),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names509,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x14y6  : E31x14 , virtual F0 {
  int ff;
  ~G31x14y6(); // tgen
  G31x14y6(); // tgen
};
//SIG(1 G31x14y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G31x14y6 ::~G31x14y6(){ note_dtor("G31x14y6", this);} // tgen
G31x14y6 ::G31x14y6(){ note_ctor("G31x14y6", this);} // tgen

static void Test_G31x14y6()
{
  extern Class_Descriptor cd_G31x14y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G31x14y6, buf);
    G31x14y6 *dp, &lv = *(dp=new (buf) G31x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G31x14y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x14y6)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x14*), ABISELECT(24,16), "G31x14y6");
    check_base_class_offset(lv, (B1*)(C31*)(E31x14*), ABISELECT(40,24), "G31x14y6");
    check_base_class_offset(lv, (C31*)(E31x14*), 0, "G31x14y6");
    check_base_class_offset(lv, (D0*)(E31x14*), ABISELECT(52,32), "G31x14y6");
    check_base_class_offset(lv, (E31x14*), 0, "G31x14y6");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G31x14y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G31x14y6.ff");
    test_class_info(&lv, &cd_G31x14y6);
    dp->~G31x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x14y6(Test_G31x14y6, "G31x14y6", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G31x14y6C1Ev();
extern void _ZN8G31x14y6D1Ev();
Name_Map name_map_G31x14y6[] = {
  NSPAIR(_ZN8G31x14y6C1Ev),
  NSPAIR(_ZN8G31x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x14;
extern VTBL_ENTRY _ZTI6E31x14[];
extern  VTBL_ENTRY _ZTV6E31x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x14y6[] = {
  // 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_E31x14,    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 _ZTI8G31x14y6[];
extern void _ZN6E31x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn24_N6E31x143fooEv,_ZThn16_N6E31x143fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn40_N6E31x143fooEv,_ZThn24_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x14y6[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x14y6[0]),
  (VTBL_ENTRY)&_ZN6E31x143fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G31x14y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G31x14y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
extern VTBL_ENTRY _ZTV8G31x14y6[];
extern void _ZN6E31x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x14__8G31x14y6[] = {
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&_ZN6E31x143fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C316E31x14__8G31x14y6[] = {
  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__3C316E31x14__8G31x14y6[] = {
  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__3C316E31x14__8G31x14y6[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn24_N6E31x143fooEv,_ZThn16_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x14__8G31x14y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn40_N6E31x143fooEv,_ZThn24_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x14__8G31x14y6[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
static  VTT_ENTRY vtt_G31x14y6[] = {
  {&(_ZTV8G31x14y6[6]),  6,15},
  {&(_tg__ZTV6E31x14__8G31x14y6[5]),  5,6},
  {&(_tg__ZTV3C316E31x14__8G31x14y6[4]),  4,5},
  {&(_tg__ZTV2A1__3C316E31x14__8G31x14y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C316E31x14__8G31x14y6[3]),  3,4},
  {&(_tg__ZTV2A1__6E31x14__8G31x14y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x14__8G31x14y6[3]),  3,4},
  {&(_ZTV8G31x14y6[10]),  10,15},
  {&(_ZTV8G31x14y6[14]),  14,15},
};
extern VTBL_ENTRY _ZTI8G31x14y6[];
extern  VTBL_ENTRY _ZTV8G31x14y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x14y6[];
static VTBL_ENTRY alt_thunk_names510[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x143fooEv,_ZThn24_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x143fooEv,_ZThn16_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x143fooEv,_ZThn24_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x143fooEv,_ZThn16_N6E31x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x14y6 = {  "G31x14y6", // class name
  bases_G31x14y6, 6,
  &(vtc_G31x14y6[0]), // expected_vtbl_contents
  &(vtt_G31x14y6[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G31x14y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x14y6),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x14y6),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names510,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x14y7  : virtual E31x14 , virtual F0 {
  int ff;
  ~G31x14y7(); // tgen
  G31x14y7(); // tgen
};
//SIG(1 G31x14y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G31x14y7 ::~G31x14y7(){ note_dtor("G31x14y7", this);} // tgen
G31x14y7 ::G31x14y7(){ note_ctor("G31x14y7", this);} // tgen

static void Test_G31x14y7()
{
  extern Class_Descriptor cd_G31x14y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x14y7, buf);
    G31x14y7 *dp, &lv = *(dp=new (buf) G31x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x14y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x14y7)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x14*), ABISELECT(32,20), "G31x14y7");
    check_base_class_offset(lv, (B1*)(C31*)(E31x14*), ABISELECT(48,28), "G31x14y7");
    check_base_class_offset(lv, (C31*)(E31x14*), ABISELECT(16,8), "G31x14y7");
    check_base_class_offset(lv, (D0*)(E31x14*), ABISELECT(60,36), "G31x14y7");
    check_base_class_offset(lv, (E31x14*), ABISELECT(16,8), "G31x14y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G31x14y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G31x14y7.ff");
    test_class_info(&lv, &cd_G31x14y7);
    dp->~G31x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x14y7(Test_G31x14y7, "G31x14y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G31x14y7C1Ev();
extern void _ZN8G31x14y7D1Ev();
Name_Map name_map_G31x14y7[] = {
  NSPAIR(_ZN8G31x14y7C1Ev),
  NSPAIR(_ZN8G31x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x14;
extern VTBL_ENTRY _ZTI6E31x14[];
extern  VTBL_ENTRY _ZTV6E31x14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x14[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x14y7[] = {
  // 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_E31x14,    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 _ZTI8G31x14y7[];
extern void _ZN6E31x143fooEv();
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn16_N6E31x143fooEv,_ZThn12_N6E31x143fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn20_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x14y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x14y7[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G31x14y7[0]),
  (VTBL_ENTRY)&_ZN6E31x143fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G31x14y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G31x14y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
extern VTBL_ENTRY _ZTV8G31x14y7[];
extern void _ZN6E31x143fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x14__8G31x14y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&_ZN6E31x143fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C316E31x14__8G31x14y7[] = {
  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__3C316E31x14__8G31x14y7[] = {
  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__3C316E31x14__8G31x14y7[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn16_N6E31x143fooEv,_ZThn12_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x14__8G31x14y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv)();
extern void ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn20_N6E31x143fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x14__8G31x14y7[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E31x14[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv),
};
static  VTT_ENTRY vtt_G31x14y7[] = {
  {&(_ZTV8G31x14y7[7]),  7,22},
  {&(_ZTV8G31x14y7[13]),  13,22},
  {&(_ZTV8G31x14y7[17]),  17,22},
  {&(_ZTV8G31x14y7[21]),  21,22},
  {&(_tg__ZTV6E31x14__8G31x14y7[5]),  5,6},
  {&(_tg__ZTV3C316E31x14__8G31x14y7[4]),  4,5},
  {&(_tg__ZTV2A1__3C316E31x14__8G31x14y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C316E31x14__8G31x14y7[3]),  3,4},
  {&(_tg__ZTV2A1__6E31x14__8G31x14y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x14__8G31x14y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x14y7[];
extern  VTBL_ENTRY _ZTV8G31x14y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x14y7[];
static VTBL_ENTRY alt_thunk_names511[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x143fooEv,_ZTv0_n12_N6E31x143fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn20_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x143fooEv,_ZThn12_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x143fooEv,_ZThn20_N6E31x143fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x143fooEv,_ZThn12_N6E31x143fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x14y7 = {  "G31x14y7", // class name
  bases_G31x14y7, 6,
  &(vtc_G31x14y7[0]), // expected_vtbl_contents
  &(vtt_G31x14y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G31x14y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x14y7),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x14y7),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names511,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E0x15  : virtual C0 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E0x153fooEv
  ~E0x15(); // tgen
  E0x15(); // tgen
};
//SIG(-1 E0x15) C1{ VBC2{ BC3{ Fi} BC4{ Fi} Fi} VBC5{ Fi} v1 Fi}


void  E0x15 ::foo(){vfunc_called(this, "_ZN5E0x153fooEv");}
E0x15 ::~E0x15(){ note_dtor("E0x15", this);} // tgen
E0x15 ::E0x15(){ note_ctor("E0x15", this);} // tgen

static void Test_E0x15()
{
  extern Class_Descriptor cd_E0x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E0x15, buf);
    E0x15 *dp, &lv = *(dp=new (buf) E0x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E0x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E0x15)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(12,8), "E0x15");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(16,12), "E0x15");
    check_base_class_offset(lv, (C0*), ABISELECT(12,8), "E0x15");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E0x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E0x15.fd");
    test_class_info(&lv, &cd_E0x15);
    dp->~E0x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE0x15(Test_E0x15, "E0x15", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E0x15C1Ev();
extern void _ZN5E0x15D1Ev();
Name_Map name_map_E0x15[] = {
  NSPAIR(_ZN5E0x15C1Ev),
  NSPAIR(_ZN5E0x15D1Ev),
  {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_E0x15[] = {
  // 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 _ZTI5E0x15[];
extern void _ZN5E0x153fooEv();
static  VTBL_ENTRY vtc_E0x15[] = {
  ABISELECT(24,20),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x15[0]),
  (VTBL_ENTRY)&_ZN5E0x153fooEv,
};
extern VTBL_ENTRY _ZTV5E0x15[];
static  VTT_ENTRY vtt_E0x15[] = {
  {&(_ZTV5E0x15[4]),  4,5},
};
extern VTBL_ENTRY _ZTI5E0x15[];
extern  VTBL_ENTRY _ZTV5E0x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x15[];
Class_Descriptor cd_E0x15 = {  "E0x15", // class name
  bases_E0x15, 4,
  &(vtc_E0x15[0]), // expected_vtbl_contents
  &(vtt_E0x15[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E0x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E0x15),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E0x15),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  G0x15y0  : E0x15 , F1 {
  int ff;
  ~G0x15y0(); // tgen
  G0x15y0(); // tgen
};
//SIG(1 G0x15y0) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G0x15y0 ::~G0x15y0(){ note_dtor("G0x15y0", this);} // tgen
G0x15y0 ::G0x15y0(){ note_ctor("G0x15y0", this);} // tgen

static void Test_G0x15y0()
{
  extern Class_Descriptor cd_G0x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x15y0, buf);
    G0x15y0 *dp, &lv = *(dp=new (buf) G0x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x15y0)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(32,20), "G0x15y0");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(36,24), "G0x15y0");
    check_base_class_offset(lv, (C0*)(E0x15*), ABISELECT(32,20), "G0x15y0");
    check_base_class_offset(lv, (D0*)(E0x15*), ABISELECT(44,32), "G0x15y0");
    check_base_class_offset(lv, (E0x15*), 0, "G0x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G0x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G0x15y0.ff");
    test_class_info(&lv, &cd_G0x15y0);
    dp->~G0x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x15y0(Test_G0x15y0, "G0x15y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x15y0C1Ev();
extern void _ZN7G0x15y0D1Ev();
Name_Map name_map_G0x15y0[] = {
  NSPAIR(_ZN7G0x15y0C1Ev),
  NSPAIR(_ZN7G0x15y0D1Ev),
  {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_E0x15;
extern VTBL_ENTRY _ZTI5E0x15[];
extern  VTBL_ENTRY _ZTV5E0x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x15y0[] = {
  // 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_E0x15,    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
    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
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G0x15y0[];
extern void _ZN5E0x153fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x15y0[] = {
  ABISELECT(44,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x15y0[0]),
  (VTBL_ENTRY)&_ZN5E0x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G0x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G0x15y0[];
extern void _ZN5E0x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x15__7G0x15y0[] = {
  ABISELECT(44,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x15[0]),
  (VTBL_ENTRY)&_ZN5E0x153fooEv,
};
static  VTT_ENTRY vtt_G0x15y0[] = {
  {&(_ZTV7G0x15y0[4]),  4,8},
  {&(_tg__ZTV5E0x15__7G0x15y0[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G0x15y0[];
extern  VTBL_ENTRY _ZTV7G0x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x15y0[];
Class_Descriptor cd_G0x15y0 = {  "G0x15y0", // class name
  bases_G0x15y0, 6,
  &(vtc_G0x15y0[0]), // expected_vtbl_contents
  &(vtt_G0x15y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x15y0),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x15y0),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  G0x15y1  : virtual E0x15 , F1 {
  int ff;
  ~G0x15y1(); // tgen
  G0x15y1(); // tgen
};
//SIG(1 G0x15y1) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G0x15y1 ::~G0x15y1(){ note_dtor("G0x15y1", this);} // tgen
G0x15y1 ::G0x15y1(){ note_ctor("G0x15y1", this);} // tgen

static void Test_G0x15y1()
{
  extern Class_Descriptor cd_G0x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x15y1, buf);
    G0x15y1 *dp, &lv = *(dp=new (buf) G0x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x15y1)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(28,20), "G0x15y1");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(32,24), "G0x15y1");
    check_base_class_offset(lv, (C0*)(E0x15*), ABISELECT(28,20), "G0x15y1");
    check_base_class_offset(lv, (D0*)(E0x15*), ABISELECT(40,32), "G0x15y1");
    check_base_class_offset(lv, (E0x15*), ABISELECT(16,12), "G0x15y1");
    check_base_class_offset(lv, (F1*), 0, "G0x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x15y1.ff");
    test_class_info(&lv, &cd_G0x15y1);
    dp->~G0x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x15y1(Test_G0x15y1, "G0x15y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x15y1C1Ev();
extern void _ZN7G0x15y1D1Ev();
Name_Map name_map_G0x15y1[] = {
  NSPAIR(_ZN7G0x15y1C1Ev),
  NSPAIR(_ZN7G0x15y1D1Ev),
  {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_E0x15;
extern VTBL_ENTRY _ZTI5E0x15[];
extern  VTBL_ENTRY _ZTV5E0x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x15y1[] = {
  // 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_E0x15,    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
    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 _ZTI7G0x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E0x153fooEv();
static  VTBL_ENTRY vtc_G0x15y1[] = {
  ABISELECT(40,32),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G0x15y1[0]),
  (VTBL_ENTRY)&_ZN5E0x153fooEv,
};
extern VTBL_ENTRY _ZTV7G0x15y1[];
extern void _ZN5E0x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x15__7G0x15y1[] = {
  ABISELECT(24,20),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x15[0]),
  (VTBL_ENTRY)&_ZN5E0x153fooEv,
};
static  VTT_ENTRY vtt_G0x15y1[] = {
  {&(_ZTV7G0x15y1[5]),  5,12},
  {&(_ZTV7G0x15y1[11]),  11,12},
  {&(_tg__ZTV5E0x15__7G0x15y1[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G0x15y1[];
extern  VTBL_ENTRY _ZTV7G0x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x15y1[];
Class_Descriptor cd_G0x15y1 = {  "G0x15y1", // class name
  bases_G0x15y1, 6,
  &(vtc_G0x15y1[0]), // expected_vtbl_contents
  &(vtt_G0x15y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x15y1),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x15y1),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  G0x15y2  : E0x15 , virtual F1 {
  int ff;
  ~G0x15y2(); // tgen
  G0x15y2(); // tgen
};
//SIG(1 G0x15y2) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G0x15y2 ::~G0x15y2(){ note_dtor("G0x15y2", this);} // tgen
G0x15y2 ::G0x15y2(){ note_ctor("G0x15y2", this);} // tgen

static void Test_G0x15y2()
{
  extern Class_Descriptor cd_G0x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x15y2, buf);
    G0x15y2 *dp, &lv = *(dp=new (buf) G0x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x15y2)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(16,12), "G0x15y2");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(20,16), "G0x15y2");
    check_base_class_offset(lv, (C0*)(E0x15*), ABISELECT(16,12), "G0x15y2");
    check_base_class_offset(lv, (D0*)(E0x15*), ABISELECT(28,24), "G0x15y2");
    check_base_class_offset(lv, (E0x15*), 0, "G0x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G0x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x15y2.ff");
    test_class_info(&lv, &cd_G0x15y2);
    dp->~G0x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x15y2(Test_G0x15y2, "G0x15y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x15y2C1Ev();
extern void _ZN7G0x15y2D1Ev();
Name_Map name_map_G0x15y2[] = {
  NSPAIR(_ZN7G0x15y2C1Ev),
  NSPAIR(_ZN7G0x15y2D1Ev),
  {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_E0x15;
extern VTBL_ENTRY _ZTI5E0x15[];
extern  VTBL_ENTRY _ZTV5E0x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x15y2[] = {
  // 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_E0x15,    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
    6, //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 _ZTI7G0x15y2[];
extern void _ZN5E0x153fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x15y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x15y2[0]),
  (VTBL_ENTRY)&_ZN5E0x153fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G0x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G0x15y2[];
extern void _ZN5E0x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x15__7G0x15y2[] = {
  ABISELECT(28,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x15[0]),
  (VTBL_ENTRY)&_ZN5E0x153fooEv,
};
static  VTT_ENTRY vtt_G0x15y2[] = {
  {&(_ZTV7G0x15y2[5]),  5,10},
  {&(_tg__ZTV5E0x15__7G0x15y2[4]),  4,5},
  {&(_ZTV7G0x15y2[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G0x15y2[];
extern  VTBL_ENTRY _ZTV7G0x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x15y2[];
Class_Descriptor cd_G0x15y2 = {  "G0x15y2", // class name
  bases_G0x15y2, 6,
  &(vtc_G0x15y2[0]), // expected_vtbl_contents
  &(vtt_G0x15y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x15y2),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x15y2),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  G0x15y3  : virtual E0x15 , virtual F1 {
  int ff;
  ~G0x15y3(); // tgen
  G0x15y3(); // tgen
};
//SIG(1 G0x15y3) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G0x15y3 ::~G0x15y3(){ note_dtor("G0x15y3", this);} // tgen
G0x15y3 ::G0x15y3(){ note_ctor("G0x15y3", this);} // tgen

static void Test_G0x15y3()
{
  extern Class_Descriptor cd_G0x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G0x15y3, buf);
    G0x15y3 *dp, &lv = *(dp=new (buf) G0x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G0x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x15y3)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(28,16), "G0x15y3");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(32,20), "G0x15y3");
    check_base_class_offset(lv, (C0*)(E0x15*), ABISELECT(28,16), "G0x15y3");
    check_base_class_offset(lv, (D0*)(E0x15*), ABISELECT(40,28), "G0x15y3");
    check_base_class_offset(lv, (E0x15*), ABISELECT(16,8), "G0x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G0x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G0x15y3.ff");
    test_class_info(&lv, &cd_G0x15y3);
    dp->~G0x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x15y3(Test_G0x15y3, "G0x15y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G0x15y3C1Ev();
extern void _ZN7G0x15y3D1Ev();
Name_Map name_map_G0x15y3[] = {
  NSPAIR(_ZN7G0x15y3C1Ev),
  NSPAIR(_ZN7G0x15y3D1Ev),
  {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_E0x15;
extern VTBL_ENTRY _ZTI5E0x15[];
extern  VTBL_ENTRY _ZTV5E0x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x15y3[] = {
  // 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_E0x15,    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
    1, //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
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G0x15y3[];
extern void _ZN5E0x153fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x15y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x15y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G0x15y3[0]),
  (VTBL_ENTRY)&_ZN5E0x153fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G0x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G0x15y3[];
extern void _ZN5E0x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x15__7G0x15y3[] = {
  ABISELECT(24,20),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x15[0]),
  (VTBL_ENTRY)&_ZN5E0x153fooEv,
};
static  VTT_ENTRY vtt_G0x15y3[] = {
  {&(_ZTV7G0x15y3[6]),  6,16},
  {&(_ZTV7G0x15y3[11]),  11,16},
  {&(_ZTV7G0x15y3[15]),  15,16},
  {&(_tg__ZTV5E0x15__7G0x15y3[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G0x15y3[];
extern  VTBL_ENTRY _ZTV7G0x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x15y3[];
Class_Descriptor cd_G0x15y3 = {  "G0x15y3", // class name
  bases_G0x15y3, 6,
  &(vtc_G0x15y3[0]), // expected_vtbl_contents
  &(vtt_G0x15y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G0x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x15y3),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x15y3),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  G0x15y4  : E0x15 , F0 {
  int ff;
  ~G0x15y4(); // tgen
  G0x15y4(); // tgen
};
//SIG(1 G0x15y4) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G0x15y4 ::~G0x15y4(){ note_dtor("G0x15y4", this);} // tgen
G0x15y4 ::G0x15y4(){ note_ctor("G0x15y4", this);} // tgen

static void Test_G0x15y4()
{
  extern Class_Descriptor cd_G0x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G0x15y4, buf);
    G0x15y4 *dp, &lv = *(dp=new (buf) G0x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G0x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x15y4)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(20,16), "G0x15y4");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(24,20), "G0x15y4");
    check_base_class_offset(lv, (C0*)(E0x15*), ABISELECT(20,16), "G0x15y4");
    check_base_class_offset(lv, (D0*)(E0x15*), ABISELECT(32,28), "G0x15y4");
    check_base_class_offset(lv, (E0x15*), 0, "G0x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G0x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G0x15y4.ff");
    test_class_info(&lv, &cd_G0x15y4);
    dp->~G0x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x15y4(Test_G0x15y4, "G0x15y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G0x15y4C1Ev();
extern void _ZN7G0x15y4D1Ev();
Name_Map name_map_G0x15y4[] = {
  NSPAIR(_ZN7G0x15y4C1Ev),
  NSPAIR(_ZN7G0x15y4D1Ev),
  {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_E0x15;
extern VTBL_ENTRY _ZTI5E0x15[];
extern  VTBL_ENTRY _ZTV5E0x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x15y4[] = {
  // 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_E0x15,    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 _ZTI7G0x15y4[];
extern void _ZN5E0x153fooEv();
static  VTBL_ENTRY vtc_G0x15y4[] = {
  ABISELECT(32,28),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x15y4[0]),
  (VTBL_ENTRY)&_ZN5E0x153fooEv,
};
extern VTBL_ENTRY _ZTV7G0x15y4[];
extern void _ZN5E0x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x15__7G0x15y4[] = {
  ABISELECT(32,28),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x15[0]),
  (VTBL_ENTRY)&_ZN5E0x153fooEv,
};
static  VTT_ENTRY vtt_G0x15y4[] = {
  {&(_ZTV7G0x15y4[4]),  4,5},
  {&(_tg__ZTV5E0x15__7G0x15y4[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G0x15y4[];
extern  VTBL_ENTRY _ZTV7G0x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x15y4[];
Class_Descriptor cd_G0x15y4 = {  "G0x15y4", // class name
  bases_G0x15y4, 6,
  &(vtc_G0x15y4[0]), // expected_vtbl_contents
  &(vtt_G0x15y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G0x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x15y4),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x15y4),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  G0x15y5  : virtual E0x15 , F0 {
  int ff;
  ~G0x15y5(); // tgen
  G0x15y5(); // tgen
};
//SIG(1 G0x15y5) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G0x15y5 ::~G0x15y5(){ note_dtor("G0x15y5", this);} // tgen
G0x15y5 ::G0x15y5(){ note_ctor("G0x15y5", this);} // tgen

static void Test_G0x15y5()
{
  extern Class_Descriptor cd_G0x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x15y5, buf);
    G0x15y5 *dp, &lv = *(dp=new (buf) G0x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x15y5)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(28,20), "G0x15y5");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(32,24), "G0x15y5");
    check_base_class_offset(lv, (C0*)(E0x15*), ABISELECT(28,20), "G0x15y5");
    check_base_class_offset(lv, (D0*)(E0x15*), ABISELECT(40,32), "G0x15y5");
    check_base_class_offset(lv, (E0x15*), ABISELECT(16,12), "G0x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G0x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x15y5.ff");
    test_class_info(&lv, &cd_G0x15y5);
    dp->~G0x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x15y5(Test_G0x15y5, "G0x15y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x15y5C1Ev();
extern void _ZN7G0x15y5D1Ev();
Name_Map name_map_G0x15y5[] = {
  NSPAIR(_ZN7G0x15y5C1Ev),
  NSPAIR(_ZN7G0x15y5D1Ev),
  {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_E0x15;
extern VTBL_ENTRY _ZTI5E0x15[];
extern  VTBL_ENTRY _ZTV5E0x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x15y5[] = {
  // 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_E0x15,    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_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 _ZTI7G0x15y5[];
extern void _ZN5E0x153fooEv();
static  VTBL_ENTRY vtc_G0x15y5[] = {
  ABISELECT(40,32),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x15y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G0x15y5[0]),
  (VTBL_ENTRY)&_ZN5E0x153fooEv,
};
extern VTBL_ENTRY _ZTV7G0x15y5[];
extern void _ZN5E0x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x15__7G0x15y5[] = {
  ABISELECT(24,20),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x15[0]),
  (VTBL_ENTRY)&_ZN5E0x153fooEv,
};
static  VTT_ENTRY vtt_G0x15y5[] = {
  {&(_ZTV7G0x15y5[5]),  5,11},
  {&(_ZTV7G0x15y5[10]),  10,11},
  {&(_tg__ZTV5E0x15__7G0x15y5[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G0x15y5[];
extern  VTBL_ENTRY _ZTV7G0x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x15y5[];
Class_Descriptor cd_G0x15y5 = {  "G0x15y5", // class name
  bases_G0x15y5, 6,
  &(vtc_G0x15y5[0]), // expected_vtbl_contents
  &(vtt_G0x15y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x15y5),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x15y5),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  G0x15y6  : E0x15 , virtual F0 {
  int ff;
  ~G0x15y6(); // tgen
  G0x15y6(); // tgen
};
//SIG(1 G0x15y6) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G0x15y6 ::~G0x15y6(){ note_dtor("G0x15y6", this);} // tgen
G0x15y6 ::G0x15y6(){ note_ctor("G0x15y6", this);} // tgen

static void Test_G0x15y6()
{
  extern Class_Descriptor cd_G0x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G0x15y6, buf);
    G0x15y6 *dp, &lv = *(dp=new (buf) G0x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G0x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x15y6)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(16,12), "G0x15y6");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(20,16), "G0x15y6");
    check_base_class_offset(lv, (C0*)(E0x15*), ABISELECT(16,12), "G0x15y6");
    check_base_class_offset(lv, (D0*)(E0x15*), ABISELECT(28,24), "G0x15y6");
    check_base_class_offset(lv, (E0x15*), 0, "G0x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G0x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x15y6.ff");
    test_class_info(&lv, &cd_G0x15y6);
    dp->~G0x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x15y6(Test_G0x15y6, "G0x15y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G0x15y6C1Ev();
extern void _ZN7G0x15y6D1Ev();
Name_Map name_map_G0x15y6[] = {
  NSPAIR(_ZN7G0x15y6C1Ev),
  NSPAIR(_ZN7G0x15y6D1Ev),
  {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_E0x15;
extern VTBL_ENTRY _ZTI5E0x15[];
extern  VTBL_ENTRY _ZTV5E0x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x15y6[] = {
  // 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_E0x15,    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 _ZTI7G0x15y6[];
extern void _ZN5E0x153fooEv();
static  VTBL_ENTRY vtc_G0x15y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x15y6[0]),
  (VTBL_ENTRY)&_ZN5E0x153fooEv,
};
extern VTBL_ENTRY _ZTV7G0x15y6[];
extern void _ZN5E0x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x15__7G0x15y6[] = {
  ABISELECT(28,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x15[0]),
  (VTBL_ENTRY)&_ZN5E0x153fooEv,
};
static  VTT_ENTRY vtt_G0x15y6[] = {
  {&(_ZTV7G0x15y6[5]),  5,6},
  {&(_tg__ZTV5E0x15__7G0x15y6[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G0x15y6[];
extern  VTBL_ENTRY _ZTV7G0x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x15y6[];
Class_Descriptor cd_G0x15y6 = {  "G0x15y6", // class name
  bases_G0x15y6, 6,
  &(vtc_G0x15y6[0]), // expected_vtbl_contents
  &(vtt_G0x15y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G0x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x15y6),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x15y6),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  G0x15y7  : virtual E0x15 , virtual F0 {
  int ff;
  ~G0x15y7(); // tgen
  G0x15y7(); // tgen
};
//SIG(1 G0x15y7) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G0x15y7 ::~G0x15y7(){ note_dtor("G0x15y7", this);} // tgen
G0x15y7 ::G0x15y7(){ note_ctor("G0x15y7", this);} // tgen

static void Test_G0x15y7()
{
  extern Class_Descriptor cd_G0x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x15y7, buf);
    G0x15y7 *dp, &lv = *(dp=new (buf) G0x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x15y7)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(28,16), "G0x15y7");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(32,20), "G0x15y7");
    check_base_class_offset(lv, (C0*)(E0x15*), ABISELECT(28,16), "G0x15y7");
    check_base_class_offset(lv, (D0*)(E0x15*), ABISELECT(40,28), "G0x15y7");
    check_base_class_offset(lv, (E0x15*), ABISELECT(16,8), "G0x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G0x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G0x15y7.ff");
    test_class_info(&lv, &cd_G0x15y7);
    dp->~G0x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x15y7(Test_G0x15y7, "G0x15y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G0x15y7C1Ev();
extern void _ZN7G0x15y7D1Ev();
Name_Map name_map_G0x15y7[] = {
  NSPAIR(_ZN7G0x15y7C1Ev),
  NSPAIR(_ZN7G0x15y7D1Ev),
  {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_E0x15;
extern VTBL_ENTRY _ZTI5E0x15[];
extern  VTBL_ENTRY _ZTV5E0x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E0x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x15y7[] = {
  // 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_E0x15,    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_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 _ZTI7G0x15y7[];
extern void _ZN5E0x153fooEv();
static  VTBL_ENTRY vtc_G0x15y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G0x15y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G0x15y7[0]),
  (VTBL_ENTRY)&_ZN5E0x153fooEv,
};
extern VTBL_ENTRY _ZTV7G0x15y7[];
extern void _ZN5E0x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E0x15__7G0x15y7[] = {
  ABISELECT(24,20),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E0x15[0]),
  (VTBL_ENTRY)&_ZN5E0x153fooEv,
};
static  VTT_ENTRY vtt_G0x15y7[] = {
  {&(_ZTV7G0x15y7[6]),  6,12},
  {&(_ZTV7G0x15y7[11]),  11,12},
  {&(_tg__ZTV5E0x15__7G0x15y7[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G0x15y7[];
extern  VTBL_ENTRY _ZTV7G0x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G0x15y7[];
Class_Descriptor cd_G0x15y7 = {  "G0x15y7", // class name
  bases_G0x15y7, 6,
  &(vtc_G0x15y7[0]), // expected_vtbl_contents
  &(vtt_G0x15y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G0x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G0x15y7),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G0x15y7),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  E1x15  : virtual C1 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E1x153fooEv
  ~E1x15(); // tgen
  E1x15(); // tgen
};
//SIG(-1 E1x15) C1{ VBC2{ BC3{ v1 Fi} BC4{ Fi} Fi} VBC5{ Fi} v1 Fi}


void  E1x15 ::foo(){vfunc_called(this, "_ZN5E1x153fooEv");}
E1x15 ::~E1x15(){ note_dtor("E1x15", this);} // tgen
E1x15 ::E1x15(){ note_ctor("E1x15", this);} // tgen

static void Test_E1x15()
{
  extern Class_Descriptor cd_E1x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E1x15, buf);
    E1x15 *dp, &lv = *(dp=new (buf) E1x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E1x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E1x15)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(16,8), "E1x15");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(28,16), "E1x15");
    check_base_class_offset(lv, (C1*), ABISELECT(16,8), "E1x15");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E1x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E1x15.fd");
    test_class_info(&lv, &cd_E1x15);
    dp->~E1x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE1x15(Test_E1x15, "E1x15", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E1x15C1Ev();
extern void _ZN5E1x15D1Ev();
Name_Map name_map_E1x15[] = {
  NSPAIR(_ZN5E1x15C1Ev),
  NSPAIR(_ZN5E1x15D1Ev),
  {0,0}
};
extern Class_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_E1x15[] = {
  // 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)
    0, //bcp->index_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 _ZTI5E1x15[];
extern void _ZN5E1x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv)();
extern void ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn8_N5E1x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E1x15[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x15[0]),
  (VTBL_ENTRY)&_ZN5E1x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E1x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv),
};
extern VTBL_ENTRY _ZTV5E1x15[];
static  VTT_ENTRY vtt_E1x15[] = {
  {&(_ZTV5E1x15[4]),  4,9},
  {&(_ZTV5E1x15[8]),  8,9},
};
extern VTBL_ENTRY _ZTI5E1x15[];
extern  VTBL_ENTRY _ZTV5E1x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x15[];
static VTBL_ENTRY alt_thunk_names512[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn8_N5E1x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E1x15 = {  "E1x15", // class name
  bases_E1x15, 4,
  &(vtc_E1x15[0]), // expected_vtbl_contents
  &(vtt_E1x15[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E1x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E1x15),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E1x15),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names512,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x15y0  : E1x15 , F1 {
  int ff;
  ~G1x15y0(); // tgen
  G1x15y0(); // tgen
};
//SIG(1 G1x15y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G1x15y0 ::~G1x15y0(){ note_dtor("G1x15y0", this);} // tgen
G1x15y0 ::G1x15y0(){ note_ctor("G1x15y0", this);} // tgen

static void Test_G1x15y0()
{
  extern Class_Descriptor cd_G1x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G1x15y0, buf);
    G1x15y0 *dp, &lv = *(dp=new (buf) G1x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G1x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x15y0)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,20), "G1x15y0");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,28), "G1x15y0");
    check_base_class_offset(lv, (C1*)(E1x15*), ABISELECT(32,20), "G1x15y0");
    check_base_class_offset(lv, (D0*)(E1x15*), ABISELECT(52,36), "G1x15y0");
    check_base_class_offset(lv, (E1x15*), 0, "G1x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G1x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G1x15y0.ff");
    test_class_info(&lv, &cd_G1x15y0);
    dp->~G1x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x15y0(Test_G1x15y0, "G1x15y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G1x15y0C1Ev();
extern void _ZN7G1x15y0D1Ev();
Name_Map name_map_G1x15y0[] = {
  NSPAIR(_ZN7G1x15y0C1Ev),
  NSPAIR(_ZN7G1x15y0D1Ev),
  {0,0}
};
extern Class_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_E1x15;
extern VTBL_ENTRY _ZTI5E1x15[];
extern  VTBL_ENTRY _ZTV5E1x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x15y0[] = {
  // 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)
    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_E1x15,    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
    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 _ZTI7G1x15y0[];
extern void _ZN5E1x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv)();
extern void ABISELECT(_ZThn32_N5E1x153fooEv,_ZThn20_N5E1x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G1x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x15y0[0]),
  (VTBL_ENTRY)&_ZN5E1x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G1x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G1x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv),
};
extern VTBL_ENTRY _ZTV7G1x15y0[];
extern void _ZN5E1x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x15__7G1x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x15[0]),
  (VTBL_ENTRY)&_ZN5E1x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv)();
extern void ABISELECT(_ZThn32_N5E1x153fooEv,_ZThn20_N5E1x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C1__5E1x15__7G1x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E1x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv),
};
static  VTT_ENTRY vtt_G1x15y0[] = {
  {&(_ZTV7G1x15y0[4]),  4,12},
  {&(_tg__ZTV5E1x15__7G1x15y0[4]),  4,5},
  {&(_tg__ZTV2A12C1__5E1x15__7G1x15y0[3]),  3,4},
  {&(_ZTV7G1x15y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G1x15y0[];
extern  VTBL_ENTRY _ZTV7G1x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x15y0[];
static VTBL_ENTRY alt_thunk_names513[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E1x153fooEv,_ZThn20_N5E1x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E1x153fooEv,_ZThn20_N5E1x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G1x15y0 = {  "G1x15y0", // class name
  bases_G1x15y0, 6,
  &(vtc_G1x15y0[0]), // expected_vtbl_contents
  &(vtt_G1x15y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G1x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x15y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x15y0),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names513,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x15y1  : virtual E1x15 , F1 {
  int ff;
  ~G1x15y1(); // tgen
  G1x15y1(); // tgen
};
//SIG(1 G1x15y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G1x15y1 ::~G1x15y1(){ note_dtor("G1x15y1", this);} // tgen
G1x15y1 ::G1x15y1(){ note_ctor("G1x15y1", this);} // tgen

static void Test_G1x15y1()
{
  extern Class_Descriptor cd_G1x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G1x15y1, buf);
    G1x15y1 *dp, &lv = *(dp=new (buf) G1x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G1x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x15y1)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,20), "G1x15y1");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,28), "G1x15y1");
    check_base_class_offset(lv, (C1*)(E1x15*), ABISELECT(32,20), "G1x15y1");
    check_base_class_offset(lv, (D0*)(E1x15*), ABISELECT(52,36), "G1x15y1");
    check_base_class_offset(lv, (E1x15*), ABISELECT(16,12), "G1x15y1");
    check_base_class_offset(lv, (F1*), 0, "G1x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x15y1.ff");
    test_class_info(&lv, &cd_G1x15y1);
    dp->~G1x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x15y1(Test_G1x15y1, "G1x15y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G1x15y1C1Ev();
extern void _ZN7G1x15y1D1Ev();
Name_Map name_map_G1x15y1[] = {
  NSPAIR(_ZN7G1x15y1C1Ev),
  NSPAIR(_ZN7G1x15y1D1Ev),
  {0,0}
};
extern Class_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_E1x15;
extern VTBL_ENTRY _ZTI5E1x15[];
extern  VTBL_ENTRY _ZTV5E1x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x15y1[] = {
  // 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)
    0, //bcp->index_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_E1x15,    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 _ZTI7G1x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E1x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv)();
extern void ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn8_N5E1x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G1x15y1[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G1x15y1[0]),
  (VTBL_ENTRY)&_ZN5E1x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G1x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv),
};
extern VTBL_ENTRY _ZTV7G1x15y1[];
extern void _ZN5E1x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x15__7G1x15y1[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x15[0]),
  (VTBL_ENTRY)&_ZN5E1x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv)();
extern void ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn8_N5E1x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C1__5E1x15__7G1x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E1x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv),
};
static  VTT_ENTRY vtt_G1x15y1[] = {
  {&(_ZTV7G1x15y1[5]),  5,16},
  {&(_ZTV7G1x15y1[11]),  11,16},
  {&(_ZTV7G1x15y1[15]),  15,16},
  {&(_tg__ZTV5E1x15__7G1x15y1[4]),  4,5},
  {&(_tg__ZTV2A12C1__5E1x15__7G1x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G1x15y1[];
extern  VTBL_ENTRY _ZTV7G1x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x15y1[];
static VTBL_ENTRY alt_thunk_names514[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn8_N5E1x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn8_N5E1x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G1x15y1 = {  "G1x15y1", // class name
  bases_G1x15y1, 6,
  &(vtc_G1x15y1[0]), // expected_vtbl_contents
  &(vtt_G1x15y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G1x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x15y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x15y1),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names514,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x15y2  : E1x15 , virtual F1 {
  int ff;
  ~G1x15y2(); // tgen
  G1x15y2(); // tgen
};
//SIG(1 G1x15y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G1x15y2 ::~G1x15y2(){ note_dtor("G1x15y2", this);} // tgen
G1x15y2 ::G1x15y2(){ note_ctor("G1x15y2", this);} // tgen

static void Test_G1x15y2()
{
  extern Class_Descriptor cd_G1x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G1x15y2, buf);
    G1x15y2 *dp, &lv = *(dp=new (buf) G1x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G1x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x15y2)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(16,12), "G1x15y2");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(28,20), "G1x15y2");
    check_base_class_offset(lv, (C1*)(E1x15*), ABISELECT(16,12), "G1x15y2");
    check_base_class_offset(lv, (D0*)(E1x15*), ABISELECT(36,28), "G1x15y2");
    check_base_class_offset(lv, (E1x15*), 0, "G1x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G1x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x15y2.ff");
    test_class_info(&lv, &cd_G1x15y2);
    dp->~G1x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x15y2(Test_G1x15y2, "G1x15y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G1x15y2C1Ev();
extern void _ZN7G1x15y2D1Ev();
Name_Map name_map_G1x15y2[] = {
  NSPAIR(_ZN7G1x15y2C1Ev),
  NSPAIR(_ZN7G1x15y2D1Ev),
  {0,0}
};
extern Class_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_E1x15;
extern VTBL_ENTRY _ZTI5E1x15[];
extern  VTBL_ENTRY _ZTV5E1x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x15y2[] = {
  // 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)
    0, //bcp->index_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_E1x15,    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)
    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 _ZTI7G1x15y2[];
extern void _ZN5E1x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv)();
extern void ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn12_N5E1x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x15y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x15y2[0]),
  (VTBL_ENTRY)&_ZN5E1x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G1x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G1x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G1x15y2[];
extern void _ZN5E1x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x15__7G1x15y2[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x15[0]),
  (VTBL_ENTRY)&_ZN5E1x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv)();
extern void ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn12_N5E1x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C1__5E1x15__7G1x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E1x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv),
};
static  VTT_ENTRY vtt_G1x15y2[] = {
  {&(_ZTV7G1x15y2[5]),  5,14},
  {&(_tg__ZTV5E1x15__7G1x15y2[4]),  4,5},
  {&(_tg__ZTV2A12C1__5E1x15__7G1x15y2[3]),  3,4},
  {&(_ZTV7G1x15y2[9]),  9,14},
  {&(_ZTV7G1x15y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI7G1x15y2[];
extern  VTBL_ENTRY _ZTV7G1x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x15y2[];
static VTBL_ENTRY alt_thunk_names515[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn12_N5E1x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn12_N5E1x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G1x15y2 = {  "G1x15y2", // class name
  bases_G1x15y2, 6,
  &(vtc_G1x15y2[0]), // expected_vtbl_contents
  &(vtt_G1x15y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G1x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x15y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x15y2),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names515,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x15y3  : virtual E1x15 , virtual F1 {
  int ff;
  ~G1x15y3(); // tgen
  G1x15y3(); // tgen
};
//SIG(1 G1x15y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G1x15y3 ::~G1x15y3(){ note_dtor("G1x15y3", this);} // tgen
G1x15y3 ::G1x15y3(){ note_ctor("G1x15y3", this);} // tgen

static void Test_G1x15y3()
{
  extern Class_Descriptor cd_G1x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G1x15y3, buf);
    G1x15y3 *dp, &lv = *(dp=new (buf) G1x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G1x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x15y3)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,16), "G1x15y3");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,24), "G1x15y3");
    check_base_class_offset(lv, (C1*)(E1x15*), ABISELECT(32,16), "G1x15y3");
    check_base_class_offset(lv, (D0*)(E1x15*), ABISELECT(52,32), "G1x15y3");
    check_base_class_offset(lv, (E1x15*), ABISELECT(16,8), "G1x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G1x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G1x15y3.ff");
    test_class_info(&lv, &cd_G1x15y3);
    dp->~G1x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x15y3(Test_G1x15y3, "G1x15y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G1x15y3C1Ev();
extern void _ZN7G1x15y3D1Ev();
Name_Map name_map_G1x15y3[] = {
  NSPAIR(_ZN7G1x15y3C1Ev),
  NSPAIR(_ZN7G1x15y3D1Ev),
  {0,0}
};
extern Class_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_E1x15;
extern VTBL_ENTRY _ZTI5E1x15[];
extern  VTBL_ENTRY _ZTV5E1x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x15y3[] = {
  // 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)
    0, //bcp->index_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_E1x15,    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 _ZTI7G1x15y3[];
extern void _ZN5E1x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv)();
extern void ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn8_N5E1x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x15y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x15y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G1x15y3[0]),
  (VTBL_ENTRY)&_ZN5E1x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G1x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G1x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G1x15y3[];
extern void _ZN5E1x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x15__7G1x15y3[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x15[0]),
  (VTBL_ENTRY)&_ZN5E1x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv)();
extern void ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn8_N5E1x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C1__5E1x15__7G1x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E1x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv),
};
static  VTT_ENTRY vtt_G1x15y3[] = {
  {&(_ZTV7G1x15y3[6]),  6,20},
  {&(_ZTV7G1x15y3[11]),  11,20},
  {&(_ZTV7G1x15y3[15]),  15,20},
  {&(_ZTV7G1x15y3[19]),  19,20},
  {&(_tg__ZTV5E1x15__7G1x15y3[4]),  4,5},
  {&(_tg__ZTV2A12C1__5E1x15__7G1x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G1x15y3[];
extern  VTBL_ENTRY _ZTV7G1x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x15y3[];
static VTBL_ENTRY alt_thunk_names516[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn8_N5E1x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn8_N5E1x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G1x15y3 = {  "G1x15y3", // class name
  bases_G1x15y3, 6,
  &(vtc_G1x15y3[0]), // expected_vtbl_contents
  &(vtt_G1x15y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G1x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x15y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x15y3),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names516,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x15y4  : E1x15 , F0 {
  int ff;
  ~G1x15y4(); // tgen
  G1x15y4(); // tgen
};
//SIG(1 G1x15y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G1x15y4 ::~G1x15y4(){ note_dtor("G1x15y4", this);} // tgen
G1x15y4 ::G1x15y4(){ note_ctor("G1x15y4", this);} // tgen

static void Test_G1x15y4()
{
  extern Class_Descriptor cd_G1x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x15y4, buf);
    G1x15y4 *dp, &lv = *(dp=new (buf) G1x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x15y4)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(24,16), "G1x15y4");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(36,24), "G1x15y4");
    check_base_class_offset(lv, (C1*)(E1x15*), ABISELECT(24,16), "G1x15y4");
    check_base_class_offset(lv, (D0*)(E1x15*), ABISELECT(44,32), "G1x15y4");
    check_base_class_offset(lv, (E1x15*), 0, "G1x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G1x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G1x15y4.ff");
    test_class_info(&lv, &cd_G1x15y4);
    dp->~G1x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x15y4(Test_G1x15y4, "G1x15y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G1x15y4C1Ev();
extern void _ZN7G1x15y4D1Ev();
Name_Map name_map_G1x15y4[] = {
  NSPAIR(_ZN7G1x15y4C1Ev),
  NSPAIR(_ZN7G1x15y4D1Ev),
  {0,0}
};
extern Class_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_E1x15;
extern VTBL_ENTRY _ZTI5E1x15[];
extern  VTBL_ENTRY _ZTV5E1x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x15y4[] = {
  // 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)
    0, //bcp->index_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_E1x15,    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 _ZTI7G1x15y4[];
extern void _ZN5E1x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv)();
extern void ABISELECT(_ZThn24_N5E1x153fooEv,_ZThn16_N5E1x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G1x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x15y4[0]),
  (VTBL_ENTRY)&_ZN5E1x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G1x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv),
};
extern VTBL_ENTRY _ZTV7G1x15y4[];
extern void _ZN5E1x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x15__7G1x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x15[0]),
  (VTBL_ENTRY)&_ZN5E1x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv)();
extern void ABISELECT(_ZThn24_N5E1x153fooEv,_ZThn16_N5E1x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C1__5E1x15__7G1x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E1x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv),
};
static  VTT_ENTRY vtt_G1x15y4[] = {
  {&(_ZTV7G1x15y4[4]),  4,9},
  {&(_tg__ZTV5E1x15__7G1x15y4[4]),  4,5},
  {&(_tg__ZTV2A12C1__5E1x15__7G1x15y4[3]),  3,4},
  {&(_ZTV7G1x15y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G1x15y4[];
extern  VTBL_ENTRY _ZTV7G1x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x15y4[];
static VTBL_ENTRY alt_thunk_names517[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E1x153fooEv,_ZThn16_N5E1x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E1x153fooEv,_ZThn16_N5E1x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G1x15y4 = {  "G1x15y4", // class name
  bases_G1x15y4, 6,
  &(vtc_G1x15y4[0]), // expected_vtbl_contents
  &(vtt_G1x15y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G1x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x15y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x15y4),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names517,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x15y5  : virtual E1x15 , F0 {
  int ff;
  ~G1x15y5(); // tgen
  G1x15y5(); // tgen
};
//SIG(1 G1x15y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G1x15y5 ::~G1x15y5(){ note_dtor("G1x15y5", this);} // tgen
G1x15y5 ::G1x15y5(){ note_ctor("G1x15y5", this);} // tgen

static void Test_G1x15y5()
{
  extern Class_Descriptor cd_G1x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G1x15y5, buf);
    G1x15y5 *dp, &lv = *(dp=new (buf) G1x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G1x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x15y5)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,20), "G1x15y5");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,28), "G1x15y5");
    check_base_class_offset(lv, (C1*)(E1x15*), ABISELECT(32,20), "G1x15y5");
    check_base_class_offset(lv, (D0*)(E1x15*), ABISELECT(52,36), "G1x15y5");
    check_base_class_offset(lv, (E1x15*), ABISELECT(16,12), "G1x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G1x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x15y5.ff");
    test_class_info(&lv, &cd_G1x15y5);
    dp->~G1x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x15y5(Test_G1x15y5, "G1x15y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G1x15y5C1Ev();
extern void _ZN7G1x15y5D1Ev();
Name_Map name_map_G1x15y5[] = {
  NSPAIR(_ZN7G1x15y5C1Ev),
  NSPAIR(_ZN7G1x15y5D1Ev),
  {0,0}
};
extern Class_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_E1x15;
extern VTBL_ENTRY _ZTI5E1x15[];
extern  VTBL_ENTRY _ZTV5E1x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x15y5[] = {
  // 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)
    0, //bcp->index_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_E1x15,    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 _ZTI7G1x15y5[];
extern void _ZN5E1x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv)();
extern void ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn8_N5E1x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G1x15y5[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x15y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G1x15y5[0]),
  (VTBL_ENTRY)&_ZN5E1x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G1x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv),
};
extern VTBL_ENTRY _ZTV7G1x15y5[];
extern void _ZN5E1x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x15__7G1x15y5[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x15[0]),
  (VTBL_ENTRY)&_ZN5E1x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv)();
extern void ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn8_N5E1x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C1__5E1x15__7G1x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E1x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv),
};
static  VTT_ENTRY vtt_G1x15y5[] = {
  {&(_ZTV7G1x15y5[5]),  5,15},
  {&(_ZTV7G1x15y5[10]),  10,15},
  {&(_ZTV7G1x15y5[14]),  14,15},
  {&(_tg__ZTV5E1x15__7G1x15y5[4]),  4,5},
  {&(_tg__ZTV2A12C1__5E1x15__7G1x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G1x15y5[];
extern  VTBL_ENTRY _ZTV7G1x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x15y5[];
static VTBL_ENTRY alt_thunk_names518[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn8_N5E1x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn8_N5E1x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G1x15y5 = {  "G1x15y5", // class name
  bases_G1x15y5, 6,
  &(vtc_G1x15y5[0]), // expected_vtbl_contents
  &(vtt_G1x15y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G1x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x15y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x15y5),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names518,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x15y6  : E1x15 , virtual F0 {
  int ff;
  ~G1x15y6(); // tgen
  G1x15y6(); // tgen
};
//SIG(1 G1x15y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G1x15y6 ::~G1x15y6(){ note_dtor("G1x15y6", this);} // tgen
G1x15y6 ::G1x15y6(){ note_ctor("G1x15y6", this);} // tgen

static void Test_G1x15y6()
{
  extern Class_Descriptor cd_G1x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x15y6, buf);
    G1x15y6 *dp, &lv = *(dp=new (buf) G1x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x15y6)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(16,12), "G1x15y6");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(28,20), "G1x15y6");
    check_base_class_offset(lv, (C1*)(E1x15*), ABISELECT(16,12), "G1x15y6");
    check_base_class_offset(lv, (D0*)(E1x15*), ABISELECT(36,28), "G1x15y6");
    check_base_class_offset(lv, (E1x15*), 0, "G1x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G1x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x15y6.ff");
    test_class_info(&lv, &cd_G1x15y6);
    dp->~G1x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x15y6(Test_G1x15y6, "G1x15y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G1x15y6C1Ev();
extern void _ZN7G1x15y6D1Ev();
Name_Map name_map_G1x15y6[] = {
  NSPAIR(_ZN7G1x15y6C1Ev),
  NSPAIR(_ZN7G1x15y6D1Ev),
  {0,0}
};
extern Class_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_E1x15;
extern VTBL_ENTRY _ZTI5E1x15[];
extern  VTBL_ENTRY _ZTV5E1x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x15y6[] = {
  // 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)
    0, //bcp->index_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_E1x15,    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 _ZTI7G1x15y6[];
extern void _ZN5E1x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv)();
extern void ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn12_N5E1x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G1x15y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x15y6[0]),
  (VTBL_ENTRY)&_ZN5E1x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G1x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv),
};
extern VTBL_ENTRY _ZTV7G1x15y6[];
extern void _ZN5E1x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x15__7G1x15y6[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x15[0]),
  (VTBL_ENTRY)&_ZN5E1x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv)();
extern void ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn12_N5E1x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C1__5E1x15__7G1x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E1x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv),
};
static  VTT_ENTRY vtt_G1x15y6[] = {
  {&(_ZTV7G1x15y6[5]),  5,10},
  {&(_tg__ZTV5E1x15__7G1x15y6[4]),  4,5},
  {&(_tg__ZTV2A12C1__5E1x15__7G1x15y6[3]),  3,4},
  {&(_ZTV7G1x15y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G1x15y6[];
extern  VTBL_ENTRY _ZTV7G1x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x15y6[];
static VTBL_ENTRY alt_thunk_names519[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn12_N5E1x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn12_N5E1x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G1x15y6 = {  "G1x15y6", // class name
  bases_G1x15y6, 6,
  &(vtc_G1x15y6[0]), // expected_vtbl_contents
  &(vtt_G1x15y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G1x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x15y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x15y6),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names519,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x15y7  : virtual E1x15 , virtual F0 {
  int ff;
  ~G1x15y7(); // tgen
  G1x15y7(); // tgen
};
//SIG(1 G1x15y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G1x15y7 ::~G1x15y7(){ note_dtor("G1x15y7", this);} // tgen
G1x15y7 ::G1x15y7(){ note_ctor("G1x15y7", this);} // tgen

static void Test_G1x15y7()
{
  extern Class_Descriptor cd_G1x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G1x15y7, buf);
    G1x15y7 *dp, &lv = *(dp=new (buf) G1x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G1x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x15y7)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,16), "G1x15y7");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,24), "G1x15y7");
    check_base_class_offset(lv, (C1*)(E1x15*), ABISELECT(32,16), "G1x15y7");
    check_base_class_offset(lv, (D0*)(E1x15*), ABISELECT(52,32), "G1x15y7");
    check_base_class_offset(lv, (E1x15*), ABISELECT(16,8), "G1x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G1x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G1x15y7.ff");
    test_class_info(&lv, &cd_G1x15y7);
    dp->~G1x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x15y7(Test_G1x15y7, "G1x15y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G1x15y7C1Ev();
extern void _ZN7G1x15y7D1Ev();
Name_Map name_map_G1x15y7[] = {
  NSPAIR(_ZN7G1x15y7C1Ev),
  NSPAIR(_ZN7G1x15y7D1Ev),
  {0,0}
};
extern Class_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_E1x15;
extern VTBL_ENTRY _ZTI5E1x15[];
extern  VTBL_ENTRY _ZTV5E1x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E1x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x15y7[] = {
  // 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)
    0, //bcp->index_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_E1x15,    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 _ZTI7G1x15y7[];
extern void _ZN5E1x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv)();
extern void ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn8_N5E1x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G1x15y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G1x15y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G1x15y7[0]),
  (VTBL_ENTRY)&_ZN5E1x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G1x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv),
};
extern VTBL_ENTRY _ZTV7G1x15y7[];
extern void _ZN5E1x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E1x15__7G1x15y7[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E1x15[0]),
  (VTBL_ENTRY)&_ZN5E1x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv)();
extern void ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn8_N5E1x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C1__5E1x15__7G1x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E1x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv),
};
static  VTT_ENTRY vtt_G1x15y7[] = {
  {&(_ZTV7G1x15y7[6]),  6,16},
  {&(_ZTV7G1x15y7[11]),  11,16},
  {&(_ZTV7G1x15y7[15]),  15,16},
  {&(_tg__ZTV5E1x15__7G1x15y7[4]),  4,5},
  {&(_tg__ZTV2A12C1__5E1x15__7G1x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G1x15y7[];
extern  VTBL_ENTRY _ZTV7G1x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G1x15y7[];
static VTBL_ENTRY alt_thunk_names520[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E1x153fooEv,_ZTv0_n12_N5E1x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn8_N5E1x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E1x153fooEv,_ZThn8_N5E1x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G1x15y7 = {  "G1x15y7", // class name
  bases_G1x15y7, 6,
  &(vtc_G1x15y7[0]), // expected_vtbl_contents
  &(vtt_G1x15y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G1x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G1x15y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G1x15y7),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names520,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E2x15  : virtual C2 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E2x153fooEv
  ~E2x15(); // tgen
  E2x15(); // tgen
};
//SIG(-1 E2x15) C1{ VBC2{ VBC3{ Fi} BC4{ Fi} Fi} VBC5{ Fi} v1 Fi}


void  E2x15 ::foo(){vfunc_called(this, "_ZN5E2x153fooEv");}
E2x15 ::~E2x15(){ note_dtor("E2x15", this);} // tgen
E2x15 ::E2x15(){ note_ctor("E2x15", this);} // tgen

static void Test_E2x15()
{
  extern Class_Descriptor cd_E2x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E2x15, buf);
    E2x15 *dp, &lv = *(dp=new (buf) E2x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E2x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E2x15)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(32,20), "E2x15");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(24,12), "E2x15");
    check_base_class_offset(lv, (C2*), ABISELECT(16,8), "E2x15");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E2x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E2x15.fd");
    test_class_info(&lv, &cd_E2x15);
    dp->~E2x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE2x15(Test_E2x15, "E2x15", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E2x15C1Ev();
extern void _ZN5E2x15D1Ev();
Name_Map name_map_E2x15[] = {
  NSPAIR(_ZN5E2x15C1Ev),
  NSPAIR(_ZN5E2x15D1Ev),
  {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_E2x15[] = {
  // 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
    6, //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 _ZTI5E2x15[];
extern void _ZN5E2x153fooEv();
static  VTBL_ENTRY vtc_E2x15[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x15[0]),
  (VTBL_ENTRY)&_ZN5E2x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E2x15[0]),
};
extern VTBL_ENTRY _ZTV5E2x15[];
static  VTBL_ENTRY _tg__ZTV2C2__5E2x15[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_E2x15[] = {
  {&(_ZTV5E2x15[5]),  5,9},
  {&(_ZTV5E2x15[9]),  9,9},
  {&(_tg__ZTV2C2__5E2x15[3]),  3,3},
};
extern VTBL_ENTRY _ZTI5E2x15[];
extern  VTBL_ENTRY _ZTV5E2x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x15[];
Class_Descriptor cd_E2x15 = {  "E2x15", // class name
  bases_E2x15, 4,
  &(vtc_E2x15[0]), // expected_vtbl_contents
  &(vtt_E2x15[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E2x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E2x15),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E2x15),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  G2x15y0  : E2x15 , F1 {
  int ff;
  ~G2x15y0(); // tgen
  G2x15y0(); // tgen
};
//SIG(1 G2x15y0) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G2x15y0 ::~G2x15y0(){ note_dtor("G2x15y0", this);} // tgen
G2x15y0 ::G2x15y0(){ note_ctor("G2x15y0", this);} // tgen

static void Test_G2x15y0()
{
  extern Class_Descriptor cd_G2x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G2x15y0, buf);
    G2x15y0 *dp, &lv = *(dp=new (buf) G2x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G2x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x15y0)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,32), "G2x15y0");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,24), "G2x15y0");
    check_base_class_offset(lv, (C2*)(E2x15*), ABISELECT(32,20), "G2x15y0");
    check_base_class_offset(lv, (D0*)(E2x15*), ABISELECT(52,36), "G2x15y0");
    check_base_class_offset(lv, (E2x15*), 0, "G2x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G2x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G2x15y0.ff");
    test_class_info(&lv, &cd_G2x15y0);
    dp->~G2x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x15y0(Test_G2x15y0, "G2x15y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G2x15y0C1Ev();
extern void _ZN7G2x15y0D1Ev();
Name_Map name_map_G2x15y0[] = {
  NSPAIR(_ZN7G2x15y0C1Ev),
  NSPAIR(_ZN7G2x15y0D1Ev),
  {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_E2x15;
extern VTBL_ENTRY _ZTI5E2x15[];
extern  VTBL_ENTRY _ZTV5E2x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x15y0[] = {
  // 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
    9, //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_E2x15,    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
    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 _ZTI7G2x15y0[];
extern void _ZN5E2x153fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x15y0[0]),
  (VTBL_ENTRY)&_ZN5E2x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G2x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G2x15y0[0]),
};
extern VTBL_ENTRY _ZTV7G2x15y0[];
extern void _ZN5E2x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x15__7G2x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x15[0]),
  (VTBL_ENTRY)&_ZN5E2x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C2__5E2x15__7G2x15y0[] = {
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E2x15[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__7G2x15y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x15y0[] = {
  {&(_ZTV7G2x15y0[5]),  5,12},
  {&(_tg__ZTV5E2x15__7G2x15y0[5]),  5,6},
  {&(_tg__ZTV2C2__5E2x15__7G2x15y0[3]),  3,3},
  {&(_ZTV7G2x15y0[12]),  12,12},
  {&(_tg__ZTV2C2__7G2x15y0[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x15y0[];
extern  VTBL_ENTRY _ZTV7G2x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x15y0[];
Class_Descriptor cd_G2x15y0 = {  "G2x15y0", // class name
  bases_G2x15y0, 6,
  &(vtc_G2x15y0[0]), // expected_vtbl_contents
  &(vtt_G2x15y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G2x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x15y0),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x15y0),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  G2x15y1  : virtual E2x15 , F1 {
  int ff;
  ~G2x15y1(); // tgen
  G2x15y1(); // tgen
};
//SIG(1 G2x15y1) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G2x15y1 ::~G2x15y1(){ note_dtor("G2x15y1", this);} // tgen
G2x15y1 ::G2x15y1(){ note_ctor("G2x15y1", this);} // tgen

static void Test_G2x15y1()
{
  extern Class_Descriptor cd_G2x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G2x15y1, buf);
    G2x15y1 *dp, &lv = *(dp=new (buf) G2x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G2x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x15y1)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,32), "G2x15y1");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,24), "G2x15y1");
    check_base_class_offset(lv, (C2*)(E2x15*), ABISELECT(32,20), "G2x15y1");
    check_base_class_offset(lv, (D0*)(E2x15*), ABISELECT(52,36), "G2x15y1");
    check_base_class_offset(lv, (E2x15*), ABISELECT(16,12), "G2x15y1");
    check_base_class_offset(lv, (F1*), 0, "G2x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x15y1.ff");
    test_class_info(&lv, &cd_G2x15y1);
    dp->~G2x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x15y1(Test_G2x15y1, "G2x15y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G2x15y1C1Ev();
extern void _ZN7G2x15y1D1Ev();
Name_Map name_map_G2x15y1[] = {
  NSPAIR(_ZN7G2x15y1C1Ev),
  NSPAIR(_ZN7G2x15y1D1Ev),
  {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_E2x15;
extern VTBL_ENTRY _ZTI5E2x15[];
extern  VTBL_ENTRY _ZTV5E2x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x15y1[] = {
  // 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
    14, //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_E2x15,    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_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 _ZTI7G2x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E2x153fooEv();
static  VTBL_ENTRY vtc_G2x15y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G2x15y1[0]),
  (VTBL_ENTRY)&_ZN5E2x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G2x15y1[0]),
};
extern VTBL_ENTRY _ZTV7G2x15y1[];
extern void _ZN5E2x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x15__7G2x15y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x15[0]),
  (VTBL_ENTRY)&_ZN5E2x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C2__5E2x15__7G2x15y1[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E2x15[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__7G2x15y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x15y1[] = {
  {&(_ZTV7G2x15y1[6]),  6,17},
  {&(_ZTV7G2x15y1[13]),  13,17},
  {&(_ZTV7G2x15y1[17]),  17,17},
  {&(_tg__ZTV5E2x15__7G2x15y1[5]),  5,6},
  {&(_tg__ZTV2C2__5E2x15__7G2x15y1[3]),  3,3},
  {&(_tg__ZTV2C2__7G2x15y1[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x15y1[];
extern  VTBL_ENTRY _ZTV7G2x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x15y1[];
Class_Descriptor cd_G2x15y1 = {  "G2x15y1", // class name
  bases_G2x15y1, 6,
  &(vtc_G2x15y1[0]), // expected_vtbl_contents
  &(vtt_G2x15y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G2x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x15y1),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x15y1),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  G2x15y2  : E2x15 , virtual F1 {
  int ff;
  ~G2x15y2(); // tgen
  G2x15y2(); // tgen
};
//SIG(1 G2x15y2) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G2x15y2 ::~G2x15y2(){ note_dtor("G2x15y2", this);} // tgen
G2x15y2 ::G2x15y2(){ note_ctor("G2x15y2", this);} // tgen

static void Test_G2x15y2()
{
  extern Class_Descriptor cd_G2x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G2x15y2, buf);
    G2x15y2 *dp, &lv = *(dp=new (buf) G2x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G2x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x15y2)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(32,24), "G2x15y2");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(24,16), "G2x15y2");
    check_base_class_offset(lv, (C2*)(E2x15*), ABISELECT(16,12), "G2x15y2");
    check_base_class_offset(lv, (D0*)(E2x15*), ABISELECT(36,28), "G2x15y2");
    check_base_class_offset(lv, (E2x15*), 0, "G2x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G2x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x15y2.ff");
    test_class_info(&lv, &cd_G2x15y2);
    dp->~G2x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x15y2(Test_G2x15y2, "G2x15y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G2x15y2C1Ev();
extern void _ZN7G2x15y2D1Ev();
Name_Map name_map_G2x15y2[] = {
  NSPAIR(_ZN7G2x15y2C1Ev),
  NSPAIR(_ZN7G2x15y2D1Ev),
  {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_E2x15;
extern VTBL_ENTRY _ZTI5E2x15[];
extern  VTBL_ENTRY _ZTV5E2x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x15y2[] = {
  // 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
    7, //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_E2x15,    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
    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 _ZTI7G2x15y2[];
extern void _ZN5E2x153fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x15y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x15y2[0]),
  (VTBL_ENTRY)&_ZN5E2x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G2x15y2[0]),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G2x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G2x15y2[];
extern void _ZN5E2x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x15__7G2x15y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x15[0]),
  (VTBL_ENTRY)&_ZN5E2x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C2__5E2x15__7G2x15y2[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E2x15[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__7G2x15y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x15y2[] = {
  {&(_ZTV7G2x15y2[6]),  6,14},
  {&(_tg__ZTV5E2x15__7G2x15y2[5]),  5,6},
  {&(_tg__ZTV2C2__5E2x15__7G2x15y2[3]),  3,3},
  {&(_ZTV7G2x15y2[10]),  10,14},
  {&(_ZTV7G2x15y2[13]),  13,14},
  {&(_tg__ZTV2C2__7G2x15y2[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x15y2[];
extern  VTBL_ENTRY _ZTV7G2x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x15y2[];
Class_Descriptor cd_G2x15y2 = {  "G2x15y2", // class name
  bases_G2x15y2, 6,
  &(vtc_G2x15y2[0]), // expected_vtbl_contents
  &(vtt_G2x15y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G2x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x15y2),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x15y2),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  G2x15y3  : virtual E2x15 , virtual F1 {
  int ff;
  ~G2x15y3(); // tgen
  G2x15y3(); // tgen
};
//SIG(1 G2x15y3) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G2x15y3 ::~G2x15y3(){ note_dtor("G2x15y3", this);} // tgen
G2x15y3 ::G2x15y3(){ note_ctor("G2x15y3", this);} // tgen

static void Test_G2x15y3()
{
  extern Class_Descriptor cd_G2x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G2x15y3, buf);
    G2x15y3 *dp, &lv = *(dp=new (buf) G2x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G2x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x15y3)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,28), "G2x15y3");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,20), "G2x15y3");
    check_base_class_offset(lv, (C2*)(E2x15*), ABISELECT(32,16), "G2x15y3");
    check_base_class_offset(lv, (D0*)(E2x15*), ABISELECT(52,32), "G2x15y3");
    check_base_class_offset(lv, (E2x15*), ABISELECT(16,8), "G2x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G2x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G2x15y3.ff");
    test_class_info(&lv, &cd_G2x15y3);
    dp->~G2x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x15y3(Test_G2x15y3, "G2x15y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G2x15y3C1Ev();
extern void _ZN7G2x15y3D1Ev();
Name_Map name_map_G2x15y3[] = {
  NSPAIR(_ZN7G2x15y3C1Ev),
  NSPAIR(_ZN7G2x15y3D1Ev),
  {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_E2x15;
extern VTBL_ENTRY _ZTI5E2x15[];
extern  VTBL_ENTRY _ZTV5E2x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x15y3[] = {
  // 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
    14, //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_E2x15,    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
    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 _ZTI7G2x15y3[];
extern void _ZN5E2x153fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x15y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x15y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G2x15y3[0]),
  (VTBL_ENTRY)&_ZN5E2x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G2x15y3[0]),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G2x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G2x15y3[];
extern void _ZN5E2x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x15__7G2x15y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x15[0]),
  (VTBL_ENTRY)&_ZN5E2x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C2__5E2x15__7G2x15y3[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E2x15[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__7G2x15y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x15y3[] = {
  {&(_ZTV7G2x15y3[7]),  7,21},
  {&(_ZTV7G2x15y3[13]),  13,21},
  {&(_ZTV7G2x15y3[17]),  17,21},
  {&(_ZTV7G2x15y3[20]),  20,21},
  {&(_tg__ZTV5E2x15__7G2x15y3[5]),  5,6},
  {&(_tg__ZTV2C2__5E2x15__7G2x15y3[3]),  3,3},
  {&(_tg__ZTV2C2__7G2x15y3[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x15y3[];
extern  VTBL_ENTRY _ZTV7G2x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x15y3[];
Class_Descriptor cd_G2x15y3 = {  "G2x15y3", // class name
  bases_G2x15y3, 6,
  &(vtc_G2x15y3[0]), // expected_vtbl_contents
  &(vtt_G2x15y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G2x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x15y3),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x15y3),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  G2x15y4  : E2x15 , F0 {
  int ff;
  ~G2x15y4(); // tgen
  G2x15y4(); // tgen
};
//SIG(1 G2x15y4) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G2x15y4 ::~G2x15y4(){ note_dtor("G2x15y4", this);} // tgen
G2x15y4 ::G2x15y4(){ note_ctor("G2x15y4", this);} // tgen

static void Test_G2x15y4()
{
  extern Class_Descriptor cd_G2x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x15y4, buf);
    G2x15y4 *dp, &lv = *(dp=new (buf) G2x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x15y4)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(40,28), "G2x15y4");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(32,20), "G2x15y4");
    check_base_class_offset(lv, (C2*)(E2x15*), ABISELECT(24,16), "G2x15y4");
    check_base_class_offset(lv, (D0*)(E2x15*), ABISELECT(44,32), "G2x15y4");
    check_base_class_offset(lv, (E2x15*), 0, "G2x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G2x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G2x15y4.ff");
    test_class_info(&lv, &cd_G2x15y4);
    dp->~G2x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x15y4(Test_G2x15y4, "G2x15y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G2x15y4C1Ev();
extern void _ZN7G2x15y4D1Ev();
Name_Map name_map_G2x15y4[] = {
  NSPAIR(_ZN7G2x15y4C1Ev),
  NSPAIR(_ZN7G2x15y4D1Ev),
  {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_E2x15;
extern VTBL_ENTRY _ZTI5E2x15[];
extern  VTBL_ENTRY _ZTV5E2x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x15y4[] = {
  // 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
    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(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_E2x15,    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 _ZTI7G2x15y4[];
extern void _ZN5E2x153fooEv();
static  VTBL_ENTRY vtc_G2x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x15y4[0]),
  (VTBL_ENTRY)&_ZN5E2x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G2x15y4[0]),
};
extern VTBL_ENTRY _ZTV7G2x15y4[];
extern void _ZN5E2x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x15__7G2x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x15[0]),
  (VTBL_ENTRY)&_ZN5E2x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C2__5E2x15__7G2x15y4[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E2x15[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__7G2x15y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x15y4[] = {
  {&(_ZTV7G2x15y4[5]),  5,9},
  {&(_tg__ZTV5E2x15__7G2x15y4[5]),  5,6},
  {&(_tg__ZTV2C2__5E2x15__7G2x15y4[3]),  3,3},
  {&(_ZTV7G2x15y4[9]),  9,9},
  {&(_tg__ZTV2C2__7G2x15y4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x15y4[];
extern  VTBL_ENTRY _ZTV7G2x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x15y4[];
Class_Descriptor cd_G2x15y4 = {  "G2x15y4", // class name
  bases_G2x15y4, 6,
  &(vtc_G2x15y4[0]), // expected_vtbl_contents
  &(vtt_G2x15y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G2x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x15y4),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x15y4),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  G2x15y5  : virtual E2x15 , F0 {
  int ff;
  ~G2x15y5(); // tgen
  G2x15y5(); // tgen
};
//SIG(1 G2x15y5) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G2x15y5 ::~G2x15y5(){ note_dtor("G2x15y5", this);} // tgen
G2x15y5 ::G2x15y5(){ note_ctor("G2x15y5", this);} // tgen

static void Test_G2x15y5()
{
  extern Class_Descriptor cd_G2x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G2x15y5, buf);
    G2x15y5 *dp, &lv = *(dp=new (buf) G2x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G2x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x15y5)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,32), "G2x15y5");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,24), "G2x15y5");
    check_base_class_offset(lv, (C2*)(E2x15*), ABISELECT(32,20), "G2x15y5");
    check_base_class_offset(lv, (D0*)(E2x15*), ABISELECT(52,36), "G2x15y5");
    check_base_class_offset(lv, (E2x15*), ABISELECT(16,12), "G2x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G2x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x15y5.ff");
    test_class_info(&lv, &cd_G2x15y5);
    dp->~G2x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x15y5(Test_G2x15y5, "G2x15y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G2x15y5C1Ev();
extern void _ZN7G2x15y5D1Ev();
Name_Map name_map_G2x15y5[] = {
  NSPAIR(_ZN7G2x15y5C1Ev),
  NSPAIR(_ZN7G2x15y5D1Ev),
  {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_E2x15;
extern VTBL_ENTRY _ZTI5E2x15[];
extern  VTBL_ENTRY _ZTV5E2x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x15y5[] = {
  // 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
    13, //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_E2x15,    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
    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 _ZTI7G2x15y5[];
extern void _ZN5E2x153fooEv();
static  VTBL_ENTRY vtc_G2x15y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x15y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G2x15y5[0]),
  (VTBL_ENTRY)&_ZN5E2x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G2x15y5[0]),
};
extern VTBL_ENTRY _ZTV7G2x15y5[];
extern void _ZN5E2x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x15__7G2x15y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x15[0]),
  (VTBL_ENTRY)&_ZN5E2x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C2__5E2x15__7G2x15y5[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E2x15[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__7G2x15y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x15y5[] = {
  {&(_ZTV7G2x15y5[6]),  6,16},
  {&(_ZTV7G2x15y5[12]),  12,16},
  {&(_ZTV7G2x15y5[16]),  16,16},
  {&(_tg__ZTV5E2x15__7G2x15y5[5]),  5,6},
  {&(_tg__ZTV2C2__5E2x15__7G2x15y5[3]),  3,3},
  {&(_tg__ZTV2C2__7G2x15y5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x15y5[];
extern  VTBL_ENTRY _ZTV7G2x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x15y5[];
Class_Descriptor cd_G2x15y5 = {  "G2x15y5", // class name
  bases_G2x15y5, 6,
  &(vtc_G2x15y5[0]), // expected_vtbl_contents
  &(vtt_G2x15y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G2x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x15y5),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x15y5),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  G2x15y6  : E2x15 , virtual F0 {
  int ff;
  ~G2x15y6(); // tgen
  G2x15y6(); // tgen
};
//SIG(1 G2x15y6) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G2x15y6 ::~G2x15y6(){ note_dtor("G2x15y6", this);} // tgen
G2x15y6 ::G2x15y6(){ note_ctor("G2x15y6", this);} // tgen

static void Test_G2x15y6()
{
  extern Class_Descriptor cd_G2x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x15y6, buf);
    G2x15y6 *dp, &lv = *(dp=new (buf) G2x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x15y6)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(32,24), "G2x15y6");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(24,16), "G2x15y6");
    check_base_class_offset(lv, (C2*)(E2x15*), ABISELECT(16,12), "G2x15y6");
    check_base_class_offset(lv, (D0*)(E2x15*), ABISELECT(36,28), "G2x15y6");
    check_base_class_offset(lv, (E2x15*), 0, "G2x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G2x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x15y6.ff");
    test_class_info(&lv, &cd_G2x15y6);
    dp->~G2x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x15y6(Test_G2x15y6, "G2x15y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G2x15y6C1Ev();
extern void _ZN7G2x15y6D1Ev();
Name_Map name_map_G2x15y6[] = {
  NSPAIR(_ZN7G2x15y6C1Ev),
  NSPAIR(_ZN7G2x15y6D1Ev),
  {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_E2x15;
extern VTBL_ENTRY _ZTI5E2x15[];
extern  VTBL_ENTRY _ZTV5E2x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x15y6[] = {
  // 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
    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(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_E2x15,    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 _ZTI7G2x15y6[];
extern void _ZN5E2x153fooEv();
static  VTBL_ENTRY vtc_G2x15y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x15y6[0]),
  (VTBL_ENTRY)&_ZN5E2x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G2x15y6[0]),
};
extern VTBL_ENTRY _ZTV7G2x15y6[];
extern void _ZN5E2x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x15__7G2x15y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x15[0]),
  (VTBL_ENTRY)&_ZN5E2x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C2__5E2x15__7G2x15y6[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E2x15[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__7G2x15y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x15y6[] = {
  {&(_ZTV7G2x15y6[6]),  6,10},
  {&(_tg__ZTV5E2x15__7G2x15y6[5]),  5,6},
  {&(_tg__ZTV2C2__5E2x15__7G2x15y6[3]),  3,3},
  {&(_ZTV7G2x15y6[10]),  10,10},
  {&(_tg__ZTV2C2__7G2x15y6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x15y6[];
extern  VTBL_ENTRY _ZTV7G2x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x15y6[];
Class_Descriptor cd_G2x15y6 = {  "G2x15y6", // class name
  bases_G2x15y6, 6,
  &(vtc_G2x15y6[0]), // expected_vtbl_contents
  &(vtt_G2x15y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G2x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x15y6),10, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x15y6),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  G2x15y7  : virtual E2x15 , virtual F0 {
  int ff;
  ~G2x15y7(); // tgen
  G2x15y7(); // tgen
};
//SIG(1 G2x15y7) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G2x15y7 ::~G2x15y7(){ note_dtor("G2x15y7", this);} // tgen
G2x15y7 ::G2x15y7(){ note_ctor("G2x15y7", this);} // tgen

static void Test_G2x15y7()
{
  extern Class_Descriptor cd_G2x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G2x15y7, buf);
    G2x15y7 *dp, &lv = *(dp=new (buf) G2x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G2x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x15y7)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,28), "G2x15y7");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,20), "G2x15y7");
    check_base_class_offset(lv, (C2*)(E2x15*), ABISELECT(32,16), "G2x15y7");
    check_base_class_offset(lv, (D0*)(E2x15*), ABISELECT(52,32), "G2x15y7");
    check_base_class_offset(lv, (E2x15*), ABISELECT(16,8), "G2x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G2x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G2x15y7.ff");
    test_class_info(&lv, &cd_G2x15y7);
    dp->~G2x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x15y7(Test_G2x15y7, "G2x15y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G2x15y7C1Ev();
extern void _ZN7G2x15y7D1Ev();
Name_Map name_map_G2x15y7[] = {
  NSPAIR(_ZN7G2x15y7C1Ev),
  NSPAIR(_ZN7G2x15y7D1Ev),
  {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_E2x15;
extern VTBL_ENTRY _ZTI5E2x15[];
extern  VTBL_ENTRY _ZTV5E2x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E2x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x15y7[] = {
  // 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
    14, //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_E2x15,    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_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 _ZTI7G2x15y7[];
extern void _ZN5E2x153fooEv();
static  VTBL_ENTRY vtc_G2x15y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G2x15y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G2x15y7[0]),
  (VTBL_ENTRY)&_ZN5E2x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G2x15y7[0]),
};
extern VTBL_ENTRY _ZTV7G2x15y7[];
extern void _ZN5E2x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E2x15__7G2x15y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E2x15[0]),
  (VTBL_ENTRY)&_ZN5E2x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C2__5E2x15__7G2x15y7[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E2x15[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__7G2x15y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x15y7[] = {
  {&(_ZTV7G2x15y7[7]),  7,17},
  {&(_ZTV7G2x15y7[13]),  13,17},
  {&(_ZTV7G2x15y7[17]),  17,17},
  {&(_tg__ZTV5E2x15__7G2x15y7[5]),  5,6},
  {&(_tg__ZTV2C2__5E2x15__7G2x15y7[3]),  3,3},
  {&(_tg__ZTV2C2__7G2x15y7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G2x15y7[];
extern  VTBL_ENTRY _ZTV7G2x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G2x15y7[];
Class_Descriptor cd_G2x15y7 = {  "G2x15y7", // class name
  bases_G2x15y7, 6,
  &(vtc_G2x15y7[0]), // expected_vtbl_contents
  &(vtt_G2x15y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G2x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G2x15y7),17, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G2x15y7),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  E3x15  : virtual C3 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E3x153fooEv
  ~E3x15(); // tgen
  E3x15(); // tgen
};
//SIG(-1 E3x15) C1{ VBC2{ VBC3{ v1 Fi} BC4{ Fi} Fi} VBC5{ Fi} v1 Fi}


void  E3x15 ::foo(){vfunc_called(this, "_ZN5E3x153fooEv");}
E3x15 ::~E3x15(){ note_dtor("E3x15", this);} // tgen
E3x15 ::E3x15(){ note_ctor("E3x15", this);} // tgen

static void Test_E3x15()
{
  extern Class_Descriptor cd_E3x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E3x15, buf);
    E3x15 *dp, &lv = *(dp=new (buf) E3x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E3x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E3x15)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(32,20), "E3x15");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(24,12), "E3x15");
    check_base_class_offset(lv, (C3*), ABISELECT(16,8), "E3x15");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E3x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E3x15.fd");
    test_class_info(&lv, &cd_E3x15);
    dp->~E3x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE3x15(Test_E3x15, "E3x15", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E3x15C1Ev();
extern void _ZN5E3x15D1Ev();
Name_Map name_map_E3x15[] = {
  NSPAIR(_ZN5E3x15C1Ev),
  NSPAIR(_ZN5E3x15D1Ev),
  {0,0}
};
extern Class_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_E3x15[] = {
  // 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(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
    6, //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 _ZTI5E3x15[];
extern void _ZN5E3x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv)();
extern void ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn20_N5E3x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E3x15[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
  (VTBL_ENTRY)&_ZN5E3x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv),
};
extern VTBL_ENTRY _ZTV5E3x15[];
static  VTBL_ENTRY _tg__ZTV2C3__5E3x15[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__5E3x15[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E3x15[] = {
  {&(_ZTV5E3x15[5]),  5,13},
  {&(_ZTV5E3x15[9]),  9,13},
  {&(_ZTV5E3x15[12]),  12,13},
  {&(_tg__ZTV2C3__5E3x15[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__5E3x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E3x15[];
extern  VTBL_ENTRY _ZTV5E3x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x15[];
static VTBL_ENTRY alt_thunk_names521[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn20_N5E3x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E3x15 = {  "E3x15", // class name
  bases_E3x15, 4,
  &(vtc_E3x15[0]), // expected_vtbl_contents
  &(vtt_E3x15[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E3x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E3x15),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E3x15),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names521,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x15y0  : E3x15 , F1 {
  int ff;
  ~G3x15y0(); // tgen
  G3x15y0(); // tgen
};
//SIG(1 G3x15y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G3x15y0 ::~G3x15y0(){ note_dtor("G3x15y0", this);} // tgen
G3x15y0 ::G3x15y0(){ note_ctor("G3x15y0", this);} // tgen

static void Test_G3x15y0()
{
  extern Class_Descriptor cd_G3x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G3x15y0, buf);
    G3x15y0 *dp, &lv = *(dp=new (buf) G3x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G3x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x15y0)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,32), "G3x15y0");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,24), "G3x15y0");
    check_base_class_offset(lv, (C3*)(E3x15*), ABISELECT(32,20), "G3x15y0");
    check_base_class_offset(lv, (D0*)(E3x15*), ABISELECT(60,40), "G3x15y0");
    check_base_class_offset(lv, (E3x15*), 0, "G3x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G3x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G3x15y0.ff");
    test_class_info(&lv, &cd_G3x15y0);
    dp->~G3x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x15y0(Test_G3x15y0, "G3x15y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G3x15y0C1Ev();
extern void _ZN7G3x15y0D1Ev();
Name_Map name_map_G3x15y0[] = {
  NSPAIR(_ZN7G3x15y0C1Ev),
  NSPAIR(_ZN7G3x15y0D1Ev),
  {0,0}
};
extern Class_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_E3x15;
extern VTBL_ENTRY _ZTI5E3x15[];
extern  VTBL_ENTRY _ZTV5E3x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x15y0[] = {
  // 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(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
    9, //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_E3x15,    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
    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 _ZTI7G3x15y0[];
extern void _ZN5E3x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv)();
extern void ABISELECT(_ZThn48_N5E3x153fooEv,_ZThn32_N5E3x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x15y0[0]),
  (VTBL_ENTRY)&_ZN5E3x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G3x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G3x15y0[0]),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G3x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv),
};
extern VTBL_ENTRY _ZTV7G3x15y0[];
extern void _ZN5E3x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x15__7G3x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
  (VTBL_ENTRY)&_ZN5E3x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__5E3x15__7G3x15y0[] = {
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv)();
extern void ABISELECT(_ZThn48_N5E3x153fooEv,_ZThn32_N5E3x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x15__7G3x15y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV2C3__7G3x15y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__7G3x15y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x15y0[] = {
  {&(_ZTV7G3x15y0[5]),  5,16},
  {&(_tg__ZTV5E3x15__7G3x15y0[5]),  5,6},
  {&(_tg__ZTV2C3__5E3x15__7G3x15y0[3]),  3,3},
  {&(_tg__ZTV2A1__5E3x15__7G3x15y0[3]),  3,4},
  {&(_ZTV7G3x15y0[12]),  12,16},
  {&(_ZTV7G3x15y0[15]),  15,16},
  {&(_tg__ZTV2C3__7G3x15y0[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__7G3x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x15y0[];
extern  VTBL_ENTRY _ZTV7G3x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x15y0[];
static VTBL_ENTRY alt_thunk_names522[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N5E3x153fooEv,_ZThn32_N5E3x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N5E3x153fooEv,_ZThn32_N5E3x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x15y0 = {  "G3x15y0", // class name
  bases_G3x15y0, 6,
  &(vtc_G3x15y0[0]), // expected_vtbl_contents
  &(vtt_G3x15y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G3x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x15y0),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x15y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names522,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x15y1  : virtual E3x15 , F1 {
  int ff;
  ~G3x15y1(); // tgen
  G3x15y1(); // tgen
};
//SIG(1 G3x15y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G3x15y1 ::~G3x15y1(){ note_dtor("G3x15y1", this);} // tgen
G3x15y1 ::G3x15y1(){ note_ctor("G3x15y1", this);} // tgen

static void Test_G3x15y1()
{
  extern Class_Descriptor cd_G3x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G3x15y1, buf);
    G3x15y1 *dp, &lv = *(dp=new (buf) G3x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G3x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x15y1)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,32), "G3x15y1");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,24), "G3x15y1");
    check_base_class_offset(lv, (C3*)(E3x15*), ABISELECT(32,20), "G3x15y1");
    check_base_class_offset(lv, (D0*)(E3x15*), ABISELECT(60,40), "G3x15y1");
    check_base_class_offset(lv, (E3x15*), ABISELECT(16,12), "G3x15y1");
    check_base_class_offset(lv, (F1*), 0, "G3x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x15y1.ff");
    test_class_info(&lv, &cd_G3x15y1);
    dp->~G3x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x15y1(Test_G3x15y1, "G3x15y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G3x15y1C1Ev();
extern void _ZN7G3x15y1D1Ev();
Name_Map name_map_G3x15y1[] = {
  NSPAIR(_ZN7G3x15y1C1Ev),
  NSPAIR(_ZN7G3x15y1D1Ev),
  {0,0}
};
extern Class_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_E3x15;
extern VTBL_ENTRY _ZTI5E3x15[];
extern  VTBL_ENTRY _ZTV5E3x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x15y1[] = {
  // 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_C3,    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
    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_E3x15,    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_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 _ZTI7G3x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E3x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv)();
extern void ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn20_N5E3x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x15y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G3x15y1[0]),
  (VTBL_ENTRY)&_ZN5E3x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G3x15y1[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G3x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv),
};
extern VTBL_ENTRY _ZTV7G3x15y1[];
extern void _ZN5E3x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x15__7G3x15y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
  (VTBL_ENTRY)&_ZN5E3x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__5E3x15__7G3x15y1[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv)();
extern void ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn20_N5E3x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x15__7G3x15y1[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV2C3__7G3x15y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__7G3x15y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x15y1[] = {
  {&(_ZTV7G3x15y1[6]),  6,21},
  {&(_ZTV7G3x15y1[13]),  13,21},
  {&(_ZTV7G3x15y1[17]),  17,21},
  {&(_ZTV7G3x15y1[20]),  20,21},
  {&(_tg__ZTV5E3x15__7G3x15y1[5]),  5,6},
  {&(_tg__ZTV2C3__5E3x15__7G3x15y1[3]),  3,3},
  {&(_tg__ZTV2A1__5E3x15__7G3x15y1[3]),  3,4},
  {&(_tg__ZTV2C3__7G3x15y1[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__7G3x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x15y1[];
extern  VTBL_ENTRY _ZTV7G3x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x15y1[];
static VTBL_ENTRY alt_thunk_names523[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn20_N5E3x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn20_N5E3x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x15y1 = {  "G3x15y1", // class name
  bases_G3x15y1, 6,
  &(vtc_G3x15y1[0]), // expected_vtbl_contents
  &(vtt_G3x15y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G3x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x15y1),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x15y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names523,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x15y2  : E3x15 , virtual F1 {
  int ff;
  ~G3x15y2(); // tgen
  G3x15y2(); // tgen
};
//SIG(1 G3x15y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G3x15y2 ::~G3x15y2(){ note_dtor("G3x15y2", this);} // tgen
G3x15y2 ::G3x15y2(){ note_ctor("G3x15y2", this);} // tgen

static void Test_G3x15y2()
{
  extern Class_Descriptor cd_G3x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G3x15y2, buf);
    G3x15y2 *dp, &lv = *(dp=new (buf) G3x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G3x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x15y2)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(32,24), "G3x15y2");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(24,16), "G3x15y2");
    check_base_class_offset(lv, (C3*)(E3x15*), ABISELECT(16,12), "G3x15y2");
    check_base_class_offset(lv, (D0*)(E3x15*), ABISELECT(44,32), "G3x15y2");
    check_base_class_offset(lv, (E3x15*), 0, "G3x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G3x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x15y2.ff");
    test_class_info(&lv, &cd_G3x15y2);
    dp->~G3x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x15y2(Test_G3x15y2, "G3x15y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G3x15y2C1Ev();
extern void _ZN7G3x15y2D1Ev();
Name_Map name_map_G3x15y2[] = {
  NSPAIR(_ZN7G3x15y2C1Ev),
  NSPAIR(_ZN7G3x15y2D1Ev),
  {0,0}
};
extern Class_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_E3x15;
extern VTBL_ENTRY _ZTI5E3x15[];
extern  VTBL_ENTRY _ZTV5E3x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x15y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,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(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
    7, //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_E3x15,    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
    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 _ZTI7G3x15y2[];
extern void _ZN5E3x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv)();
extern void ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn24_N5E3x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G3x15y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x15y2[0]),
  (VTBL_ENTRY)&_ZN5E3x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G3x15y2[0]),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G3x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G3x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G3x15y2[];
extern void _ZN5E3x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x15__7G3x15y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
  (VTBL_ENTRY)&_ZN5E3x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__5E3x15__7G3x15y2[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv)();
extern void ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn24_N5E3x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x15__7G3x15y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV2C3__7G3x15y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__7G3x15y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x15y2[] = {
  {&(_ZTV7G3x15y2[6]),  6,18},
  {&(_tg__ZTV5E3x15__7G3x15y2[5]),  5,6},
  {&(_tg__ZTV2C3__5E3x15__7G3x15y2[3]),  3,3},
  {&(_tg__ZTV2A1__5E3x15__7G3x15y2[3]),  3,4},
  {&(_ZTV7G3x15y2[10]),  10,18},
  {&(_ZTV7G3x15y2[13]),  13,18},
  {&(_ZTV7G3x15y2[17]),  17,18},
  {&(_tg__ZTV2C3__7G3x15y2[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__7G3x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x15y2[];
extern  VTBL_ENTRY _ZTV7G3x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x15y2[];
static VTBL_ENTRY alt_thunk_names524[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn24_N5E3x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn24_N5E3x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x15y2 = {  "G3x15y2", // class name
  bases_G3x15y2, 6,
  &(vtc_G3x15y2[0]), // expected_vtbl_contents
  &(vtt_G3x15y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G3x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x15y2),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x15y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names524,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x15y3  : virtual E3x15 , virtual F1 {
  int ff;
  ~G3x15y3(); // tgen
  G3x15y3(); // tgen
};
//SIG(1 G3x15y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G3x15y3 ::~G3x15y3(){ note_dtor("G3x15y3", this);} // tgen
G3x15y3 ::G3x15y3(){ note_ctor("G3x15y3", this);} // tgen

static void Test_G3x15y3()
{
  extern Class_Descriptor cd_G3x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G3x15y3, buf);
    G3x15y3 *dp, &lv = *(dp=new (buf) G3x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G3x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x15y3)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,28), "G3x15y3");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,20), "G3x15y3");
    check_base_class_offset(lv, (C3*)(E3x15*), ABISELECT(32,16), "G3x15y3");
    check_base_class_offset(lv, (D0*)(E3x15*), ABISELECT(60,36), "G3x15y3");
    check_base_class_offset(lv, (E3x15*), ABISELECT(16,8), "G3x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G3x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G3x15y3.ff");
    test_class_info(&lv, &cd_G3x15y3);
    dp->~G3x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x15y3(Test_G3x15y3, "G3x15y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G3x15y3C1Ev();
extern void _ZN7G3x15y3D1Ev();
Name_Map name_map_G3x15y3[] = {
  NSPAIR(_ZN7G3x15y3C1Ev),
  NSPAIR(_ZN7G3x15y3D1Ev),
  {0,0}
};
extern Class_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_E3x15;
extern VTBL_ENTRY _ZTI5E3x15[];
extern  VTBL_ENTRY _ZTV5E3x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x15y3[] = {
  // 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_C3,    ABISELECT(32,16), //bcp->offset
    14, //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_E3x15,    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
    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 _ZTI7G3x15y3[];
extern void _ZN5E3x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv)();
extern void ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn20_N5E3x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G3x15y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x15y3[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G3x15y3[0]),
  (VTBL_ENTRY)&_ZN5E3x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G3x15y3[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G3x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G3x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G3x15y3[];
extern void _ZN5E3x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x15__7G3x15y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
  (VTBL_ENTRY)&_ZN5E3x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__5E3x15__7G3x15y3[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv)();
extern void ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn20_N5E3x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x15__7G3x15y3[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV2C3__7G3x15y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__7G3x15y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x15y3[] = {
  {&(_ZTV7G3x15y3[7]),  7,25},
  {&(_ZTV7G3x15y3[13]),  13,25},
  {&(_ZTV7G3x15y3[17]),  17,25},
  {&(_ZTV7G3x15y3[20]),  20,25},
  {&(_ZTV7G3x15y3[24]),  24,25},
  {&(_tg__ZTV5E3x15__7G3x15y3[5]),  5,6},
  {&(_tg__ZTV2C3__5E3x15__7G3x15y3[3]),  3,3},
  {&(_tg__ZTV2A1__5E3x15__7G3x15y3[3]),  3,4},
  {&(_tg__ZTV2C3__7G3x15y3[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__7G3x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x15y3[];
extern  VTBL_ENTRY _ZTV7G3x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x15y3[];
static VTBL_ENTRY alt_thunk_names525[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn20_N5E3x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn20_N5E3x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x15y3 = {  "G3x15y3", // class name
  bases_G3x15y3, 6,
  &(vtc_G3x15y3[0]), // expected_vtbl_contents
  &(vtt_G3x15y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G3x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x15y3),25, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x15y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names525,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x15y4  : E3x15 , F0 {
  int ff;
  ~G3x15y4(); // tgen
  G3x15y4(); // tgen
};
//SIG(1 G3x15y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G3x15y4 ::~G3x15y4(){ note_dtor("G3x15y4", this);} // tgen
G3x15y4 ::G3x15y4(){ note_ctor("G3x15y4", this);} // tgen

static void Test_G3x15y4()
{
  extern Class_Descriptor cd_G3x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x15y4, buf);
    G3x15y4 *dp, &lv = *(dp=new (buf) G3x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x15y4)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(40,28), "G3x15y4");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(32,20), "G3x15y4");
    check_base_class_offset(lv, (C3*)(E3x15*), ABISELECT(24,16), "G3x15y4");
    check_base_class_offset(lv, (D0*)(E3x15*), ABISELECT(52,36), "G3x15y4");
    check_base_class_offset(lv, (E3x15*), 0, "G3x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G3x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G3x15y4.ff");
    test_class_info(&lv, &cd_G3x15y4);
    dp->~G3x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x15y4(Test_G3x15y4, "G3x15y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G3x15y4C1Ev();
extern void _ZN7G3x15y4D1Ev();
Name_Map name_map_G3x15y4[] = {
  NSPAIR(_ZN7G3x15y4C1Ev),
  NSPAIR(_ZN7G3x15y4D1Ev),
  {0,0}
};
extern Class_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_E3x15;
extern VTBL_ENTRY _ZTI5E3x15[];
extern  VTBL_ENTRY _ZTV5E3x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x15y4[] = {
  // 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(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
    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(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_E3x15,    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 _ZTI7G3x15y4[];
extern void _ZN5E3x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv)();
extern void ABISELECT(_ZThn40_N5E3x153fooEv,_ZThn28_N5E3x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x15y4[0]),
  (VTBL_ENTRY)&_ZN5E3x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G3x15y4[0]),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G3x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv),
};
extern VTBL_ENTRY _ZTV7G3x15y4[];
extern void _ZN5E3x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x15__7G3x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
  (VTBL_ENTRY)&_ZN5E3x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__5E3x15__7G3x15y4[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv)();
extern void ABISELECT(_ZThn40_N5E3x153fooEv,_ZThn28_N5E3x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x15__7G3x15y4[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV2C3__7G3x15y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__7G3x15y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x15y4[] = {
  {&(_ZTV7G3x15y4[5]),  5,13},
  {&(_tg__ZTV5E3x15__7G3x15y4[5]),  5,6},
  {&(_tg__ZTV2C3__5E3x15__7G3x15y4[3]),  3,3},
  {&(_tg__ZTV2A1__5E3x15__7G3x15y4[3]),  3,4},
  {&(_ZTV7G3x15y4[9]),  9,13},
  {&(_ZTV7G3x15y4[12]),  12,13},
  {&(_tg__ZTV2C3__7G3x15y4[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__7G3x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x15y4[];
extern  VTBL_ENTRY _ZTV7G3x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x15y4[];
static VTBL_ENTRY alt_thunk_names526[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E3x153fooEv,_ZThn28_N5E3x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E3x153fooEv,_ZThn28_N5E3x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x15y4 = {  "G3x15y4", // class name
  bases_G3x15y4, 6,
  &(vtc_G3x15y4[0]), // expected_vtbl_contents
  &(vtt_G3x15y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G3x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x15y4),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x15y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names526,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x15y5  : virtual E3x15 , F0 {
  int ff;
  ~G3x15y5(); // tgen
  G3x15y5(); // tgen
};
//SIG(1 G3x15y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G3x15y5 ::~G3x15y5(){ note_dtor("G3x15y5", this);} // tgen
G3x15y5 ::G3x15y5(){ note_ctor("G3x15y5", this);} // tgen

static void Test_G3x15y5()
{
  extern Class_Descriptor cd_G3x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G3x15y5, buf);
    G3x15y5 *dp, &lv = *(dp=new (buf) G3x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G3x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x15y5)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,32), "G3x15y5");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,24), "G3x15y5");
    check_base_class_offset(lv, (C3*)(E3x15*), ABISELECT(32,20), "G3x15y5");
    check_base_class_offset(lv, (D0*)(E3x15*), ABISELECT(60,40), "G3x15y5");
    check_base_class_offset(lv, (E3x15*), ABISELECT(16,12), "G3x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G3x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x15y5.ff");
    test_class_info(&lv, &cd_G3x15y5);
    dp->~G3x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x15y5(Test_G3x15y5, "G3x15y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G3x15y5C1Ev();
extern void _ZN7G3x15y5D1Ev();
Name_Map name_map_G3x15y5[] = {
  NSPAIR(_ZN7G3x15y5C1Ev),
  NSPAIR(_ZN7G3x15y5D1Ev),
  {0,0}
};
extern Class_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_E3x15;
extern VTBL_ENTRY _ZTI5E3x15[];
extern  VTBL_ENTRY _ZTV5E3x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x15y5[] = {
  // 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_C3,    ABISELECT(32,20), //bcp->offset
    13, //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_E3x15,    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
    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 _ZTI7G3x15y5[];
extern void _ZN5E3x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv)();
extern void ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn20_N5E3x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x15y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x15y5[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G3x15y5[0]),
  (VTBL_ENTRY)&_ZN5E3x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G3x15y5[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G3x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv),
};
extern VTBL_ENTRY _ZTV7G3x15y5[];
extern void _ZN5E3x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x15__7G3x15y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
  (VTBL_ENTRY)&_ZN5E3x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__5E3x15__7G3x15y5[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv)();
extern void ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn20_N5E3x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x15__7G3x15y5[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV2C3__7G3x15y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__7G3x15y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x15y5[] = {
  {&(_ZTV7G3x15y5[6]),  6,20},
  {&(_ZTV7G3x15y5[12]),  12,20},
  {&(_ZTV7G3x15y5[16]),  16,20},
  {&(_ZTV7G3x15y5[19]),  19,20},
  {&(_tg__ZTV5E3x15__7G3x15y5[5]),  5,6},
  {&(_tg__ZTV2C3__5E3x15__7G3x15y5[3]),  3,3},
  {&(_tg__ZTV2A1__5E3x15__7G3x15y5[3]),  3,4},
  {&(_tg__ZTV2C3__7G3x15y5[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__7G3x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x15y5[];
extern  VTBL_ENTRY _ZTV7G3x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x15y5[];
static VTBL_ENTRY alt_thunk_names527[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn20_N5E3x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn20_N5E3x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x15y5 = {  "G3x15y5", // class name
  bases_G3x15y5, 6,
  &(vtc_G3x15y5[0]), // expected_vtbl_contents
  &(vtt_G3x15y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G3x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x15y5),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x15y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names527,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x15y6  : E3x15 , virtual F0 {
  int ff;
  ~G3x15y6(); // tgen
  G3x15y6(); // tgen
};
//SIG(1 G3x15y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G3x15y6 ::~G3x15y6(){ note_dtor("G3x15y6", this);} // tgen
G3x15y6 ::G3x15y6(){ note_ctor("G3x15y6", this);} // tgen

static void Test_G3x15y6()
{
  extern Class_Descriptor cd_G3x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x15y6, buf);
    G3x15y6 *dp, &lv = *(dp=new (buf) G3x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x15y6)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(32,24), "G3x15y6");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(24,16), "G3x15y6");
    check_base_class_offset(lv, (C3*)(E3x15*), ABISELECT(16,12), "G3x15y6");
    check_base_class_offset(lv, (D0*)(E3x15*), ABISELECT(44,32), "G3x15y6");
    check_base_class_offset(lv, (E3x15*), 0, "G3x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G3x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x15y6.ff");
    test_class_info(&lv, &cd_G3x15y6);
    dp->~G3x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x15y6(Test_G3x15y6, "G3x15y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G3x15y6C1Ev();
extern void _ZN7G3x15y6D1Ev();
Name_Map name_map_G3x15y6[] = {
  NSPAIR(_ZN7G3x15y6C1Ev),
  NSPAIR(_ZN7G3x15y6D1Ev),
  {0,0}
};
extern Class_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_E3x15;
extern VTBL_ENTRY _ZTI5E3x15[];
extern  VTBL_ENTRY _ZTV5E3x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x15y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,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(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
    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(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_E3x15,    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 _ZTI7G3x15y6[];
extern void _ZN5E3x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv)();
extern void ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn24_N5E3x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x15y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x15y6[0]),
  (VTBL_ENTRY)&_ZN5E3x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G3x15y6[0]),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G3x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv),
};
extern VTBL_ENTRY _ZTV7G3x15y6[];
extern void _ZN5E3x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x15__7G3x15y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
  (VTBL_ENTRY)&_ZN5E3x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__5E3x15__7G3x15y6[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv)();
extern void ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn24_N5E3x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x15__7G3x15y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV2C3__7G3x15y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__7G3x15y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x15y6[] = {
  {&(_ZTV7G3x15y6[6]),  6,14},
  {&(_tg__ZTV5E3x15__7G3x15y6[5]),  5,6},
  {&(_tg__ZTV2C3__5E3x15__7G3x15y6[3]),  3,3},
  {&(_tg__ZTV2A1__5E3x15__7G3x15y6[3]),  3,4},
  {&(_ZTV7G3x15y6[10]),  10,14},
  {&(_ZTV7G3x15y6[13]),  13,14},
  {&(_tg__ZTV2C3__7G3x15y6[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__7G3x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x15y6[];
extern  VTBL_ENTRY _ZTV7G3x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x15y6[];
static VTBL_ENTRY alt_thunk_names528[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn24_N5E3x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn24_N5E3x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x15y6 = {  "G3x15y6", // class name
  bases_G3x15y6, 6,
  &(vtc_G3x15y6[0]), // expected_vtbl_contents
  &(vtt_G3x15y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G3x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x15y6),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x15y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names528,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x15y7  : virtual E3x15 , virtual F0 {
  int ff;
  ~G3x15y7(); // tgen
  G3x15y7(); // tgen
};
//SIG(1 G3x15y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G3x15y7 ::~G3x15y7(){ note_dtor("G3x15y7", this);} // tgen
G3x15y7 ::G3x15y7(){ note_ctor("G3x15y7", this);} // tgen

static void Test_G3x15y7()
{
  extern Class_Descriptor cd_G3x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G3x15y7, buf);
    G3x15y7 *dp, &lv = *(dp=new (buf) G3x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G3x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x15y7)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,28), "G3x15y7");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,20), "G3x15y7");
    check_base_class_offset(lv, (C3*)(E3x15*), ABISELECT(32,16), "G3x15y7");
    check_base_class_offset(lv, (D0*)(E3x15*), ABISELECT(60,36), "G3x15y7");
    check_base_class_offset(lv, (E3x15*), ABISELECT(16,8), "G3x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G3x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G3x15y7.ff");
    test_class_info(&lv, &cd_G3x15y7);
    dp->~G3x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x15y7(Test_G3x15y7, "G3x15y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G3x15y7C1Ev();
extern void _ZN7G3x15y7D1Ev();
Name_Map name_map_G3x15y7[] = {
  NSPAIR(_ZN7G3x15y7C1Ev),
  NSPAIR(_ZN7G3x15y7D1Ev),
  {0,0}
};
extern Class_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_E3x15;
extern VTBL_ENTRY _ZTI5E3x15[];
extern  VTBL_ENTRY _ZTV5E3x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E3x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x15y7[] = {
  // 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_C3,    ABISELECT(32,16), //bcp->offset
    14, //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_E3x15,    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_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 _ZTI7G3x15y7[];
extern void _ZN5E3x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv)();
extern void ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn20_N5E3x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G3x15y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G3x15y7[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G3x15y7[0]),
  (VTBL_ENTRY)&_ZN5E3x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G3x15y7[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G3x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv),
};
extern VTBL_ENTRY _ZTV7G3x15y7[];
extern void _ZN5E3x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E3x15__7G3x15y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
  (VTBL_ENTRY)&_ZN5E3x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__5E3x15__7G3x15y7[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv)();
extern void ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn20_N5E3x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E3x15__7G3x15y7[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E3x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV2C3__7G3x15y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__7G3x15y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x15y7[] = {
  {&(_ZTV7G3x15y7[7]),  7,21},
  {&(_ZTV7G3x15y7[13]),  13,21},
  {&(_ZTV7G3x15y7[17]),  17,21},
  {&(_ZTV7G3x15y7[20]),  20,21},
  {&(_tg__ZTV5E3x15__7G3x15y7[5]),  5,6},
  {&(_tg__ZTV2C3__5E3x15__7G3x15y7[3]),  3,3},
  {&(_tg__ZTV2A1__5E3x15__7G3x15y7[3]),  3,4},
  {&(_tg__ZTV2C3__7G3x15y7[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__7G3x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G3x15y7[];
extern  VTBL_ENTRY _ZTV7G3x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G3x15y7[];
static VTBL_ENTRY alt_thunk_names529[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E3x153fooEv,_ZTv0_n12_N5E3x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn20_N5E3x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E3x153fooEv,_ZThn20_N5E3x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G3x15y7 = {  "G3x15y7", // class name
  bases_G3x15y7, 6,
  &(vtc_G3x15y7[0]), // expected_vtbl_contents
  &(vtt_G3x15y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G3x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G3x15y7),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G3x15y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names529,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E4x15  : virtual C4 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E4x153fooEv
  ~E4x15(); // tgen
  E4x15(); // tgen
};
//SIG(-1 E4x15) C1{ VBC2{ BC3{ Fi} BC4{ v1 Fi} Fi} VBC5{ Fi} v1 Fi}


void  E4x15 ::foo(){vfunc_called(this, "_ZN5E4x153fooEv");}
E4x15 ::~E4x15(){ note_dtor("E4x15", this);} // tgen
E4x15 ::E4x15(){ note_ctor("E4x15", this);} // tgen

static void Test_E4x15()
{
  extern Class_Descriptor cd_E4x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E4x15, buf);
    E4x15 *dp, &lv = *(dp=new (buf) E4x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E4x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E4x15)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(28,16), "E4x15");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(16,8), "E4x15");
    check_base_class_offset(lv, (C4*), ABISELECT(16,8), "E4x15");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E4x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E4x15.fd");
    test_class_info(&lv, &cd_E4x15);
    dp->~E4x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE4x15(Test_E4x15, "E4x15", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E4x15C1Ev();
extern void _ZN5E4x15D1Ev();
Name_Map name_map_E4x15[] = {
  NSPAIR(_ZN5E4x15C1Ev),
  NSPAIR(_ZN5E4x15D1Ev),
  {0,0}
};
extern Class_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_E4x15[] = {
  // 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
    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,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 _ZTI5E4x15[];
extern void _ZN5E4x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv)();
extern void ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn8_N5E4x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E4x15[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x15[0]),
  (VTBL_ENTRY)&_ZN5E4x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E4x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv),
};
extern VTBL_ENTRY _ZTV5E4x15[];
static  VTT_ENTRY vtt_E4x15[] = {
  {&(_ZTV5E4x15[4]),  4,9},
  {&(_ZTV5E4x15[8]),  8,9},
};
extern VTBL_ENTRY _ZTI5E4x15[];
extern  VTBL_ENTRY _ZTV5E4x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x15[];
static VTBL_ENTRY alt_thunk_names530[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn8_N5E4x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E4x15 = {  "E4x15", // class name
  bases_E4x15, 4,
  &(vtc_E4x15[0]), // expected_vtbl_contents
  &(vtt_E4x15[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E4x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E4x15),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E4x15),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names530,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x15y0  : E4x15 , F1 {
  int ff;
  ~G4x15y0(); // tgen
  G4x15y0(); // tgen
};
//SIG(1 G4x15y0) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G4x15y0 ::~G4x15y0(){ note_dtor("G4x15y0", this);} // tgen
G4x15y0 ::G4x15y0(){ note_ctor("G4x15y0", this);} // tgen

static void Test_G4x15y0()
{
  extern Class_Descriptor cd_G4x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G4x15y0, buf);
    G4x15y0 *dp, &lv = *(dp=new (buf) G4x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G4x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x15y0)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,28), "G4x15y0");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,20), "G4x15y0");
    check_base_class_offset(lv, (C4*)(E4x15*), ABISELECT(32,20), "G4x15y0");
    check_base_class_offset(lv, (D0*)(E4x15*), ABISELECT(52,36), "G4x15y0");
    check_base_class_offset(lv, (E4x15*), 0, "G4x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G4x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G4x15y0.ff");
    test_class_info(&lv, &cd_G4x15y0);
    dp->~G4x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x15y0(Test_G4x15y0, "G4x15y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G4x15y0C1Ev();
extern void _ZN7G4x15y0D1Ev();
Name_Map name_map_G4x15y0[] = {
  NSPAIR(_ZN7G4x15y0C1Ev),
  NSPAIR(_ZN7G4x15y0D1Ev),
  {0,0}
};
extern Class_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_E4x15;
extern VTBL_ENTRY _ZTI5E4x15[];
extern  VTBL_ENTRY _ZTV5E4x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x15y0[] = {
  // 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)
    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_E4x15,    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
    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 _ZTI7G4x15y0[];
extern void _ZN5E4x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv)();
extern void ABISELECT(_ZThn32_N5E4x153fooEv,_ZThn20_N5E4x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G4x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x15y0[0]),
  (VTBL_ENTRY)&_ZN5E4x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G4x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G4x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv),
};
extern VTBL_ENTRY _ZTV7G4x15y0[];
extern void _ZN5E4x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x15__7G4x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x15[0]),
  (VTBL_ENTRY)&_ZN5E4x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv)();
extern void ABISELECT(_ZThn32_N5E4x153fooEv,_ZThn20_N5E4x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B12C4__5E4x15__7G4x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E4x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv),
};
static  VTT_ENTRY vtt_G4x15y0[] = {
  {&(_ZTV7G4x15y0[4]),  4,12},
  {&(_tg__ZTV5E4x15__7G4x15y0[4]),  4,5},
  {&(_tg__ZTV2B12C4__5E4x15__7G4x15y0[3]),  3,4},
  {&(_ZTV7G4x15y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G4x15y0[];
extern  VTBL_ENTRY _ZTV7G4x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x15y0[];
static VTBL_ENTRY alt_thunk_names531[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E4x153fooEv,_ZThn20_N5E4x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E4x153fooEv,_ZThn20_N5E4x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G4x15y0 = {  "G4x15y0", // class name
  bases_G4x15y0, 6,
  &(vtc_G4x15y0[0]), // expected_vtbl_contents
  &(vtt_G4x15y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G4x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x15y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x15y0),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names531,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x15y1  : virtual E4x15 , F1 {
  int ff;
  ~G4x15y1(); // tgen
  G4x15y1(); // tgen
};
//SIG(1 G4x15y1) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G4x15y1 ::~G4x15y1(){ note_dtor("G4x15y1", this);} // tgen
G4x15y1 ::G4x15y1(){ note_ctor("G4x15y1", this);} // tgen

static void Test_G4x15y1()
{
  extern Class_Descriptor cd_G4x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G4x15y1, buf);
    G4x15y1 *dp, &lv = *(dp=new (buf) G4x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G4x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x15y1)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,28), "G4x15y1");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,20), "G4x15y1");
    check_base_class_offset(lv, (C4*)(E4x15*), ABISELECT(32,20), "G4x15y1");
    check_base_class_offset(lv, (D0*)(E4x15*), ABISELECT(52,36), "G4x15y1");
    check_base_class_offset(lv, (E4x15*), ABISELECT(16,12), "G4x15y1");
    check_base_class_offset(lv, (F1*), 0, "G4x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x15y1.ff");
    test_class_info(&lv, &cd_G4x15y1);
    dp->~G4x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x15y1(Test_G4x15y1, "G4x15y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G4x15y1C1Ev();
extern void _ZN7G4x15y1D1Ev();
Name_Map name_map_G4x15y1[] = {
  NSPAIR(_ZN7G4x15y1C1Ev),
  NSPAIR(_ZN7G4x15y1D1Ev),
  {0,0}
};
extern Class_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_E4x15;
extern VTBL_ENTRY _ZTI5E4x15[];
extern  VTBL_ENTRY _ZTV5E4x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x15y1[] = {
  // 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
    12, //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_E4x15,    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 _ZTI7G4x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E4x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv)();
extern void ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn8_N5E4x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G4x15y1[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G4x15y1[0]),
  (VTBL_ENTRY)&_ZN5E4x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G4x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv),
};
extern VTBL_ENTRY _ZTV7G4x15y1[];
extern void _ZN5E4x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x15__7G4x15y1[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x15[0]),
  (VTBL_ENTRY)&_ZN5E4x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv)();
extern void ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn8_N5E4x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B12C4__5E4x15__7G4x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E4x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv),
};
static  VTT_ENTRY vtt_G4x15y1[] = {
  {&(_ZTV7G4x15y1[5]),  5,16},
  {&(_ZTV7G4x15y1[11]),  11,16},
  {&(_ZTV7G4x15y1[15]),  15,16},
  {&(_tg__ZTV5E4x15__7G4x15y1[4]),  4,5},
  {&(_tg__ZTV2B12C4__5E4x15__7G4x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G4x15y1[];
extern  VTBL_ENTRY _ZTV7G4x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x15y1[];
static VTBL_ENTRY alt_thunk_names532[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn8_N5E4x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn8_N5E4x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G4x15y1 = {  "G4x15y1", // class name
  bases_G4x15y1, 6,
  &(vtc_G4x15y1[0]), // expected_vtbl_contents
  &(vtt_G4x15y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G4x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x15y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x15y1),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names532,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x15y2  : E4x15 , virtual F1 {
  int ff;
  ~G4x15y2(); // tgen
  G4x15y2(); // tgen
};
//SIG(1 G4x15y2) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G4x15y2 ::~G4x15y2(){ note_dtor("G4x15y2", this);} // tgen
G4x15y2 ::G4x15y2(){ note_ctor("G4x15y2", this);} // tgen

static void Test_G4x15y2()
{
  extern Class_Descriptor cd_G4x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G4x15y2, buf);
    G4x15y2 *dp, &lv = *(dp=new (buf) G4x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G4x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x15y2)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(28,20), "G4x15y2");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(16,12), "G4x15y2");
    check_base_class_offset(lv, (C4*)(E4x15*), ABISELECT(16,12), "G4x15y2");
    check_base_class_offset(lv, (D0*)(E4x15*), ABISELECT(36,28), "G4x15y2");
    check_base_class_offset(lv, (E4x15*), 0, "G4x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G4x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x15y2.ff");
    test_class_info(&lv, &cd_G4x15y2);
    dp->~G4x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x15y2(Test_G4x15y2, "G4x15y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G4x15y2C1Ev();
extern void _ZN7G4x15y2D1Ev();
Name_Map name_map_G4x15y2[] = {
  NSPAIR(_ZN7G4x15y2C1Ev),
  NSPAIR(_ZN7G4x15y2D1Ev),
  {0,0}
};
extern Class_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_E4x15;
extern VTBL_ENTRY _ZTI5E4x15[];
extern  VTBL_ENTRY _ZTV5E4x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x15y2[] = {
  // 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
    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(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_E4x15,    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)
    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 _ZTI7G4x15y2[];
extern void _ZN5E4x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv)();
extern void ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn12_N5E4x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x15y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x15y2[0]),
  (VTBL_ENTRY)&_ZN5E4x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G4x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G4x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G4x15y2[];
extern void _ZN5E4x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x15__7G4x15y2[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x15[0]),
  (VTBL_ENTRY)&_ZN5E4x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv)();
extern void ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn12_N5E4x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B12C4__5E4x15__7G4x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E4x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv),
};
static  VTT_ENTRY vtt_G4x15y2[] = {
  {&(_ZTV7G4x15y2[5]),  5,14},
  {&(_tg__ZTV5E4x15__7G4x15y2[4]),  4,5},
  {&(_tg__ZTV2B12C4__5E4x15__7G4x15y2[3]),  3,4},
  {&(_ZTV7G4x15y2[9]),  9,14},
  {&(_ZTV7G4x15y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI7G4x15y2[];
extern  VTBL_ENTRY _ZTV7G4x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x15y2[];
static VTBL_ENTRY alt_thunk_names533[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn12_N5E4x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn12_N5E4x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G4x15y2 = {  "G4x15y2", // class name
  bases_G4x15y2, 6,
  &(vtc_G4x15y2[0]), // expected_vtbl_contents
  &(vtt_G4x15y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G4x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x15y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x15y2),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names533,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x15y3  : virtual E4x15 , virtual F1 {
  int ff;
  ~G4x15y3(); // tgen
  G4x15y3(); // tgen
};
//SIG(1 G4x15y3) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G4x15y3 ::~G4x15y3(){ note_dtor("G4x15y3", this);} // tgen
G4x15y3 ::G4x15y3(){ note_ctor("G4x15y3", this);} // tgen

static void Test_G4x15y3()
{
  extern Class_Descriptor cd_G4x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G4x15y3, buf);
    G4x15y3 *dp, &lv = *(dp=new (buf) G4x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G4x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x15y3)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,24), "G4x15y3");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,16), "G4x15y3");
    check_base_class_offset(lv, (C4*)(E4x15*), ABISELECT(32,16), "G4x15y3");
    check_base_class_offset(lv, (D0*)(E4x15*), ABISELECT(52,32), "G4x15y3");
    check_base_class_offset(lv, (E4x15*), ABISELECT(16,8), "G4x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G4x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G4x15y3.ff");
    test_class_info(&lv, &cd_G4x15y3);
    dp->~G4x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x15y3(Test_G4x15y3, "G4x15y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G4x15y3C1Ev();
extern void _ZN7G4x15y3D1Ev();
Name_Map name_map_G4x15y3[] = {
  NSPAIR(_ZN7G4x15y3C1Ev),
  NSPAIR(_ZN7G4x15y3D1Ev),
  {0,0}
};
extern Class_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_E4x15;
extern VTBL_ENTRY _ZTI5E4x15[];
extern  VTBL_ENTRY _ZTV5E4x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x15y3[] = {
  // 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
    12, //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_E4x15,    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 _ZTI7G4x15y3[];
extern void _ZN5E4x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv)();
extern void ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn8_N5E4x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x15y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x15y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G4x15y3[0]),
  (VTBL_ENTRY)&_ZN5E4x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G4x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G4x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G4x15y3[];
extern void _ZN5E4x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x15__7G4x15y3[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x15[0]),
  (VTBL_ENTRY)&_ZN5E4x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv)();
extern void ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn8_N5E4x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B12C4__5E4x15__7G4x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E4x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv),
};
static  VTT_ENTRY vtt_G4x15y3[] = {
  {&(_ZTV7G4x15y3[6]),  6,20},
  {&(_ZTV7G4x15y3[11]),  11,20},
  {&(_ZTV7G4x15y3[15]),  15,20},
  {&(_ZTV7G4x15y3[19]),  19,20},
  {&(_tg__ZTV5E4x15__7G4x15y3[4]),  4,5},
  {&(_tg__ZTV2B12C4__5E4x15__7G4x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G4x15y3[];
extern  VTBL_ENTRY _ZTV7G4x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x15y3[];
static VTBL_ENTRY alt_thunk_names534[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn8_N5E4x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn8_N5E4x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G4x15y3 = {  "G4x15y3", // class name
  bases_G4x15y3, 6,
  &(vtc_G4x15y3[0]), // expected_vtbl_contents
  &(vtt_G4x15y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G4x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x15y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x15y3),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names534,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x15y4  : E4x15 , F0 {
  int ff;
  ~G4x15y4(); // tgen
  G4x15y4(); // tgen
};
//SIG(1 G4x15y4) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G4x15y4 ::~G4x15y4(){ note_dtor("G4x15y4", this);} // tgen
G4x15y4 ::G4x15y4(){ note_ctor("G4x15y4", this);} // tgen

static void Test_G4x15y4()
{
  extern Class_Descriptor cd_G4x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x15y4, buf);
    G4x15y4 *dp, &lv = *(dp=new (buf) G4x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x15y4)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(36,24), "G4x15y4");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(24,16), "G4x15y4");
    check_base_class_offset(lv, (C4*)(E4x15*), ABISELECT(24,16), "G4x15y4");
    check_base_class_offset(lv, (D0*)(E4x15*), ABISELECT(44,32), "G4x15y4");
    check_base_class_offset(lv, (E4x15*), 0, "G4x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G4x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G4x15y4.ff");
    test_class_info(&lv, &cd_G4x15y4);
    dp->~G4x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x15y4(Test_G4x15y4, "G4x15y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G4x15y4C1Ev();
extern void _ZN7G4x15y4D1Ev();
Name_Map name_map_G4x15y4[] = {
  NSPAIR(_ZN7G4x15y4C1Ev),
  NSPAIR(_ZN7G4x15y4D1Ev),
  {0,0}
};
extern Class_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_E4x15;
extern VTBL_ENTRY _ZTI5E4x15[];
extern  VTBL_ENTRY _ZTV5E4x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x15y4[] = {
  // 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
    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(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_E4x15,    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 _ZTI7G4x15y4[];
extern void _ZN5E4x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv)();
extern void ABISELECT(_ZThn24_N5E4x153fooEv,_ZThn16_N5E4x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G4x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x15y4[0]),
  (VTBL_ENTRY)&_ZN5E4x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G4x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv),
};
extern VTBL_ENTRY _ZTV7G4x15y4[];
extern void _ZN5E4x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x15__7G4x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x15[0]),
  (VTBL_ENTRY)&_ZN5E4x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv)();
extern void ABISELECT(_ZThn24_N5E4x153fooEv,_ZThn16_N5E4x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B12C4__5E4x15__7G4x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E4x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv),
};
static  VTT_ENTRY vtt_G4x15y4[] = {
  {&(_ZTV7G4x15y4[4]),  4,9},
  {&(_tg__ZTV5E4x15__7G4x15y4[4]),  4,5},
  {&(_tg__ZTV2B12C4__5E4x15__7G4x15y4[3]),  3,4},
  {&(_ZTV7G4x15y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G4x15y4[];
extern  VTBL_ENTRY _ZTV7G4x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x15y4[];
static VTBL_ENTRY alt_thunk_names535[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E4x153fooEv,_ZThn16_N5E4x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E4x153fooEv,_ZThn16_N5E4x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G4x15y4 = {  "G4x15y4", // class name
  bases_G4x15y4, 6,
  &(vtc_G4x15y4[0]), // expected_vtbl_contents
  &(vtt_G4x15y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G4x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x15y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x15y4),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names535,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x15y5  : virtual E4x15 , F0 {
  int ff;
  ~G4x15y5(); // tgen
  G4x15y5(); // tgen
};
//SIG(1 G4x15y5) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G4x15y5 ::~G4x15y5(){ note_dtor("G4x15y5", this);} // tgen
G4x15y5 ::G4x15y5(){ note_ctor("G4x15y5", this);} // tgen

static void Test_G4x15y5()
{
  extern Class_Descriptor cd_G4x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G4x15y5, buf);
    G4x15y5 *dp, &lv = *(dp=new (buf) G4x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G4x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x15y5)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,28), "G4x15y5");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,20), "G4x15y5");
    check_base_class_offset(lv, (C4*)(E4x15*), ABISELECT(32,20), "G4x15y5");
    check_base_class_offset(lv, (D0*)(E4x15*), ABISELECT(52,36), "G4x15y5");
    check_base_class_offset(lv, (E4x15*), ABISELECT(16,12), "G4x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G4x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x15y5.ff");
    test_class_info(&lv, &cd_G4x15y5);
    dp->~G4x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x15y5(Test_G4x15y5, "G4x15y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G4x15y5C1Ev();
extern void _ZN7G4x15y5D1Ev();
Name_Map name_map_G4x15y5[] = {
  NSPAIR(_ZN7G4x15y5C1Ev),
  NSPAIR(_ZN7G4x15y5D1Ev),
  {0,0}
};
extern Class_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_E4x15;
extern VTBL_ENTRY _ZTI5E4x15[];
extern  VTBL_ENTRY _ZTV5E4x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x15y5[] = {
  // 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
    11, //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_E4x15,    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 _ZTI7G4x15y5[];
extern void _ZN5E4x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv)();
extern void ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn8_N5E4x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G4x15y5[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x15y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G4x15y5[0]),
  (VTBL_ENTRY)&_ZN5E4x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G4x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv),
};
extern VTBL_ENTRY _ZTV7G4x15y5[];
extern void _ZN5E4x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x15__7G4x15y5[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x15[0]),
  (VTBL_ENTRY)&_ZN5E4x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv)();
extern void ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn8_N5E4x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B12C4__5E4x15__7G4x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E4x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv),
};
static  VTT_ENTRY vtt_G4x15y5[] = {
  {&(_ZTV7G4x15y5[5]),  5,15},
  {&(_ZTV7G4x15y5[10]),  10,15},
  {&(_ZTV7G4x15y5[14]),  14,15},
  {&(_tg__ZTV5E4x15__7G4x15y5[4]),  4,5},
  {&(_tg__ZTV2B12C4__5E4x15__7G4x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G4x15y5[];
extern  VTBL_ENTRY _ZTV7G4x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x15y5[];
static VTBL_ENTRY alt_thunk_names536[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn8_N5E4x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn8_N5E4x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G4x15y5 = {  "G4x15y5", // class name
  bases_G4x15y5, 6,
  &(vtc_G4x15y5[0]), // expected_vtbl_contents
  &(vtt_G4x15y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G4x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x15y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x15y5),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names536,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x15y6  : E4x15 , virtual F0 {
  int ff;
  ~G4x15y6(); // tgen
  G4x15y6(); // tgen
};
//SIG(1 G4x15y6) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G4x15y6 ::~G4x15y6(){ note_dtor("G4x15y6", this);} // tgen
G4x15y6 ::G4x15y6(){ note_ctor("G4x15y6", this);} // tgen

static void Test_G4x15y6()
{
  extern Class_Descriptor cd_G4x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x15y6, buf);
    G4x15y6 *dp, &lv = *(dp=new (buf) G4x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x15y6)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(28,20), "G4x15y6");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(16,12), "G4x15y6");
    check_base_class_offset(lv, (C4*)(E4x15*), ABISELECT(16,12), "G4x15y6");
    check_base_class_offset(lv, (D0*)(E4x15*), ABISELECT(36,28), "G4x15y6");
    check_base_class_offset(lv, (E4x15*), 0, "G4x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G4x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x15y6.ff");
    test_class_info(&lv, &cd_G4x15y6);
    dp->~G4x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x15y6(Test_G4x15y6, "G4x15y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G4x15y6C1Ev();
extern void _ZN7G4x15y6D1Ev();
Name_Map name_map_G4x15y6[] = {
  NSPAIR(_ZN7G4x15y6C1Ev),
  NSPAIR(_ZN7G4x15y6D1Ev),
  {0,0}
};
extern Class_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_E4x15;
extern VTBL_ENTRY _ZTI5E4x15[];
extern  VTBL_ENTRY _ZTV5E4x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x15y6[] = {
  // 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
    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(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_E4x15,    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 _ZTI7G4x15y6[];
extern void _ZN5E4x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv)();
extern void ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn12_N5E4x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G4x15y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x15y6[0]),
  (VTBL_ENTRY)&_ZN5E4x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G4x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv),
};
extern VTBL_ENTRY _ZTV7G4x15y6[];
extern void _ZN5E4x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x15__7G4x15y6[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x15[0]),
  (VTBL_ENTRY)&_ZN5E4x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv)();
extern void ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn12_N5E4x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B12C4__5E4x15__7G4x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E4x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv),
};
static  VTT_ENTRY vtt_G4x15y6[] = {
  {&(_ZTV7G4x15y6[5]),  5,10},
  {&(_tg__ZTV5E4x15__7G4x15y6[4]),  4,5},
  {&(_tg__ZTV2B12C4__5E4x15__7G4x15y6[3]),  3,4},
  {&(_ZTV7G4x15y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G4x15y6[];
extern  VTBL_ENTRY _ZTV7G4x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x15y6[];
static VTBL_ENTRY alt_thunk_names537[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn12_N5E4x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn12_N5E4x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G4x15y6 = {  "G4x15y6", // class name
  bases_G4x15y6, 6,
  &(vtc_G4x15y6[0]), // expected_vtbl_contents
  &(vtt_G4x15y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G4x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x15y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x15y6),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names537,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x15y7  : virtual E4x15 , virtual F0 {
  int ff;
  ~G4x15y7(); // tgen
  G4x15y7(); // tgen
};
//SIG(1 G4x15y7) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G4x15y7 ::~G4x15y7(){ note_dtor("G4x15y7", this);} // tgen
G4x15y7 ::G4x15y7(){ note_ctor("G4x15y7", this);} // tgen

static void Test_G4x15y7()
{
  extern Class_Descriptor cd_G4x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G4x15y7, buf);
    G4x15y7 *dp, &lv = *(dp=new (buf) G4x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G4x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x15y7)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,24), "G4x15y7");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,16), "G4x15y7");
    check_base_class_offset(lv, (C4*)(E4x15*), ABISELECT(32,16), "G4x15y7");
    check_base_class_offset(lv, (D0*)(E4x15*), ABISELECT(52,32), "G4x15y7");
    check_base_class_offset(lv, (E4x15*), ABISELECT(16,8), "G4x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G4x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G4x15y7.ff");
    test_class_info(&lv, &cd_G4x15y7);
    dp->~G4x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x15y7(Test_G4x15y7, "G4x15y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G4x15y7C1Ev();
extern void _ZN7G4x15y7D1Ev();
Name_Map name_map_G4x15y7[] = {
  NSPAIR(_ZN7G4x15y7C1Ev),
  NSPAIR(_ZN7G4x15y7D1Ev),
  {0,0}
};
extern Class_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_E4x15;
extern VTBL_ENTRY _ZTI5E4x15[];
extern  VTBL_ENTRY _ZTV5E4x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E4x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x15y7[] = {
  // 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
    12, //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_E4x15,    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 _ZTI7G4x15y7[];
extern void _ZN5E4x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv)();
extern void ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn8_N5E4x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G4x15y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G4x15y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G4x15y7[0]),
  (VTBL_ENTRY)&_ZN5E4x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G4x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv),
};
extern VTBL_ENTRY _ZTV7G4x15y7[];
extern void _ZN5E4x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E4x15__7G4x15y7[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E4x15[0]),
  (VTBL_ENTRY)&_ZN5E4x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv)();
extern void ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn8_N5E4x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B12C4__5E4x15__7G4x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E4x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv),
};
static  VTT_ENTRY vtt_G4x15y7[] = {
  {&(_ZTV7G4x15y7[6]),  6,16},
  {&(_ZTV7G4x15y7[11]),  11,16},
  {&(_ZTV7G4x15y7[15]),  15,16},
  {&(_tg__ZTV5E4x15__7G4x15y7[4]),  4,5},
  {&(_tg__ZTV2B12C4__5E4x15__7G4x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G4x15y7[];
extern  VTBL_ENTRY _ZTV7G4x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G4x15y7[];
static VTBL_ENTRY alt_thunk_names538[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E4x153fooEv,_ZTv0_n12_N5E4x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn8_N5E4x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E4x153fooEv,_ZThn8_N5E4x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G4x15y7 = {  "G4x15y7", // class name
  bases_G4x15y7, 6,
  &(vtc_G4x15y7[0]), // expected_vtbl_contents
  &(vtt_G4x15y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G4x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G4x15y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G4x15y7),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names538,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E5x15  : virtual C5 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E5x153fooEv
  ~E5x15(); // tgen
  E5x15(); // tgen
};
//SIG(-1 E5x15) C1{ VBC2{ BC3{ v1 Fi} BC4{ v1 Fi} Fi} VBC5{ Fi} v1 Fi}


void  E5x15 ::foo(){vfunc_called(this, "_ZN5E5x153fooEv");}
E5x15 ::~E5x15(){ note_dtor("E5x15", this);} // tgen
E5x15 ::E5x15(){ note_ctor("E5x15", this);} // tgen

static void Test_E5x15()
{
  extern Class_Descriptor cd_E5x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_E5x15, buf);
    E5x15 *dp, &lv = *(dp=new (buf) E5x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(E5x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E5x15)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(16,8), "E5x15");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(32,16), "E5x15");
    check_base_class_offset(lv, (C5*), ABISELECT(16,8), "E5x15");
    check_base_class_offset(lv, (D0*), ABISELECT(48,28), "E5x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E5x15.fd");
    test_class_info(&lv, &cd_E5x15);
    dp->~E5x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE5x15(Test_E5x15, "E5x15", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN5E5x15C1Ev();
extern void _ZN5E5x15D1Ev();
Name_Map name_map_E5x15[] = {
  NSPAIR(_ZN5E5x15C1Ev),
  NSPAIR(_ZN5E5x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x15[] = {
  // 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)
    0, //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
    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,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 _ZTI5E5x15[];
extern void _ZN5E5x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv)();
extern void ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn8_N5E5x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv)();
static  VTBL_ENTRY vtc_E5x15[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&_ZN5E5x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv),
};
extern VTBL_ENTRY _ZTV5E5x15[];
static  VTT_ENTRY vtt_E5x15[] = {
  {&(_ZTV5E5x15[4]),  4,12},
  {&(_ZTV5E5x15[8]),  8,12},
  {&(_ZTV5E5x15[11]),  11,12},
};
extern VTBL_ENTRY _ZTI5E5x15[];
extern  VTBL_ENTRY _ZTV5E5x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x15[];
static VTBL_ENTRY alt_thunk_names539[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn8_N5E5x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E5x15 = {  "E5x15", // class name
  bases_E5x15, 4,
  &(vtc_E5x15[0]), // expected_vtbl_contents
  &(vtt_E5x15[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI5E5x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E5x15),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E5x15),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names539,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x15y0  : E5x15 , F1 {
  int ff;
  ~G5x15y0(); // tgen
  G5x15y0(); // tgen
};
//SIG(1 G5x15y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G5x15y0 ::~G5x15y0(){ note_dtor("G5x15y0", this);} // tgen
G5x15y0 ::G5x15y0(){ note_ctor("G5x15y0", this);} // tgen

static void Test_G5x15y0()
{
  extern Class_Descriptor cd_G5x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G5x15y0, buf);
    G5x15y0 *dp, &lv = *(dp=new (buf) G5x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G5x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x15y0)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,20), "G5x15y0");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,28), "G5x15y0");
    check_base_class_offset(lv, (C5*)(E5x15*), ABISELECT(32,20), "G5x15y0");
    check_base_class_offset(lv, (D0*)(E5x15*), ABISELECT(64,40), "G5x15y0");
    check_base_class_offset(lv, (E5x15*), 0, "G5x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G5x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G5x15y0.ff");
    test_class_info(&lv, &cd_G5x15y0);
    dp->~G5x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x15y0(Test_G5x15y0, "G5x15y0", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G5x15y0C1Ev();
extern void _ZN7G5x15y0D1Ev();
Name_Map name_map_G5x15y0[] = {
  NSPAIR(_ZN7G5x15y0C1Ev),
  NSPAIR(_ZN7G5x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x15;
extern VTBL_ENTRY _ZTI5E5x15[];
extern  VTBL_ENTRY _ZTV5E5x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x15y0[] = {
  // 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)
    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_E5x15,    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
    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 _ZTI7G5x15y0[];
extern void _ZN5E5x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv)();
extern void ABISELECT(_ZThn32_N5E5x153fooEv,_ZThn20_N5E5x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv)();
static  VTBL_ENTRY vtc_G5x15y0[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x15y0[0]),
  (VTBL_ENTRY)&_ZN5E5x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G5x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G5x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G5x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv),
};
extern VTBL_ENTRY _ZTV7G5x15y0[];
extern void _ZN5E5x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x15__7G5x15y0[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&_ZN5E5x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv)();
extern void ABISELECT(_ZThn32_N5E5x153fooEv,_ZThn20_N5E5x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C5__5E5x15__7G5x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv)();
static  VTBL_ENTRY _tg__ZTV2B12C5__5E5x15__7G5x15y0[] = {
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv),
};
static  VTT_ENTRY vtt_G5x15y0[] = {
  {&(_ZTV7G5x15y0[4]),  4,15},
  {&(_tg__ZTV5E5x15__7G5x15y0[4]),  4,5},
  {&(_tg__ZTV2A12C5__5E5x15__7G5x15y0[3]),  3,4},
  {&(_tg__ZTV2B12C5__5E5x15__7G5x15y0[2]),  2,3},
  {&(_ZTV7G5x15y0[11]),  11,15},
  {&(_ZTV7G5x15y0[14]),  14,15},
};
extern VTBL_ENTRY _ZTI7G5x15y0[];
extern  VTBL_ENTRY _ZTV7G5x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x15y0[];
static VTBL_ENTRY alt_thunk_names540[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E5x153fooEv,_ZThn20_N5E5x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E5x153fooEv,_ZThn20_N5E5x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G5x15y0 = {  "G5x15y0", // class name
  bases_G5x15y0, 6,
  &(vtc_G5x15y0[0]), // expected_vtbl_contents
  &(vtt_G5x15y0[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G5x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x15y0),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x15y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names540,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x15y1  : virtual E5x15 , F1 {
  int ff;
  ~G5x15y1(); // tgen
  G5x15y1(); // tgen
};
//SIG(1 G5x15y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G5x15y1 ::~G5x15y1(){ note_dtor("G5x15y1", this);} // tgen
G5x15y1 ::G5x15y1(){ note_ctor("G5x15y1", this);} // tgen

static void Test_G5x15y1()
{
  extern Class_Descriptor cd_G5x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G5x15y1, buf);
    G5x15y1 *dp, &lv = *(dp=new (buf) G5x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G5x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x15y1)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,20), "G5x15y1");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,28), "G5x15y1");
    check_base_class_offset(lv, (C5*)(E5x15*), ABISELECT(32,20), "G5x15y1");
    check_base_class_offset(lv, (D0*)(E5x15*), ABISELECT(64,40), "G5x15y1");
    check_base_class_offset(lv, (E5x15*), ABISELECT(16,12), "G5x15y1");
    check_base_class_offset(lv, (F1*), 0, "G5x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x15y1.ff");
    test_class_info(&lv, &cd_G5x15y1);
    dp->~G5x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x15y1(Test_G5x15y1, "G5x15y1", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G5x15y1C1Ev();
extern void _ZN7G5x15y1D1Ev();
Name_Map name_map_G5x15y1[] = {
  NSPAIR(_ZN7G5x15y1C1Ev),
  NSPAIR(_ZN7G5x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x15;
extern VTBL_ENTRY _ZTI5E5x15[];
extern  VTBL_ENTRY _ZTV5E5x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x15y1[] = {
  // 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)
    0, //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
    16, //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_E5x15,    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 _ZTI7G5x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E5x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv)();
extern void ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn8_N5E5x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv)();
static  VTBL_ENTRY vtc_G5x15y1[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(48,28),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G5x15y1[0]),
  (VTBL_ENTRY)&_ZN5E5x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G5x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G5x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv),
};
extern VTBL_ENTRY _ZTV7G5x15y1[];
extern void _ZN5E5x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x15__7G5x15y1[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&_ZN5E5x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv)();
extern void ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn8_N5E5x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C5__5E5x15__7G5x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv)();
static  VTBL_ENTRY _tg__ZTV2B12C5__5E5x15__7G5x15y1[] = {
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv),
};
static  VTT_ENTRY vtt_G5x15y1[] = {
  {&(_ZTV7G5x15y1[5]),  5,19},
  {&(_ZTV7G5x15y1[11]),  11,19},
  {&(_ZTV7G5x15y1[15]),  15,19},
  {&(_ZTV7G5x15y1[18]),  18,19},
  {&(_tg__ZTV5E5x15__7G5x15y1[4]),  4,5},
  {&(_tg__ZTV2A12C5__5E5x15__7G5x15y1[3]),  3,4},
  {&(_tg__ZTV2B12C5__5E5x15__7G5x15y1[2]),  2,3},
};
extern VTBL_ENTRY _ZTI7G5x15y1[];
extern  VTBL_ENTRY _ZTV7G5x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x15y1[];
static VTBL_ENTRY alt_thunk_names541[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn8_N5E5x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn8_N5E5x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G5x15y1 = {  "G5x15y1", // class name
  bases_G5x15y1, 6,
  &(vtc_G5x15y1[0]), // expected_vtbl_contents
  &(vtt_G5x15y1[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G5x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x15y1),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x15y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names541,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x15y2  : E5x15 , virtual F1 {
  int ff;
  ~G5x15y2(); // tgen
  G5x15y2(); // tgen
};
//SIG(1 G5x15y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G5x15y2 ::~G5x15y2(){ note_dtor("G5x15y2", this);} // tgen
G5x15y2 ::G5x15y2(){ note_ctor("G5x15y2", this);} // tgen

static void Test_G5x15y2()
{
  extern Class_Descriptor cd_G5x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G5x15y2, buf);
    G5x15y2 *dp, &lv = *(dp=new (buf) G5x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G5x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x15y2)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(16,12), "G5x15y2");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(32,20), "G5x15y2");
    check_base_class_offset(lv, (C5*)(E5x15*), ABISELECT(16,12), "G5x15y2");
    check_base_class_offset(lv, (D0*)(E5x15*), ABISELECT(48,32), "G5x15y2");
    check_base_class_offset(lv, (E5x15*), 0, "G5x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G5x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x15y2.ff");
    test_class_info(&lv, &cd_G5x15y2);
    dp->~G5x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x15y2(Test_G5x15y2, "G5x15y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G5x15y2C1Ev();
extern void _ZN7G5x15y2D1Ev();
Name_Map name_map_G5x15y2[] = {
  NSPAIR(_ZN7G5x15y2C1Ev),
  NSPAIR(_ZN7G5x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x15;
extern VTBL_ENTRY _ZTI5E5x15[];
extern  VTBL_ENTRY _ZTV5E5x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x15y2[] = {
  // 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)
    0, //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)
    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_E5x15,    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)
    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 _ZTI7G5x15y2[];
extern void _ZN5E5x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv)();
extern void ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn12_N5E5x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x15y2[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x15y2[0]),
  (VTBL_ENTRY)&_ZN5E5x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G5x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G5x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G5x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G5x15y2[];
extern void _ZN5E5x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x15__7G5x15y2[] = {
  ABISELECT(48,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&_ZN5E5x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv)();
extern void ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn12_N5E5x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C5__5E5x15__7G5x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv)();
static  VTBL_ENTRY _tg__ZTV2B12C5__5E5x15__7G5x15y2[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv),
};
static  VTT_ENTRY vtt_G5x15y2[] = {
  {&(_ZTV7G5x15y2[5]),  5,17},
  {&(_tg__ZTV5E5x15__7G5x15y2[4]),  4,5},
  {&(_tg__ZTV2A12C5__5E5x15__7G5x15y2[3]),  3,4},
  {&(_tg__ZTV2B12C5__5E5x15__7G5x15y2[2]),  2,3},
  {&(_ZTV7G5x15y2[9]),  9,17},
  {&(_ZTV7G5x15y2[12]),  12,17},
  {&(_ZTV7G5x15y2[16]),  16,17},
};
extern VTBL_ENTRY _ZTI7G5x15y2[];
extern  VTBL_ENTRY _ZTV7G5x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x15y2[];
static VTBL_ENTRY alt_thunk_names542[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn12_N5E5x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn12_N5E5x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G5x15y2 = {  "G5x15y2", // class name
  bases_G5x15y2, 6,
  &(vtc_G5x15y2[0]), // expected_vtbl_contents
  &(vtt_G5x15y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G5x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x15y2),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x15y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names542,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x15y3  : virtual E5x15 , virtual F1 {
  int ff;
  ~G5x15y3(); // tgen
  G5x15y3(); // tgen
};
//SIG(1 G5x15y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G5x15y3 ::~G5x15y3(){ note_dtor("G5x15y3", this);} // tgen
G5x15y3 ::G5x15y3(){ note_ctor("G5x15y3", this);} // tgen

static void Test_G5x15y3()
{
  extern Class_Descriptor cd_G5x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G5x15y3, buf);
    G5x15y3 *dp, &lv = *(dp=new (buf) G5x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G5x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x15y3)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,16), "G5x15y3");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,24), "G5x15y3");
    check_base_class_offset(lv, (C5*)(E5x15*), ABISELECT(32,16), "G5x15y3");
    check_base_class_offset(lv, (D0*)(E5x15*), ABISELECT(64,36), "G5x15y3");
    check_base_class_offset(lv, (E5x15*), ABISELECT(16,8), "G5x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(72,40), "G5x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G5x15y3.ff");
    test_class_info(&lv, &cd_G5x15y3);
    dp->~G5x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x15y3(Test_G5x15y3, "G5x15y3", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN7G5x15y3C1Ev();
extern void _ZN7G5x15y3D1Ev();
Name_Map name_map_G5x15y3[] = {
  NSPAIR(_ZN7G5x15y3C1Ev),
  NSPAIR(_ZN7G5x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x15;
extern VTBL_ENTRY _ZTI5E5x15[];
extern  VTBL_ENTRY _ZTV5E5x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x15y3[] = {
  // 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)
    0, //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
    16, //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_E5x15,    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
    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 _ZTI7G5x15y3[];
extern void _ZN5E5x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv)();
extern void ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn8_N5E5x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x15y3[] = {
  ABISELECT(72,40),
  ABISELECT(64,36),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x15y3[0]),
  0,
  ABISELECT(48,28),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G5x15y3[0]),
  (VTBL_ENTRY)&_ZN5E5x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G5x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7G5x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv),
  0,
  ABISELECT(-72,-40),
  (VTBL_ENTRY)&(_ZTI7G5x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G5x15y3[];
extern void _ZN5E5x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x15__7G5x15y3[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&_ZN5E5x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv)();
extern void ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn8_N5E5x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C5__5E5x15__7G5x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv)();
static  VTBL_ENTRY _tg__ZTV2B12C5__5E5x15__7G5x15y3[] = {
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv),
};
static  VTT_ENTRY vtt_G5x15y3[] = {
  {&(_ZTV7G5x15y3[6]),  6,23},
  {&(_ZTV7G5x15y3[11]),  11,23},
  {&(_ZTV7G5x15y3[15]),  15,23},
  {&(_ZTV7G5x15y3[18]),  18,23},
  {&(_ZTV7G5x15y3[22]),  22,23},
  {&(_tg__ZTV5E5x15__7G5x15y3[4]),  4,5},
  {&(_tg__ZTV2A12C5__5E5x15__7G5x15y3[3]),  3,4},
  {&(_tg__ZTV2B12C5__5E5x15__7G5x15y3[2]),  2,3},
};
extern VTBL_ENTRY _ZTI7G5x15y3[];
extern  VTBL_ENTRY _ZTV7G5x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x15y3[];
static VTBL_ENTRY alt_thunk_names543[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn8_N5E5x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn8_N5E5x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G5x15y3 = {  "G5x15y3", // class name
  bases_G5x15y3, 6,
  &(vtc_G5x15y3[0]), // expected_vtbl_contents
  &(vtt_G5x15y3[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI7G5x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x15y3),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x15y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names543,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x15y4  : E5x15 , F0 {
  int ff;
  ~G5x15y4(); // tgen
  G5x15y4(); // tgen
};
//SIG(1 G5x15y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G5x15y4 ::~G5x15y4(){ note_dtor("G5x15y4", this);} // tgen
G5x15y4 ::G5x15y4(){ note_ctor("G5x15y4", this);} // tgen

static void Test_G5x15y4()
{
  extern Class_Descriptor cd_G5x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G5x15y4, buf);
    G5x15y4 *dp, &lv = *(dp=new (buf) G5x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G5x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x15y4)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(24,16), "G5x15y4");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(40,24), "G5x15y4");
    check_base_class_offset(lv, (C5*)(E5x15*), ABISELECT(24,16), "G5x15y4");
    check_base_class_offset(lv, (D0*)(E5x15*), ABISELECT(56,36), "G5x15y4");
    check_base_class_offset(lv, (E5x15*), 0, "G5x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G5x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G5x15y4.ff");
    test_class_info(&lv, &cd_G5x15y4);
    dp->~G5x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x15y4(Test_G5x15y4, "G5x15y4", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G5x15y4C1Ev();
extern void _ZN7G5x15y4D1Ev();
Name_Map name_map_G5x15y4[] = {
  NSPAIR(_ZN7G5x15y4C1Ev),
  NSPAIR(_ZN7G5x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x15;
extern VTBL_ENTRY _ZTI5E5x15[];
extern  VTBL_ENTRY _ZTV5E5x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x15y4[] = {
  // 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)
    0, //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
    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(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_E5x15,    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 _ZTI7G5x15y4[];
extern void _ZN5E5x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv)();
extern void ABISELECT(_ZThn24_N5E5x153fooEv,_ZThn16_N5E5x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv)();
static  VTBL_ENTRY vtc_G5x15y4[] = {
  ABISELECT(56,36),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x15y4[0]),
  (VTBL_ENTRY)&_ZN5E5x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G5x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G5x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv),
};
extern VTBL_ENTRY _ZTV7G5x15y4[];
extern void _ZN5E5x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x15__7G5x15y4[] = {
  ABISELECT(56,36),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&_ZN5E5x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv)();
extern void ABISELECT(_ZThn24_N5E5x153fooEv,_ZThn16_N5E5x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C5__5E5x15__7G5x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv)();
static  VTBL_ENTRY _tg__ZTV2B12C5__5E5x15__7G5x15y4[] = {
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv),
};
static  VTT_ENTRY vtt_G5x15y4[] = {
  {&(_ZTV7G5x15y4[4]),  4,12},
  {&(_tg__ZTV5E5x15__7G5x15y4[4]),  4,5},
  {&(_tg__ZTV2A12C5__5E5x15__7G5x15y4[3]),  3,4},
  {&(_tg__ZTV2B12C5__5E5x15__7G5x15y4[2]),  2,3},
  {&(_ZTV7G5x15y4[8]),  8,12},
  {&(_ZTV7G5x15y4[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G5x15y4[];
extern  VTBL_ENTRY _ZTV7G5x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x15y4[];
static VTBL_ENTRY alt_thunk_names544[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E5x153fooEv,_ZThn16_N5E5x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E5x153fooEv,_ZThn16_N5E5x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G5x15y4 = {  "G5x15y4", // class name
  bases_G5x15y4, 6,
  &(vtc_G5x15y4[0]), // expected_vtbl_contents
  &(vtt_G5x15y4[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G5x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x15y4),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x15y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names544,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x15y5  : virtual E5x15 , F0 {
  int ff;
  ~G5x15y5(); // tgen
  G5x15y5(); // tgen
};
//SIG(1 G5x15y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G5x15y5 ::~G5x15y5(){ note_dtor("G5x15y5", this);} // tgen
G5x15y5 ::G5x15y5(){ note_ctor("G5x15y5", this);} // tgen

static void Test_G5x15y5()
{
  extern Class_Descriptor cd_G5x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G5x15y5, buf);
    G5x15y5 *dp, &lv = *(dp=new (buf) G5x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G5x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x15y5)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,20), "G5x15y5");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,28), "G5x15y5");
    check_base_class_offset(lv, (C5*)(E5x15*), ABISELECT(32,20), "G5x15y5");
    check_base_class_offset(lv, (D0*)(E5x15*), ABISELECT(64,40), "G5x15y5");
    check_base_class_offset(lv, (E5x15*), ABISELECT(16,12), "G5x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G5x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x15y5.ff");
    test_class_info(&lv, &cd_G5x15y5);
    dp->~G5x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x15y5(Test_G5x15y5, "G5x15y5", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G5x15y5C1Ev();
extern void _ZN7G5x15y5D1Ev();
Name_Map name_map_G5x15y5[] = {
  NSPAIR(_ZN7G5x15y5C1Ev),
  NSPAIR(_ZN7G5x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x15;
extern VTBL_ENTRY _ZTI5E5x15[];
extern  VTBL_ENTRY _ZTV5E5x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x15y5[] = {
  // 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)
    0, //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
    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_E5x15,    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 _ZTI7G5x15y5[];
extern void _ZN5E5x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv)();
extern void ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn8_N5E5x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv)();
static  VTBL_ENTRY vtc_G5x15y5[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x15y5[0]),
  0,
  ABISELECT(48,28),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G5x15y5[0]),
  (VTBL_ENTRY)&_ZN5E5x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G5x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G5x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv),
};
extern VTBL_ENTRY _ZTV7G5x15y5[];
extern void _ZN5E5x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x15__7G5x15y5[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&_ZN5E5x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv)();
extern void ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn8_N5E5x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C5__5E5x15__7G5x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv)();
static  VTBL_ENTRY _tg__ZTV2B12C5__5E5x15__7G5x15y5[] = {
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv),
};
static  VTT_ENTRY vtt_G5x15y5[] = {
  {&(_ZTV7G5x15y5[5]),  5,18},
  {&(_ZTV7G5x15y5[10]),  10,18},
  {&(_ZTV7G5x15y5[14]),  14,18},
  {&(_ZTV7G5x15y5[17]),  17,18},
  {&(_tg__ZTV5E5x15__7G5x15y5[4]),  4,5},
  {&(_tg__ZTV2A12C5__5E5x15__7G5x15y5[3]),  3,4},
  {&(_tg__ZTV2B12C5__5E5x15__7G5x15y5[2]),  2,3},
};
extern VTBL_ENTRY _ZTI7G5x15y5[];
extern  VTBL_ENTRY _ZTV7G5x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x15y5[];
static VTBL_ENTRY alt_thunk_names545[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn8_N5E5x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn8_N5E5x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G5x15y5 = {  "G5x15y5", // class name
  bases_G5x15y5, 6,
  &(vtc_G5x15y5[0]), // expected_vtbl_contents
  &(vtt_G5x15y5[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G5x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x15y5),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x15y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names545,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x15y6  : E5x15 , virtual F0 {
  int ff;
  ~G5x15y6(); // tgen
  G5x15y6(); // tgen
};
//SIG(1 G5x15y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G5x15y6 ::~G5x15y6(){ note_dtor("G5x15y6", this);} // tgen
G5x15y6 ::G5x15y6(){ note_ctor("G5x15y6", this);} // tgen

static void Test_G5x15y6()
{
  extern Class_Descriptor cd_G5x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G5x15y6, buf);
    G5x15y6 *dp, &lv = *(dp=new (buf) G5x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G5x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x15y6)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(16,12), "G5x15y6");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(32,20), "G5x15y6");
    check_base_class_offset(lv, (C5*)(E5x15*), ABISELECT(16,12), "G5x15y6");
    check_base_class_offset(lv, (D0*)(E5x15*), ABISELECT(48,32), "G5x15y6");
    check_base_class_offset(lv, (E5x15*), 0, "G5x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G5x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x15y6.ff");
    test_class_info(&lv, &cd_G5x15y6);
    dp->~G5x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x15y6(Test_G5x15y6, "G5x15y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G5x15y6C1Ev();
extern void _ZN7G5x15y6D1Ev();
Name_Map name_map_G5x15y6[] = {
  NSPAIR(_ZN7G5x15y6C1Ev),
  NSPAIR(_ZN7G5x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x15;
extern VTBL_ENTRY _ZTI5E5x15[];
extern  VTBL_ENTRY _ZTV5E5x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x15y6[] = {
  // 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)
    0, //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)
    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_E5x15,    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 _ZTI7G5x15y6[];
extern void _ZN5E5x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv)();
extern void ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn12_N5E5x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv)();
static  VTBL_ENTRY vtc_G5x15y6[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x15y6[0]),
  (VTBL_ENTRY)&_ZN5E5x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G5x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G5x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv),
};
extern VTBL_ENTRY _ZTV7G5x15y6[];
extern void _ZN5E5x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x15__7G5x15y6[] = {
  ABISELECT(48,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&_ZN5E5x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv)();
extern void ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn12_N5E5x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C5__5E5x15__7G5x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv)();
static  VTBL_ENTRY _tg__ZTV2B12C5__5E5x15__7G5x15y6[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv),
};
static  VTT_ENTRY vtt_G5x15y6[] = {
  {&(_ZTV7G5x15y6[5]),  5,13},
  {&(_tg__ZTV5E5x15__7G5x15y6[4]),  4,5},
  {&(_tg__ZTV2A12C5__5E5x15__7G5x15y6[3]),  3,4},
  {&(_tg__ZTV2B12C5__5E5x15__7G5x15y6[2]),  2,3},
  {&(_ZTV7G5x15y6[9]),  9,13},
  {&(_ZTV7G5x15y6[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G5x15y6[];
extern  VTBL_ENTRY _ZTV7G5x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x15y6[];
static VTBL_ENTRY alt_thunk_names546[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn12_N5E5x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn12_N5E5x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G5x15y6 = {  "G5x15y6", // class name
  bases_G5x15y6, 6,
  &(vtc_G5x15y6[0]), // expected_vtbl_contents
  &(vtt_G5x15y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G5x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x15y6),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x15y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names546,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x15y7  : virtual E5x15 , virtual F0 {
  int ff;
  ~G5x15y7(); // tgen
  G5x15y7(); // tgen
};
//SIG(1 G5x15y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G5x15y7 ::~G5x15y7(){ note_dtor("G5x15y7", this);} // tgen
G5x15y7 ::G5x15y7(){ note_ctor("G5x15y7", this);} // tgen

static void Test_G5x15y7()
{
  extern Class_Descriptor cd_G5x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G5x15y7, buf);
    G5x15y7 *dp, &lv = *(dp=new (buf) G5x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G5x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x15y7)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,16), "G5x15y7");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,24), "G5x15y7");
    check_base_class_offset(lv, (C5*)(E5x15*), ABISELECT(32,16), "G5x15y7");
    check_base_class_offset(lv, (D0*)(E5x15*), ABISELECT(64,36), "G5x15y7");
    check_base_class_offset(lv, (E5x15*), ABISELECT(16,8), "G5x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(68,40), "G5x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G5x15y7.ff");
    test_class_info(&lv, &cd_G5x15y7);
    dp->~G5x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x15y7(Test_G5x15y7, "G5x15y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G5x15y7C1Ev();
extern void _ZN7G5x15y7D1Ev();
Name_Map name_map_G5x15y7[] = {
  NSPAIR(_ZN7G5x15y7C1Ev),
  NSPAIR(_ZN7G5x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E5x15;
extern VTBL_ENTRY _ZTI5E5x15[];
extern  VTBL_ENTRY _ZTV5E5x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E5x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x15y7[] = {
  // 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)
    0, //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
    16, //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_E5x15,    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 _ZTI7G5x15y7[];
extern void _ZN5E5x153fooEv();
extern void ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv)();
extern void ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn8_N5E5x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv)();
static  VTBL_ENTRY vtc_G5x15y7[] = {
  ABISELECT(68,40),
  ABISELECT(64,36),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G5x15y7[0]),
  0,
  ABISELECT(48,28),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G5x15y7[0]),
  (VTBL_ENTRY)&_ZN5E5x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G5x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7G5x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv),
};
extern VTBL_ENTRY _ZTV7G5x15y7[];
extern void _ZN5E5x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E5x15__7G5x15y7[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&_ZN5E5x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv)();
extern void ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn8_N5E5x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A12C5__5E5x15__7G5x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv)();
static  VTBL_ENTRY _tg__ZTV2B12C5__5E5x15__7G5x15y7[] = {
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E5x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N5E5x153fooEv,_ZTvn8_n12_N5E5x153fooEv),
};
static  VTT_ENTRY vtt_G5x15y7[] = {
  {&(_ZTV7G5x15y7[6]),  6,19},
  {&(_ZTV7G5x15y7[11]),  11,19},
  {&(_ZTV7G5x15y7[15]),  15,19},
  {&(_ZTV7G5x15y7[18]),  18,19},
  {&(_tg__ZTV5E5x15__7G5x15y7[4]),  4,5},
  {&(_tg__ZTV2A12C5__5E5x15__7G5x15y7[3]),  3,4},
  {&(_tg__ZTV2B12C5__5E5x15__7G5x15y7[2]),  2,3},
};
extern VTBL_ENTRY _ZTI7G5x15y7[];
extern  VTBL_ENTRY _ZTV7G5x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G5x15y7[];
static VTBL_ENTRY alt_thunk_names547[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E5x153fooEv,_ZTv0_n12_N5E5x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn8_N5E5x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E5x153fooEv,_ZThn8_N5E5x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G5x15y7 = {  "G5x15y7", // class name
  bases_G5x15y7, 6,
  &(vtc_G5x15y7[0]), // expected_vtbl_contents
  &(vtt_G5x15y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G5x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G5x15y7),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G5x15y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names547,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E6x15  : virtual C6 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E6x153fooEv
  ~E6x15(); // tgen
  E6x15(); // tgen
};
//SIG(-1 E6x15) C1{ VBC2{ VBC3{ Fi} BC4{ v1 Fi} Fi} VBC5{ Fi} v1 Fi}


void  E6x15 ::foo(){vfunc_called(this, "_ZN5E6x153fooEv");}
E6x15 ::~E6x15(){ note_dtor("E6x15", this);} // tgen
E6x15 ::E6x15(){ note_ctor("E6x15", this);} // tgen

static void Test_E6x15()
{
  extern Class_Descriptor cd_E6x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E6x15, buf);
    E6x15 *dp, &lv = *(dp=new (buf) E6x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E6x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E6x15)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(32,20), "E6x15");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(16,8), "E6x15");
    check_base_class_offset(lv, (C6*), ABISELECT(16,8), "E6x15");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E6x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E6x15.fd");
    test_class_info(&lv, &cd_E6x15);
    dp->~E6x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE6x15(Test_E6x15, "E6x15", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E6x15C1Ev();
extern void _ZN5E6x15D1Ev();
Name_Map name_map_E6x15[] = {
  NSPAIR(_ZN5E6x15C1Ev),
  NSPAIR(_ZN5E6x15D1Ev),
  {0,0}
};
extern Class_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_E6x15[] = {
  // 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
    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_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 _ZTI5E6x15[];
extern void _ZN5E6x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv)();
extern void ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn8_N5E6x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E6x15[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x15[0]),
  (VTBL_ENTRY)&_ZN5E6x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E6x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv),
};
extern VTBL_ENTRY _ZTV5E6x15[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__5E6x15[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E6x15[] = {
  {&(_ZTV5E6x15[5]),  5,11},
  {&(_ZTV5E6x15[10]),  10,11},
  {&(_tg__ZTV2C6__5E6x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E6x15[];
extern  VTBL_ENTRY _ZTV5E6x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x15[];
static VTBL_ENTRY alt_thunk_names548[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn8_N5E6x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E6x15 = {  "E6x15", // class name
  bases_E6x15, 4,
  &(vtc_E6x15[0]), // expected_vtbl_contents
  &(vtt_E6x15[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E6x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E6x15),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E6x15),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names548,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x15y0  : E6x15 , F1 {
  int ff;
  ~G6x15y0(); // tgen
  G6x15y0(); // tgen
};
//SIG(1 G6x15y0) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G6x15y0 ::~G6x15y0(){ note_dtor("G6x15y0", this);} // tgen
G6x15y0 ::G6x15y0(){ note_ctor("G6x15y0", this);} // tgen

static void Test_G6x15y0()
{
  extern Class_Descriptor cd_G6x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G6x15y0, buf);
    G6x15y0 *dp, &lv = *(dp=new (buf) G6x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G6x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x15y0)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,32), "G6x15y0");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,20), "G6x15y0");
    check_base_class_offset(lv, (C6*)(E6x15*), ABISELECT(32,20), "G6x15y0");
    check_base_class_offset(lv, (D0*)(E6x15*), ABISELECT(52,36), "G6x15y0");
    check_base_class_offset(lv, (E6x15*), 0, "G6x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G6x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G6x15y0.ff");
    test_class_info(&lv, &cd_G6x15y0);
    dp->~G6x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x15y0(Test_G6x15y0, "G6x15y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G6x15y0C1Ev();
extern void _ZN7G6x15y0D1Ev();
Name_Map name_map_G6x15y0[] = {
  NSPAIR(_ZN7G6x15y0C1Ev),
  NSPAIR(_ZN7G6x15y0D1Ev),
  {0,0}
};
extern Class_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_E6x15;
extern VTBL_ENTRY _ZTI5E6x15[];
extern  VTBL_ENTRY _ZTV5E6x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x15y0[] = {
  // 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
    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
    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_E6x15,    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
    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 _ZTI7G6x15y0[];
extern void _ZN5E6x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv)();
extern void ABISELECT(_ZThn32_N5E6x153fooEv,_ZThn20_N5E6x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G6x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x15y0[0]),
  (VTBL_ENTRY)&_ZN5E6x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G6x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G6x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv),
};
extern VTBL_ENTRY _ZTV7G6x15y0[];
extern void _ZN5E6x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x15__7G6x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x15[0]),
  (VTBL_ENTRY)&_ZN5E6x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv)();
extern void ABISELECT(_ZThn32_N5E6x153fooEv,_ZThn20_N5E6x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C6__5E6x15__7G6x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E6x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__7G6x15y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x15y0[] = {
  {&(_ZTV7G6x15y0[5]),  5,14},
  {&(_tg__ZTV5E6x15__7G6x15y0[5]),  5,6},
  {&(_tg__ZTV2C6__5E6x15__7G6x15y0[4]),  4,5},
  {&(_ZTV7G6x15y0[13]),  13,14},
  {&(_tg__ZTV2C6__7G6x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x15y0[];
extern  VTBL_ENTRY _ZTV7G6x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x15y0[];
static VTBL_ENTRY alt_thunk_names549[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E6x153fooEv,_ZThn20_N5E6x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E6x153fooEv,_ZThn20_N5E6x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G6x15y0 = {  "G6x15y0", // class name
  bases_G6x15y0, 6,
  &(vtc_G6x15y0[0]), // expected_vtbl_contents
  &(vtt_G6x15y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G6x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x15y0),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x15y0),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names549,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x15y1  : virtual E6x15 , F1 {
  int ff;
  ~G6x15y1(); // tgen
  G6x15y1(); // tgen
};
//SIG(1 G6x15y1) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G6x15y1 ::~G6x15y1(){ note_dtor("G6x15y1", this);} // tgen
G6x15y1 ::G6x15y1(){ note_ctor("G6x15y1", this);} // tgen

static void Test_G6x15y1()
{
  extern Class_Descriptor cd_G6x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G6x15y1, buf);
    G6x15y1 *dp, &lv = *(dp=new (buf) G6x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G6x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x15y1)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,32), "G6x15y1");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,20), "G6x15y1");
    check_base_class_offset(lv, (C6*)(E6x15*), ABISELECT(32,20), "G6x15y1");
    check_base_class_offset(lv, (D0*)(E6x15*), ABISELECT(52,36), "G6x15y1");
    check_base_class_offset(lv, (E6x15*), ABISELECT(16,12), "G6x15y1");
    check_base_class_offset(lv, (F1*), 0, "G6x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x15y1.ff");
    test_class_info(&lv, &cd_G6x15y1);
    dp->~G6x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x15y1(Test_G6x15y1, "G6x15y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G6x15y1C1Ev();
extern void _ZN7G6x15y1D1Ev();
Name_Map name_map_G6x15y1[] = {
  NSPAIR(_ZN7G6x15y1C1Ev),
  NSPAIR(_ZN7G6x15y1D1Ev),
  {0,0}
};
extern Class_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_E6x15;
extern VTBL_ENTRY _ZTI5E6x15[];
extern  VTBL_ENTRY _ZTV5E6x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x15y1[] = {
  // 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
    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
    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_E6x15,    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 _ZTI7G6x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E6x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv)();
extern void ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn8_N5E6x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G6x15y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G6x15y1[0]),
  (VTBL_ENTRY)&_ZN5E6x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G6x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv),
};
extern VTBL_ENTRY _ZTV7G6x15y1[];
extern void _ZN5E6x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x15__7G6x15y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x15[0]),
  (VTBL_ENTRY)&_ZN5E6x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv)();
extern void ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn8_N5E6x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C6__5E6x15__7G6x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E6x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__7G6x15y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x15y1[] = {
  {&(_ZTV7G6x15y1[6]),  6,19},
  {&(_ZTV7G6x15y1[13]),  13,19},
  {&(_ZTV7G6x15y1[18]),  18,19},
  {&(_tg__ZTV5E6x15__7G6x15y1[5]),  5,6},
  {&(_tg__ZTV2C6__5E6x15__7G6x15y1[4]),  4,5},
  {&(_tg__ZTV2C6__7G6x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x15y1[];
extern  VTBL_ENTRY _ZTV7G6x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x15y1[];
static VTBL_ENTRY alt_thunk_names550[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn8_N5E6x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn8_N5E6x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G6x15y1 = {  "G6x15y1", // class name
  bases_G6x15y1, 6,
  &(vtc_G6x15y1[0]), // expected_vtbl_contents
  &(vtt_G6x15y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G6x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x15y1),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x15y1),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names550,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x15y2  : E6x15 , virtual F1 {
  int ff;
  ~G6x15y2(); // tgen
  G6x15y2(); // tgen
};
//SIG(1 G6x15y2) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G6x15y2 ::~G6x15y2(){ note_dtor("G6x15y2", this);} // tgen
G6x15y2 ::G6x15y2(){ note_ctor("G6x15y2", this);} // tgen

static void Test_G6x15y2()
{
  extern Class_Descriptor cd_G6x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G6x15y2, buf);
    G6x15y2 *dp, &lv = *(dp=new (buf) G6x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G6x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x15y2)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(32,24), "G6x15y2");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(16,12), "G6x15y2");
    check_base_class_offset(lv, (C6*)(E6x15*), ABISELECT(16,12), "G6x15y2");
    check_base_class_offset(lv, (D0*)(E6x15*), ABISELECT(36,28), "G6x15y2");
    check_base_class_offset(lv, (E6x15*), 0, "G6x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G6x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x15y2.ff");
    test_class_info(&lv, &cd_G6x15y2);
    dp->~G6x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x15y2(Test_G6x15y2, "G6x15y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G6x15y2C1Ev();
extern void _ZN7G6x15y2D1Ev();
Name_Map name_map_G6x15y2[] = {
  NSPAIR(_ZN7G6x15y2C1Ev),
  NSPAIR(_ZN7G6x15y2D1Ev),
  {0,0}
};
extern Class_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_E6x15;
extern VTBL_ENTRY _ZTI5E6x15[];
extern  VTBL_ENTRY _ZTV5E6x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x15y2[] = {
  // 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
    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
    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_E6x15,    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
    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
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G6x15y2[];
extern void _ZN5E6x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv)();
extern void ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn12_N5E6x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x15y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x15y2[0]),
  (VTBL_ENTRY)&_ZN5E6x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G6x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G6x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G6x15y2[];
extern void _ZN5E6x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x15__7G6x15y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x15[0]),
  (VTBL_ENTRY)&_ZN5E6x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv)();
extern void ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn12_N5E6x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C6__5E6x15__7G6x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E6x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__7G6x15y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x15y2[] = {
  {&(_ZTV7G6x15y2[6]),  6,16},
  {&(_tg__ZTV5E6x15__7G6x15y2[5]),  5,6},
  {&(_tg__ZTV2C6__5E6x15__7G6x15y2[4]),  4,5},
  {&(_ZTV7G6x15y2[11]),  11,16},
  {&(_ZTV7G6x15y2[15]),  15,16},
  {&(_tg__ZTV2C6__7G6x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x15y2[];
extern  VTBL_ENTRY _ZTV7G6x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x15y2[];
static VTBL_ENTRY alt_thunk_names551[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn12_N5E6x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn12_N5E6x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G6x15y2 = {  "G6x15y2", // class name
  bases_G6x15y2, 6,
  &(vtc_G6x15y2[0]), // expected_vtbl_contents
  &(vtt_G6x15y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G6x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x15y2),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x15y2),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names551,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x15y3  : virtual E6x15 , virtual F1 {
  int ff;
  ~G6x15y3(); // tgen
  G6x15y3(); // tgen
};
//SIG(1 G6x15y3) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G6x15y3 ::~G6x15y3(){ note_dtor("G6x15y3", this);} // tgen
G6x15y3 ::G6x15y3(){ note_ctor("G6x15y3", this);} // tgen

static void Test_G6x15y3()
{
  extern Class_Descriptor cd_G6x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G6x15y3, buf);
    G6x15y3 *dp, &lv = *(dp=new (buf) G6x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G6x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x15y3)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,28), "G6x15y3");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,16), "G6x15y3");
    check_base_class_offset(lv, (C6*)(E6x15*), ABISELECT(32,16), "G6x15y3");
    check_base_class_offset(lv, (D0*)(E6x15*), ABISELECT(52,32), "G6x15y3");
    check_base_class_offset(lv, (E6x15*), ABISELECT(16,8), "G6x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G6x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G6x15y3.ff");
    test_class_info(&lv, &cd_G6x15y3);
    dp->~G6x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x15y3(Test_G6x15y3, "G6x15y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G6x15y3C1Ev();
extern void _ZN7G6x15y3D1Ev();
Name_Map name_map_G6x15y3[] = {
  NSPAIR(_ZN7G6x15y3C1Ev),
  NSPAIR(_ZN7G6x15y3D1Ev),
  {0,0}
};
extern Class_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_E6x15;
extern VTBL_ENTRY _ZTI5E6x15[];
extern  VTBL_ENTRY _ZTV5E6x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x15y3[] = {
  // 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
    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
    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_E6x15,    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
    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G6x15y3[];
extern void _ZN5E6x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv)();
extern void ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn8_N5E6x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x15y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x15y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G6x15y3[0]),
  (VTBL_ENTRY)&_ZN5E6x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G6x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G6x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G6x15y3[];
extern void _ZN5E6x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x15__7G6x15y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x15[0]),
  (VTBL_ENTRY)&_ZN5E6x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv)();
extern void ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn8_N5E6x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C6__5E6x15__7G6x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E6x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__7G6x15y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x15y3[] = {
  {&(_ZTV7G6x15y3[7]),  7,23},
  {&(_ZTV7G6x15y3[13]),  13,23},
  {&(_ZTV7G6x15y3[18]),  18,23},
  {&(_ZTV7G6x15y3[22]),  22,23},
  {&(_tg__ZTV5E6x15__7G6x15y3[5]),  5,6},
  {&(_tg__ZTV2C6__5E6x15__7G6x15y3[4]),  4,5},
  {&(_tg__ZTV2C6__7G6x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x15y3[];
extern  VTBL_ENTRY _ZTV7G6x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x15y3[];
static VTBL_ENTRY alt_thunk_names552[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn8_N5E6x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn8_N5E6x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G6x15y3 = {  "G6x15y3", // class name
  bases_G6x15y3, 6,
  &(vtc_G6x15y3[0]), // expected_vtbl_contents
  &(vtt_G6x15y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G6x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x15y3),23, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x15y3),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names552,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x15y4  : E6x15 , F0 {
  int ff;
  ~G6x15y4(); // tgen
  G6x15y4(); // tgen
};
//SIG(1 G6x15y4) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G6x15y4 ::~G6x15y4(){ note_dtor("G6x15y4", this);} // tgen
G6x15y4 ::G6x15y4(){ note_ctor("G6x15y4", this);} // tgen

static void Test_G6x15y4()
{
  extern Class_Descriptor cd_G6x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x15y4, buf);
    G6x15y4 *dp, &lv = *(dp=new (buf) G6x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x15y4)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(40,28), "G6x15y4");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(24,16), "G6x15y4");
    check_base_class_offset(lv, (C6*)(E6x15*), ABISELECT(24,16), "G6x15y4");
    check_base_class_offset(lv, (D0*)(E6x15*), ABISELECT(44,32), "G6x15y4");
    check_base_class_offset(lv, (E6x15*), 0, "G6x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G6x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G6x15y4.ff");
    test_class_info(&lv, &cd_G6x15y4);
    dp->~G6x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x15y4(Test_G6x15y4, "G6x15y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G6x15y4C1Ev();
extern void _ZN7G6x15y4D1Ev();
Name_Map name_map_G6x15y4[] = {
  NSPAIR(_ZN7G6x15y4C1Ev),
  NSPAIR(_ZN7G6x15y4D1Ev),
  {0,0}
};
extern Class_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_E6x15;
extern VTBL_ENTRY _ZTI5E6x15[];
extern  VTBL_ENTRY _ZTV5E6x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x15y4[] = {
  // 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
    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(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_E6x15,    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 _ZTI7G6x15y4[];
extern void _ZN5E6x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv)();
extern void ABISELECT(_ZThn24_N5E6x153fooEv,_ZThn16_N5E6x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G6x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x15y4[0]),
  (VTBL_ENTRY)&_ZN5E6x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G6x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv),
};
extern VTBL_ENTRY _ZTV7G6x15y4[];
extern void _ZN5E6x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x15__7G6x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x15[0]),
  (VTBL_ENTRY)&_ZN5E6x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv)();
extern void ABISELECT(_ZThn24_N5E6x153fooEv,_ZThn16_N5E6x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C6__5E6x15__7G6x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E6x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__7G6x15y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x15y4[] = {
  {&(_ZTV7G6x15y4[5]),  5,11},
  {&(_tg__ZTV5E6x15__7G6x15y4[5]),  5,6},
  {&(_tg__ZTV2C6__5E6x15__7G6x15y4[4]),  4,5},
  {&(_ZTV7G6x15y4[10]),  10,11},
  {&(_tg__ZTV2C6__7G6x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x15y4[];
extern  VTBL_ENTRY _ZTV7G6x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x15y4[];
static VTBL_ENTRY alt_thunk_names553[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E6x153fooEv,_ZThn16_N5E6x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E6x153fooEv,_ZThn16_N5E6x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G6x15y4 = {  "G6x15y4", // class name
  bases_G6x15y4, 6,
  &(vtc_G6x15y4[0]), // expected_vtbl_contents
  &(vtt_G6x15y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G6x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x15y4),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x15y4),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names553,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x15y5  : virtual E6x15 , F0 {
  int ff;
  ~G6x15y5(); // tgen
  G6x15y5(); // tgen
};
//SIG(1 G6x15y5) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G6x15y5 ::~G6x15y5(){ note_dtor("G6x15y5", this);} // tgen
G6x15y5 ::G6x15y5(){ note_ctor("G6x15y5", this);} // tgen

static void Test_G6x15y5()
{
  extern Class_Descriptor cd_G6x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G6x15y5, buf);
    G6x15y5 *dp, &lv = *(dp=new (buf) G6x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G6x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x15y5)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,32), "G6x15y5");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,20), "G6x15y5");
    check_base_class_offset(lv, (C6*)(E6x15*), ABISELECT(32,20), "G6x15y5");
    check_base_class_offset(lv, (D0*)(E6x15*), ABISELECT(52,36), "G6x15y5");
    check_base_class_offset(lv, (E6x15*), ABISELECT(16,12), "G6x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G6x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x15y5.ff");
    test_class_info(&lv, &cd_G6x15y5);
    dp->~G6x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x15y5(Test_G6x15y5, "G6x15y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G6x15y5C1Ev();
extern void _ZN7G6x15y5D1Ev();
Name_Map name_map_G6x15y5[] = {
  NSPAIR(_ZN7G6x15y5C1Ev),
  NSPAIR(_ZN7G6x15y5D1Ev),
  {0,0}
};
extern Class_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_E6x15;
extern VTBL_ENTRY _ZTI5E6x15[];
extern  VTBL_ENTRY _ZTV5E6x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x15y5[] = {
  // 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
    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
    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_E6x15,    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 _ZTI7G6x15y5[];
extern void _ZN5E6x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv)();
extern void ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn8_N5E6x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G6x15y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x15y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G6x15y5[0]),
  (VTBL_ENTRY)&_ZN5E6x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G6x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv),
};
extern VTBL_ENTRY _ZTV7G6x15y5[];
extern void _ZN5E6x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x15__7G6x15y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x15[0]),
  (VTBL_ENTRY)&_ZN5E6x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv)();
extern void ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn8_N5E6x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C6__5E6x15__7G6x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E6x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__7G6x15y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x15y5[] = {
  {&(_ZTV7G6x15y5[6]),  6,18},
  {&(_ZTV7G6x15y5[12]),  12,18},
  {&(_ZTV7G6x15y5[17]),  17,18},
  {&(_tg__ZTV5E6x15__7G6x15y5[5]),  5,6},
  {&(_tg__ZTV2C6__5E6x15__7G6x15y5[4]),  4,5},
  {&(_tg__ZTV2C6__7G6x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x15y5[];
extern  VTBL_ENTRY _ZTV7G6x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x15y5[];
static VTBL_ENTRY alt_thunk_names554[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn8_N5E6x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn8_N5E6x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G6x15y5 = {  "G6x15y5", // class name
  bases_G6x15y5, 6,
  &(vtc_G6x15y5[0]), // expected_vtbl_contents
  &(vtt_G6x15y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G6x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x15y5),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x15y5),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names554,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x15y6  : E6x15 , virtual F0 {
  int ff;
  ~G6x15y6(); // tgen
  G6x15y6(); // tgen
};
//SIG(1 G6x15y6) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G6x15y6 ::~G6x15y6(){ note_dtor("G6x15y6", this);} // tgen
G6x15y6 ::G6x15y6(){ note_ctor("G6x15y6", this);} // tgen

static void Test_G6x15y6()
{
  extern Class_Descriptor cd_G6x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x15y6, buf);
    G6x15y6 *dp, &lv = *(dp=new (buf) G6x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x15y6)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(32,24), "G6x15y6");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(16,12), "G6x15y6");
    check_base_class_offset(lv, (C6*)(E6x15*), ABISELECT(16,12), "G6x15y6");
    check_base_class_offset(lv, (D0*)(E6x15*), ABISELECT(36,28), "G6x15y6");
    check_base_class_offset(lv, (E6x15*), 0, "G6x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G6x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x15y6.ff");
    test_class_info(&lv, &cd_G6x15y6);
    dp->~G6x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x15y6(Test_G6x15y6, "G6x15y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G6x15y6C1Ev();
extern void _ZN7G6x15y6D1Ev();
Name_Map name_map_G6x15y6[] = {
  NSPAIR(_ZN7G6x15y6C1Ev),
  NSPAIR(_ZN7G6x15y6D1Ev),
  {0,0}
};
extern Class_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_E6x15;
extern VTBL_ENTRY _ZTI5E6x15[];
extern  VTBL_ENTRY _ZTV5E6x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x15y6[] = {
  // 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
    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(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_E6x15,    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 _ZTI7G6x15y6[];
extern void _ZN5E6x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv)();
extern void ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn12_N5E6x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G6x15y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x15y6[0]),
  (VTBL_ENTRY)&_ZN5E6x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G6x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv),
};
extern VTBL_ENTRY _ZTV7G6x15y6[];
extern void _ZN5E6x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x15__7G6x15y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x15[0]),
  (VTBL_ENTRY)&_ZN5E6x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv)();
extern void ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn12_N5E6x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C6__5E6x15__7G6x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E6x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__7G6x15y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x15y6[] = {
  {&(_ZTV7G6x15y6[6]),  6,12},
  {&(_tg__ZTV5E6x15__7G6x15y6[5]),  5,6},
  {&(_tg__ZTV2C6__5E6x15__7G6x15y6[4]),  4,5},
  {&(_ZTV7G6x15y6[11]),  11,12},
  {&(_tg__ZTV2C6__7G6x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x15y6[];
extern  VTBL_ENTRY _ZTV7G6x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x15y6[];
static VTBL_ENTRY alt_thunk_names555[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn12_N5E6x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn12_N5E6x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G6x15y6 = {  "G6x15y6", // class name
  bases_G6x15y6, 6,
  &(vtc_G6x15y6[0]), // expected_vtbl_contents
  &(vtt_G6x15y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G6x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x15y6),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x15y6),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names555,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x15y7  : virtual E6x15 , virtual F0 {
  int ff;
  ~G6x15y7(); // tgen
  G6x15y7(); // tgen
};
//SIG(1 G6x15y7) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G6x15y7 ::~G6x15y7(){ note_dtor("G6x15y7", this);} // tgen
G6x15y7 ::G6x15y7(){ note_ctor("G6x15y7", this);} // tgen

static void Test_G6x15y7()
{
  extern Class_Descriptor cd_G6x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G6x15y7, buf);
    G6x15y7 *dp, &lv = *(dp=new (buf) G6x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G6x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x15y7)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,28), "G6x15y7");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,16), "G6x15y7");
    check_base_class_offset(lv, (C6*)(E6x15*), ABISELECT(32,16), "G6x15y7");
    check_base_class_offset(lv, (D0*)(E6x15*), ABISELECT(52,32), "G6x15y7");
    check_base_class_offset(lv, (E6x15*), ABISELECT(16,8), "G6x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G6x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G6x15y7.ff");
    test_class_info(&lv, &cd_G6x15y7);
    dp->~G6x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x15y7(Test_G6x15y7, "G6x15y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G6x15y7C1Ev();
extern void _ZN7G6x15y7D1Ev();
Name_Map name_map_G6x15y7[] = {
  NSPAIR(_ZN7G6x15y7C1Ev),
  NSPAIR(_ZN7G6x15y7D1Ev),
  {0,0}
};
extern Class_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_E6x15;
extern VTBL_ENTRY _ZTI5E6x15[];
extern  VTBL_ENTRY _ZTV5E6x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E6x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x15y7[] = {
  // 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
    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
    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_E6x15,    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 _ZTI7G6x15y7[];
extern void _ZN5E6x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv)();
extern void ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn8_N5E6x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G6x15y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G6x15y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G6x15y7[0]),
  (VTBL_ENTRY)&_ZN5E6x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G6x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv),
};
extern VTBL_ENTRY _ZTV7G6x15y7[];
extern void _ZN5E6x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E6x15__7G6x15y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E6x15[0]),
  (VTBL_ENTRY)&_ZN5E6x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv)();
extern void ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn8_N5E6x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C6__5E6x15__7G6x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E6x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__7G6x15y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x15y7[] = {
  {&(_ZTV7G6x15y7[7]),  7,19},
  {&(_ZTV7G6x15y7[13]),  13,19},
  {&(_ZTV7G6x15y7[18]),  18,19},
  {&(_tg__ZTV5E6x15__7G6x15y7[5]),  5,6},
  {&(_tg__ZTV2C6__5E6x15__7G6x15y7[4]),  4,5},
  {&(_tg__ZTV2C6__7G6x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G6x15y7[];
extern  VTBL_ENTRY _ZTV7G6x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G6x15y7[];
static VTBL_ENTRY alt_thunk_names556[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E6x153fooEv,_ZTv0_n16_N5E6x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn8_N5E6x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E6x153fooEv,_ZThn8_N5E6x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G6x15y7 = {  "G6x15y7", // class name
  bases_G6x15y7, 6,
  &(vtc_G6x15y7[0]), // expected_vtbl_contents
  &(vtt_G6x15y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G6x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G6x15y7),19, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G6x15y7),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names556,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E7x15  : virtual C7 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E7x153fooEv
  ~E7x15(); // tgen
  E7x15(); // tgen
};
//SIG(-1 E7x15) C1{ VBC2{ VBC3{ v1 Fi} BC4{ v1 Fi} Fi} VBC5{ Fi} v1 Fi}


void  E7x15 ::foo(){vfunc_called(this, "_ZN5E7x153fooEv");}
E7x15 ::~E7x15(){ note_dtor("E7x15", this);} // tgen
E7x15 ::E7x15(){ note_ctor("E7x15", this);} // tgen

static void Test_E7x15()
{
  extern Class_Descriptor cd_E7x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E7x15, buf);
    E7x15 *dp, &lv = *(dp=new (buf) E7x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E7x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E7x15)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(32,20), "E7x15");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(16,8), "E7x15");
    check_base_class_offset(lv, (C7*), ABISELECT(16,8), "E7x15");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E7x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E7x15.fd");
    test_class_info(&lv, &cd_E7x15);
    dp->~E7x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE7x15(Test_E7x15, "E7x15", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E7x15C1Ev();
extern void _ZN5E7x15D1Ev();
Name_Map name_map_E7x15[] = {
  NSPAIR(_ZN5E7x15C1Ev),
  NSPAIR(_ZN5E7x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x15[] = {
  // 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(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
    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_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 _ZTI5E7x15[];
extern void _ZN5E7x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv)();
extern void ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn8_N5E7x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv)();
extern void ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E7x15[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&_ZN5E7x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv),
};
extern VTBL_ENTRY _ZTV5E7x15[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__5E7x15[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__5E7x15[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E7x15[] = {
  {&(_ZTV5E7x15[5]),  5,15},
  {&(_ZTV5E7x15[10]),  10,15},
  {&(_ZTV5E7x15[14]),  14,15},
  {&(_tg__ZTV2C7__5E7x15[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__5E7x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E7x15[];
extern  VTBL_ENTRY _ZTV5E7x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x15[];
static VTBL_ENTRY alt_thunk_names557[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn8_N5E7x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E7x15 = {  "E7x15", // class name
  bases_E7x15, 4,
  &(vtc_E7x15[0]), // expected_vtbl_contents
  &(vtt_E7x15[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E7x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E7x15),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E7x15),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names557,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x15y0  : E7x15 , F1 {
  int ff;
  ~G7x15y0(); // tgen
  G7x15y0(); // tgen
};
//SIG(1 G7x15y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G7x15y0 ::~G7x15y0(){ note_dtor("G7x15y0", this);} // tgen
G7x15y0 ::G7x15y0(){ note_ctor("G7x15y0", this);} // tgen

static void Test_G7x15y0()
{
  extern Class_Descriptor cd_G7x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G7x15y0, buf);
    G7x15y0 *dp, &lv = *(dp=new (buf) G7x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G7x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x15y0)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,32), "G7x15y0");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,20), "G7x15y0");
    check_base_class_offset(lv, (C7*)(E7x15*), ABISELECT(32,20), "G7x15y0");
    check_base_class_offset(lv, (D0*)(E7x15*), ABISELECT(60,40), "G7x15y0");
    check_base_class_offset(lv, (E7x15*), 0, "G7x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G7x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G7x15y0.ff");
    test_class_info(&lv, &cd_G7x15y0);
    dp->~G7x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x15y0(Test_G7x15y0, "G7x15y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G7x15y0C1Ev();
extern void _ZN7G7x15y0D1Ev();
Name_Map name_map_G7x15y0[] = {
  NSPAIR(_ZN7G7x15y0C1Ev),
  NSPAIR(_ZN7G7x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x15;
extern VTBL_ENTRY _ZTI5E7x15[];
extern  VTBL_ENTRY _ZTV5E7x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x15y0[] = {
  // 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_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
    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
    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_E7x15,    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
    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 _ZTI7G7x15y0[];
extern void _ZN5E7x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv)();
extern void ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv)();
extern void ABISELECT(_ZThn48_N5E7x153fooEv,_ZThn32_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x15y0[0]),
  (VTBL_ENTRY)&_ZN5E7x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G7x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G7x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G7x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv),
};
extern VTBL_ENTRY _ZTV7G7x15y0[];
extern void _ZN5E7x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x15__7G7x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&_ZN5E7x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv)();
extern void ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C7__5E7x15__7G7x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv)();
extern void ABISELECT(_ZThn48_N5E7x153fooEv,_ZThn32_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x15__7G7x15y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__7G7x15y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__7G7x15y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x15y0[] = {
  {&(_ZTV7G7x15y0[5]),  5,18},
  {&(_tg__ZTV5E7x15__7G7x15y0[5]),  5,6},
  {&(_tg__ZTV2C7__5E7x15__7G7x15y0[4]),  4,5},
  {&(_tg__ZTV2A1__5E7x15__7G7x15y0[3]),  3,4},
  {&(_ZTV7G7x15y0[13]),  13,18},
  {&(_ZTV7G7x15y0[17]),  17,18},
  {&(_tg__ZTV2C7__7G7x15y0[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__7G7x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x15y0[];
extern  VTBL_ENTRY _ZTV7G7x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x15y0[];
static VTBL_ENTRY alt_thunk_names558[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N5E7x153fooEv,_ZThn32_N5E7x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N5E7x153fooEv,_ZThn32_N5E7x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x15y0 = {  "G7x15y0", // class name
  bases_G7x15y0, 6,
  &(vtc_G7x15y0[0]), // expected_vtbl_contents
  &(vtt_G7x15y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G7x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x15y0),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x15y0),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names558,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x15y1  : virtual E7x15 , F1 {
  int ff;
  ~G7x15y1(); // tgen
  G7x15y1(); // tgen
};
//SIG(1 G7x15y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G7x15y1 ::~G7x15y1(){ note_dtor("G7x15y1", this);} // tgen
G7x15y1 ::G7x15y1(){ note_ctor("G7x15y1", this);} // tgen

static void Test_G7x15y1()
{
  extern Class_Descriptor cd_G7x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G7x15y1, buf);
    G7x15y1 *dp, &lv = *(dp=new (buf) G7x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G7x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x15y1)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,32), "G7x15y1");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,20), "G7x15y1");
    check_base_class_offset(lv, (C7*)(E7x15*), ABISELECT(32,20), "G7x15y1");
    check_base_class_offset(lv, (D0*)(E7x15*), ABISELECT(60,40), "G7x15y1");
    check_base_class_offset(lv, (E7x15*), ABISELECT(16,12), "G7x15y1");
    check_base_class_offset(lv, (F1*), 0, "G7x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x15y1.ff");
    test_class_info(&lv, &cd_G7x15y1);
    dp->~G7x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x15y1(Test_G7x15y1, "G7x15y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G7x15y1C1Ev();
extern void _ZN7G7x15y1D1Ev();
Name_Map name_map_G7x15y1[] = {
  NSPAIR(_ZN7G7x15y1C1Ev),
  NSPAIR(_ZN7G7x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x15;
extern VTBL_ENTRY _ZTI5E7x15[];
extern  VTBL_ENTRY _ZTV5E7x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x15y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    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_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
    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
    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_E7x15,    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 _ZTI7G7x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E7x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv)();
extern void ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn8_N5E7x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv)();
extern void ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x15y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G7x15y1[0]),
  (VTBL_ENTRY)&_ZN5E7x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G7x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G7x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv),
};
extern VTBL_ENTRY _ZTV7G7x15y1[];
extern void _ZN5E7x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x15__7G7x15y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&_ZN5E7x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv)();
extern void ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn8_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C7__5E7x15__7G7x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv)();
extern void ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x15__7G7x15y1[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__7G7x15y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__7G7x15y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x15y1[] = {
  {&(_ZTV7G7x15y1[6]),  6,23},
  {&(_ZTV7G7x15y1[13]),  13,23},
  {&(_ZTV7G7x15y1[18]),  18,23},
  {&(_ZTV7G7x15y1[22]),  22,23},
  {&(_tg__ZTV5E7x15__7G7x15y1[5]),  5,6},
  {&(_tg__ZTV2C7__5E7x15__7G7x15y1[4]),  4,5},
  {&(_tg__ZTV2A1__5E7x15__7G7x15y1[3]),  3,4},
  {&(_tg__ZTV2C7__7G7x15y1[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__7G7x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x15y1[];
extern  VTBL_ENTRY _ZTV7G7x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x15y1[];
static VTBL_ENTRY alt_thunk_names559[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn8_N5E7x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn8_N5E7x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x15y1 = {  "G7x15y1", // class name
  bases_G7x15y1, 6,
  &(vtc_G7x15y1[0]), // expected_vtbl_contents
  &(vtt_G7x15y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G7x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x15y1),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x15y1),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names559,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x15y2  : E7x15 , virtual F1 {
  int ff;
  ~G7x15y2(); // tgen
  G7x15y2(); // tgen
};
//SIG(1 G7x15y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G7x15y2 ::~G7x15y2(){ note_dtor("G7x15y2", this);} // tgen
G7x15y2 ::G7x15y2(){ note_ctor("G7x15y2", this);} // tgen

static void Test_G7x15y2()
{
  extern Class_Descriptor cd_G7x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G7x15y2, buf);
    G7x15y2 *dp, &lv = *(dp=new (buf) G7x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G7x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x15y2)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(32,24), "G7x15y2");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(16,12), "G7x15y2");
    check_base_class_offset(lv, (C7*)(E7x15*), ABISELECT(16,12), "G7x15y2");
    check_base_class_offset(lv, (D0*)(E7x15*), ABISELECT(44,32), "G7x15y2");
    check_base_class_offset(lv, (E7x15*), 0, "G7x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G7x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x15y2.ff");
    test_class_info(&lv, &cd_G7x15y2);
    dp->~G7x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x15y2(Test_G7x15y2, "G7x15y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G7x15y2C1Ev();
extern void _ZN7G7x15y2D1Ev();
Name_Map name_map_G7x15y2[] = {
  NSPAIR(_ZN7G7x15y2C1Ev),
  NSPAIR(_ZN7G7x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x15;
extern VTBL_ENTRY _ZTI5E7x15[];
extern  VTBL_ENTRY _ZTV5E7x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x15y2[] = {
  // 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)
    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
    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
    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_E7x15,    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
    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G7x15y2[];
extern void _ZN5E7x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv)();
extern void ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn12_N5E7x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv)();
extern void ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn24_N5E7x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G7x15y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x15y2[0]),
  (VTBL_ENTRY)&_ZN5E7x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G7x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G7x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G7x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G7x15y2[];
extern void _ZN5E7x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x15__7G7x15y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&_ZN5E7x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv)();
extern void ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn12_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C7__5E7x15__7G7x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv)();
extern void ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn24_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x15__7G7x15y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__7G7x15y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__7G7x15y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x15y2[] = {
  {&(_ZTV7G7x15y2[6]),  6,20},
  {&(_tg__ZTV5E7x15__7G7x15y2[5]),  5,6},
  {&(_tg__ZTV2C7__5E7x15__7G7x15y2[4]),  4,5},
  {&(_tg__ZTV2A1__5E7x15__7G7x15y2[3]),  3,4},
  {&(_ZTV7G7x15y2[11]),  11,20},
  {&(_ZTV7G7x15y2[15]),  15,20},
  {&(_ZTV7G7x15y2[19]),  19,20},
  {&(_tg__ZTV2C7__7G7x15y2[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__7G7x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x15y2[];
extern  VTBL_ENTRY _ZTV7G7x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x15y2[];
static VTBL_ENTRY alt_thunk_names560[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn24_N5E7x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn24_N5E7x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn12_N5E7x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn12_N5E7x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x15y2 = {  "G7x15y2", // class name
  bases_G7x15y2, 6,
  &(vtc_G7x15y2[0]), // expected_vtbl_contents
  &(vtt_G7x15y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G7x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x15y2),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x15y2),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names560,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x15y3  : virtual E7x15 , virtual F1 {
  int ff;
  ~G7x15y3(); // tgen
  G7x15y3(); // tgen
};
//SIG(1 G7x15y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G7x15y3 ::~G7x15y3(){ note_dtor("G7x15y3", this);} // tgen
G7x15y3 ::G7x15y3(){ note_ctor("G7x15y3", this);} // tgen

static void Test_G7x15y3()
{
  extern Class_Descriptor cd_G7x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G7x15y3, buf);
    G7x15y3 *dp, &lv = *(dp=new (buf) G7x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G7x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x15y3)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,28), "G7x15y3");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,16), "G7x15y3");
    check_base_class_offset(lv, (C7*)(E7x15*), ABISELECT(32,16), "G7x15y3");
    check_base_class_offset(lv, (D0*)(E7x15*), ABISELECT(60,36), "G7x15y3");
    check_base_class_offset(lv, (E7x15*), ABISELECT(16,8), "G7x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G7x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G7x15y3.ff");
    test_class_info(&lv, &cd_G7x15y3);
    dp->~G7x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x15y3(Test_G7x15y3, "G7x15y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G7x15y3C1Ev();
extern void _ZN7G7x15y3D1Ev();
Name_Map name_map_G7x15y3[] = {
  NSPAIR(_ZN7G7x15y3C1Ev),
  NSPAIR(_ZN7G7x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x15;
extern VTBL_ENTRY _ZTI5E7x15[];
extern  VTBL_ENTRY _ZTV5E7x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x15y3[] = {
  // 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(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
    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
    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_E7x15,    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
    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
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G7x15y3[];
extern void _ZN5E7x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv)();
extern void ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn8_N5E7x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv)();
extern void ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G7x15y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x15y3[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G7x15y3[0]),
  (VTBL_ENTRY)&_ZN5E7x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G7x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G7x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G7x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G7x15y3[];
extern void _ZN5E7x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x15__7G7x15y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&_ZN5E7x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv)();
extern void ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn8_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C7__5E7x15__7G7x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv)();
extern void ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x15__7G7x15y3[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__7G7x15y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__7G7x15y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x15y3[] = {
  {&(_ZTV7G7x15y3[7]),  7,27},
  {&(_ZTV7G7x15y3[13]),  13,27},
  {&(_ZTV7G7x15y3[18]),  18,27},
  {&(_ZTV7G7x15y3[22]),  22,27},
  {&(_ZTV7G7x15y3[26]),  26,27},
  {&(_tg__ZTV5E7x15__7G7x15y3[5]),  5,6},
  {&(_tg__ZTV2C7__5E7x15__7G7x15y3[4]),  4,5},
  {&(_tg__ZTV2A1__5E7x15__7G7x15y3[3]),  3,4},
  {&(_tg__ZTV2C7__7G7x15y3[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__7G7x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x15y3[];
extern  VTBL_ENTRY _ZTV7G7x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x15y3[];
static VTBL_ENTRY alt_thunk_names561[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn8_N5E7x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn8_N5E7x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x15y3 = {  "G7x15y3", // class name
  bases_G7x15y3, 6,
  &(vtc_G7x15y3[0]), // expected_vtbl_contents
  &(vtt_G7x15y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G7x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x15y3),27, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x15y3),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names561,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x15y4  : E7x15 , F0 {
  int ff;
  ~G7x15y4(); // tgen
  G7x15y4(); // tgen
};
//SIG(1 G7x15y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G7x15y4 ::~G7x15y4(){ note_dtor("G7x15y4", this);} // tgen
G7x15y4 ::G7x15y4(){ note_ctor("G7x15y4", this);} // tgen

static void Test_G7x15y4()
{
  extern Class_Descriptor cd_G7x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x15y4, buf);
    G7x15y4 *dp, &lv = *(dp=new (buf) G7x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x15y4)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(40,28), "G7x15y4");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(24,16), "G7x15y4");
    check_base_class_offset(lv, (C7*)(E7x15*), ABISELECT(24,16), "G7x15y4");
    check_base_class_offset(lv, (D0*)(E7x15*), ABISELECT(52,36), "G7x15y4");
    check_base_class_offset(lv, (E7x15*), 0, "G7x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G7x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G7x15y4.ff");
    test_class_info(&lv, &cd_G7x15y4);
    dp->~G7x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x15y4(Test_G7x15y4, "G7x15y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G7x15y4C1Ev();
extern void _ZN7G7x15y4D1Ev();
Name_Map name_map_G7x15y4[] = {
  NSPAIR(_ZN7G7x15y4C1Ev),
  NSPAIR(_ZN7G7x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x15;
extern VTBL_ENTRY _ZTI5E7x15[];
extern  VTBL_ENTRY _ZTV5E7x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x15y4[] = {
  // 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_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
    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(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_E7x15,    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 _ZTI7G7x15y4[];
extern void _ZN5E7x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv)();
extern void ABISELECT(_ZThn24_N5E7x153fooEv,_ZThn16_N5E7x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv)();
extern void ABISELECT(_ZThn40_N5E7x153fooEv,_ZThn28_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x15y4[0]),
  (VTBL_ENTRY)&_ZN5E7x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G7x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G7x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv),
};
extern VTBL_ENTRY _ZTV7G7x15y4[];
extern void _ZN5E7x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x15__7G7x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&_ZN5E7x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv)();
extern void ABISELECT(_ZThn24_N5E7x153fooEv,_ZThn16_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C7__5E7x15__7G7x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv)();
extern void ABISELECT(_ZThn40_N5E7x153fooEv,_ZThn28_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x15__7G7x15y4[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__7G7x15y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__7G7x15y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x15y4[] = {
  {&(_ZTV7G7x15y4[5]),  5,15},
  {&(_tg__ZTV5E7x15__7G7x15y4[5]),  5,6},
  {&(_tg__ZTV2C7__5E7x15__7G7x15y4[4]),  4,5},
  {&(_tg__ZTV2A1__5E7x15__7G7x15y4[3]),  3,4},
  {&(_ZTV7G7x15y4[10]),  10,15},
  {&(_ZTV7G7x15y4[14]),  14,15},
  {&(_tg__ZTV2C7__7G7x15y4[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__7G7x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x15y4[];
extern  VTBL_ENTRY _ZTV7G7x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x15y4[];
static VTBL_ENTRY alt_thunk_names562[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E7x153fooEv,_ZThn28_N5E7x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N5E7x153fooEv,_ZThn28_N5E7x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x153fooEv,_ZThn16_N5E7x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E7x153fooEv,_ZThn16_N5E7x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x15y4 = {  "G7x15y4", // class name
  bases_G7x15y4, 6,
  &(vtc_G7x15y4[0]), // expected_vtbl_contents
  &(vtt_G7x15y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G7x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x15y4),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x15y4),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names562,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x15y5  : virtual E7x15 , F0 {
  int ff;
  ~G7x15y5(); // tgen
  G7x15y5(); // tgen
};
//SIG(1 G7x15y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G7x15y5 ::~G7x15y5(){ note_dtor("G7x15y5", this);} // tgen
G7x15y5 ::G7x15y5(){ note_ctor("G7x15y5", this);} // tgen

static void Test_G7x15y5()
{
  extern Class_Descriptor cd_G7x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G7x15y5, buf);
    G7x15y5 *dp, &lv = *(dp=new (buf) G7x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G7x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x15y5)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,32), "G7x15y5");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,20), "G7x15y5");
    check_base_class_offset(lv, (C7*)(E7x15*), ABISELECT(32,20), "G7x15y5");
    check_base_class_offset(lv, (D0*)(E7x15*), ABISELECT(60,40), "G7x15y5");
    check_base_class_offset(lv, (E7x15*), ABISELECT(16,12), "G7x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G7x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x15y5.ff");
    test_class_info(&lv, &cd_G7x15y5);
    dp->~G7x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x15y5(Test_G7x15y5, "G7x15y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G7x15y5C1Ev();
extern void _ZN7G7x15y5D1Ev();
Name_Map name_map_G7x15y5[] = {
  NSPAIR(_ZN7G7x15y5C1Ev),
  NSPAIR(_ZN7G7x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x15;
extern VTBL_ENTRY _ZTI5E7x15[];
extern  VTBL_ENTRY _ZTV5E7x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x15y5[] = {
  // 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(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
    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
    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_E7x15,    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 _ZTI7G7x15y5[];
extern void _ZN5E7x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv)();
extern void ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn8_N5E7x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv)();
extern void ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x15y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x15y5[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G7x15y5[0]),
  (VTBL_ENTRY)&_ZN5E7x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G7x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G7x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv),
};
extern VTBL_ENTRY _ZTV7G7x15y5[];
extern void _ZN5E7x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x15__7G7x15y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&_ZN5E7x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv)();
extern void ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn8_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C7__5E7x15__7G7x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv)();
extern void ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x15__7G7x15y5[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__7G7x15y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__7G7x15y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x15y5[] = {
  {&(_ZTV7G7x15y5[6]),  6,22},
  {&(_ZTV7G7x15y5[12]),  12,22},
  {&(_ZTV7G7x15y5[17]),  17,22},
  {&(_ZTV7G7x15y5[21]),  21,22},
  {&(_tg__ZTV5E7x15__7G7x15y5[5]),  5,6},
  {&(_tg__ZTV2C7__5E7x15__7G7x15y5[4]),  4,5},
  {&(_tg__ZTV2A1__5E7x15__7G7x15y5[3]),  3,4},
  {&(_tg__ZTV2C7__7G7x15y5[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__7G7x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x15y5[];
extern  VTBL_ENTRY _ZTV7G7x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x15y5[];
static VTBL_ENTRY alt_thunk_names563[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn8_N5E7x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn8_N5E7x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x15y5 = {  "G7x15y5", // class name
  bases_G7x15y5, 6,
  &(vtc_G7x15y5[0]), // expected_vtbl_contents
  &(vtt_G7x15y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G7x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x15y5),22, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x15y5),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names563,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x15y6  : E7x15 , virtual F0 {
  int ff;
  ~G7x15y6(); // tgen
  G7x15y6(); // tgen
};
//SIG(1 G7x15y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G7x15y6 ::~G7x15y6(){ note_dtor("G7x15y6", this);} // tgen
G7x15y6 ::G7x15y6(){ note_ctor("G7x15y6", this);} // tgen

static void Test_G7x15y6()
{
  extern Class_Descriptor cd_G7x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x15y6, buf);
    G7x15y6 *dp, &lv = *(dp=new (buf) G7x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x15y6)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(32,24), "G7x15y6");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(16,12), "G7x15y6");
    check_base_class_offset(lv, (C7*)(E7x15*), ABISELECT(16,12), "G7x15y6");
    check_base_class_offset(lv, (D0*)(E7x15*), ABISELECT(44,32), "G7x15y6");
    check_base_class_offset(lv, (E7x15*), 0, "G7x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G7x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x15y6.ff");
    test_class_info(&lv, &cd_G7x15y6);
    dp->~G7x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x15y6(Test_G7x15y6, "G7x15y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G7x15y6C1Ev();
extern void _ZN7G7x15y6D1Ev();
Name_Map name_map_G7x15y6[] = {
  NSPAIR(_ZN7G7x15y6C1Ev),
  NSPAIR(_ZN7G7x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x15;
extern VTBL_ENTRY _ZTI5E7x15[];
extern  VTBL_ENTRY _ZTV5E7x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x15y6[] = {
  // 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)
    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
    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(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_E7x15,    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 _ZTI7G7x15y6[];
extern void _ZN5E7x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv)();
extern void ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn12_N5E7x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv)();
extern void ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn24_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x15y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x15y6[0]),
  (VTBL_ENTRY)&_ZN5E7x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G7x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G7x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv),
};
extern VTBL_ENTRY _ZTV7G7x15y6[];
extern void _ZN5E7x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x15__7G7x15y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&_ZN5E7x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv)();
extern void ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn12_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C7__5E7x15__7G7x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv)();
extern void ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn24_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x15__7G7x15y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__7G7x15y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__7G7x15y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x15y6[] = {
  {&(_ZTV7G7x15y6[6]),  6,16},
  {&(_tg__ZTV5E7x15__7G7x15y6[5]),  5,6},
  {&(_tg__ZTV2C7__5E7x15__7G7x15y6[4]),  4,5},
  {&(_tg__ZTV2A1__5E7x15__7G7x15y6[3]),  3,4},
  {&(_ZTV7G7x15y6[11]),  11,16},
  {&(_ZTV7G7x15y6[15]),  15,16},
  {&(_tg__ZTV2C7__7G7x15y6[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__7G7x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x15y6[];
extern  VTBL_ENTRY _ZTV7G7x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x15y6[];
static VTBL_ENTRY alt_thunk_names564[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn24_N5E7x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn24_N5E7x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn12_N5E7x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn12_N5E7x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x15y6 = {  "G7x15y6", // class name
  bases_G7x15y6, 6,
  &(vtc_G7x15y6[0]), // expected_vtbl_contents
  &(vtt_G7x15y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G7x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x15y6),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x15y6),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names564,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x15y7  : virtual E7x15 , virtual F0 {
  int ff;
  ~G7x15y7(); // tgen
  G7x15y7(); // tgen
};
//SIG(1 G7x15y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G7x15y7 ::~G7x15y7(){ note_dtor("G7x15y7", this);} // tgen
G7x15y7 ::G7x15y7(){ note_ctor("G7x15y7", this);} // tgen

static void Test_G7x15y7()
{
  extern Class_Descriptor cd_G7x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G7x15y7, buf);
    G7x15y7 *dp, &lv = *(dp=new (buf) G7x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G7x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x15y7)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,28), "G7x15y7");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,16), "G7x15y7");
    check_base_class_offset(lv, (C7*)(E7x15*), ABISELECT(32,16), "G7x15y7");
    check_base_class_offset(lv, (D0*)(E7x15*), ABISELECT(60,36), "G7x15y7");
    check_base_class_offset(lv, (E7x15*), ABISELECT(16,8), "G7x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G7x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G7x15y7.ff");
    test_class_info(&lv, &cd_G7x15y7);
    dp->~G7x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x15y7(Test_G7x15y7, "G7x15y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G7x15y7C1Ev();
extern void _ZN7G7x15y7D1Ev();
Name_Map name_map_G7x15y7[] = {
  NSPAIR(_ZN7G7x15y7C1Ev),
  NSPAIR(_ZN7G7x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E7x15;
extern VTBL_ENTRY _ZTI5E7x15[];
extern  VTBL_ENTRY _ZTV5E7x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E7x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x15y7[] = {
  // 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(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
    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
    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_E7x15,    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 _ZTI7G7x15y7[];
extern void _ZN5E7x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv)();
extern void ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn8_N5E7x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv)();
extern void ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G7x15y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G7x15y7[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G7x15y7[0]),
  (VTBL_ENTRY)&_ZN5E7x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G7x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G7x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv),
};
extern VTBL_ENTRY _ZTV7G7x15y7[];
extern void _ZN5E7x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E7x15__7G7x15y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&_ZN5E7x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv)();
extern void ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn8_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C7__5E7x15__7G7x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv)();
extern void ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E7x15__7G7x15y7[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E7x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__7G7x15y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__7G7x15y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x15y7[] = {
  {&(_ZTV7G7x15y7[7]),  7,23},
  {&(_ZTV7G7x15y7[13]),  13,23},
  {&(_ZTV7G7x15y7[18]),  18,23},
  {&(_ZTV7G7x15y7[22]),  22,23},
  {&(_tg__ZTV5E7x15__7G7x15y7[5]),  5,6},
  {&(_tg__ZTV2C7__5E7x15__7G7x15y7[4]),  4,5},
  {&(_tg__ZTV2A1__5E7x15__7G7x15y7[3]),  3,4},
  {&(_tg__ZTV2C7__7G7x15y7[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__7G7x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G7x15y7[];
extern  VTBL_ENTRY _ZTV7G7x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G7x15y7[];
static VTBL_ENTRY alt_thunk_names565[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5E7x153fooEv,_ZTv0_n12_N5E7x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E7x153fooEv,_ZThn20_N5E7x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E7x153fooEv,_ZTv0_n16_N5E7x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn8_N5E7x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E7x153fooEv,_ZThn8_N5E7x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G7x15y7 = {  "G7x15y7", // class name
  bases_G7x15y7, 6,
  &(vtc_G7x15y7[0]), // expected_vtbl_contents
  &(vtt_G7x15y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G7x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G7x15y7),23, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G7x15y7),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names565,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E8x15  : virtual C8 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E8x153fooEv
  ~E8x15(); // tgen
  E8x15(); // tgen
};
//SIG(-1 E8x15) C1{ VBC2{ BC3{ Fi} VBC4{ Fi} Fi} VBC5{ Fi} v1 Fi}


void  E8x15 ::foo(){vfunc_called(this, "_ZN5E8x153fooEv");}
E8x15 ::~E8x15(){ note_dtor("E8x15", this);} // tgen
E8x15 ::E8x15(){ note_ctor("E8x15", this);} // tgen

static void Test_E8x15()
{
  extern Class_Descriptor cd_E8x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E8x15, buf);
    E8x15 *dp, &lv = *(dp=new (buf) E8x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E8x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E8x15)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(24,12), "E8x15");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(32,20), "E8x15");
    check_base_class_offset(lv, (C8*), ABISELECT(16,8), "E8x15");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E8x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E8x15.fd");
    test_class_info(&lv, &cd_E8x15);
    dp->~E8x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE8x15(Test_E8x15, "E8x15", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E8x15C1Ev();
extern void _ZN5E8x15D1Ev();
Name_Map name_map_E8x15[] = {
  NSPAIR(_ZN5E8x15C1Ev),
  NSPAIR(_ZN5E8x15D1Ev),
  {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_E8x15[] = {
  // 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
    6, //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 _ZTI5E8x15[];
extern void _ZN5E8x153fooEv();
static  VTBL_ENTRY vtc_E8x15[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x15[0]),
  (VTBL_ENTRY)&_ZN5E8x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E8x15[0]),
};
extern VTBL_ENTRY _ZTV5E8x15[];
static  VTBL_ENTRY _tg__ZTV2C8__5E8x15[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_E8x15[] = {
  {&(_ZTV5E8x15[5]),  5,9},
  {&(_ZTV5E8x15[9]),  9,9},
  {&(_tg__ZTV2C8__5E8x15[3]),  3,3},
};
extern VTBL_ENTRY _ZTI5E8x15[];
extern  VTBL_ENTRY _ZTV5E8x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x15[];
Class_Descriptor cd_E8x15 = {  "E8x15", // class name
  bases_E8x15, 4,
  &(vtc_E8x15[0]), // expected_vtbl_contents
  &(vtt_E8x15[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E8x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E8x15),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E8x15),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  G8x15y0  : E8x15 , F1 {
  int ff;
  ~G8x15y0(); // tgen
  G8x15y0(); // tgen
};
//SIG(1 G8x15y0) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G8x15y0 ::~G8x15y0(){ note_dtor("G8x15y0", this);} // tgen
G8x15y0 ::G8x15y0(){ note_ctor("G8x15y0", this);} // tgen

static void Test_G8x15y0()
{
  extern Class_Descriptor cd_G8x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G8x15y0, buf);
    G8x15y0 *dp, &lv = *(dp=new (buf) G8x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G8x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x15y0)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,24), "G8x15y0");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,32), "G8x15y0");
    check_base_class_offset(lv, (C8*)(E8x15*), ABISELECT(32,20), "G8x15y0");
    check_base_class_offset(lv, (D0*)(E8x15*), ABISELECT(52,36), "G8x15y0");
    check_base_class_offset(lv, (E8x15*), 0, "G8x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G8x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G8x15y0.ff");
    test_class_info(&lv, &cd_G8x15y0);
    dp->~G8x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x15y0(Test_G8x15y0, "G8x15y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G8x15y0C1Ev();
extern void _ZN7G8x15y0D1Ev();
Name_Map name_map_G8x15y0[] = {
  NSPAIR(_ZN7G8x15y0C1Ev),
  NSPAIR(_ZN7G8x15y0D1Ev),
  {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_E8x15;
extern VTBL_ENTRY _ZTI5E8x15[];
extern  VTBL_ENTRY _ZTV5E8x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x15y0[] = {
  // 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
    9, //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_E8x15,    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
    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 _ZTI7G8x15y0[];
extern void _ZN5E8x153fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x15y0[0]),
  (VTBL_ENTRY)&_ZN5E8x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G8x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G8x15y0[0]),
};
extern VTBL_ENTRY _ZTV7G8x15y0[];
extern void _ZN5E8x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x15__7G8x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x15[0]),
  (VTBL_ENTRY)&_ZN5E8x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C8__5E8x15__7G8x15y0[] = {
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E8x15[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__7G8x15y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x15y0[] = {
  {&(_ZTV7G8x15y0[5]),  5,12},
  {&(_tg__ZTV5E8x15__7G8x15y0[5]),  5,6},
  {&(_tg__ZTV2C8__5E8x15__7G8x15y0[3]),  3,3},
  {&(_ZTV7G8x15y0[12]),  12,12},
  {&(_tg__ZTV2C8__7G8x15y0[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x15y0[];
extern  VTBL_ENTRY _ZTV7G8x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x15y0[];
Class_Descriptor cd_G8x15y0 = {  "G8x15y0", // class name
  bases_G8x15y0, 6,
  &(vtc_G8x15y0[0]), // expected_vtbl_contents
  &(vtt_G8x15y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G8x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x15y0),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x15y0),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  G8x15y1  : virtual E8x15 , F1 {
  int ff;
  ~G8x15y1(); // tgen
  G8x15y1(); // tgen
};
//SIG(1 G8x15y1) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G8x15y1 ::~G8x15y1(){ note_dtor("G8x15y1", this);} // tgen
G8x15y1 ::G8x15y1(){ note_ctor("G8x15y1", this);} // tgen

static void Test_G8x15y1()
{
  extern Class_Descriptor cd_G8x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G8x15y1, buf);
    G8x15y1 *dp, &lv = *(dp=new (buf) G8x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G8x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x15y1)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,24), "G8x15y1");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,32), "G8x15y1");
    check_base_class_offset(lv, (C8*)(E8x15*), ABISELECT(32,20), "G8x15y1");
    check_base_class_offset(lv, (D0*)(E8x15*), ABISELECT(52,36), "G8x15y1");
    check_base_class_offset(lv, (E8x15*), ABISELECT(16,12), "G8x15y1");
    check_base_class_offset(lv, (F1*), 0, "G8x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x15y1.ff");
    test_class_info(&lv, &cd_G8x15y1);
    dp->~G8x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x15y1(Test_G8x15y1, "G8x15y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G8x15y1C1Ev();
extern void _ZN7G8x15y1D1Ev();
Name_Map name_map_G8x15y1[] = {
  NSPAIR(_ZN7G8x15y1C1Ev),
  NSPAIR(_ZN7G8x15y1D1Ev),
  {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_E8x15;
extern VTBL_ENTRY _ZTI5E8x15[];
extern  VTBL_ENTRY _ZTV5E8x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x15y1[] = {
  // 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
    14, //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_E8x15,    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_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 _ZTI7G8x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E8x153fooEv();
static  VTBL_ENTRY vtc_G8x15y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G8x15y1[0]),
  (VTBL_ENTRY)&_ZN5E8x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G8x15y1[0]),
};
extern VTBL_ENTRY _ZTV7G8x15y1[];
extern void _ZN5E8x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x15__7G8x15y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x15[0]),
  (VTBL_ENTRY)&_ZN5E8x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C8__5E8x15__7G8x15y1[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E8x15[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__7G8x15y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x15y1[] = {
  {&(_ZTV7G8x15y1[6]),  6,17},
  {&(_ZTV7G8x15y1[13]),  13,17},
  {&(_ZTV7G8x15y1[17]),  17,17},
  {&(_tg__ZTV5E8x15__7G8x15y1[5]),  5,6},
  {&(_tg__ZTV2C8__5E8x15__7G8x15y1[3]),  3,3},
  {&(_tg__ZTV2C8__7G8x15y1[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x15y1[];
extern  VTBL_ENTRY _ZTV7G8x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x15y1[];
Class_Descriptor cd_G8x15y1 = {  "G8x15y1", // class name
  bases_G8x15y1, 6,
  &(vtc_G8x15y1[0]), // expected_vtbl_contents
  &(vtt_G8x15y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G8x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x15y1),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x15y1),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  G8x15y2  : E8x15 , virtual F1 {
  int ff;
  ~G8x15y2(); // tgen
  G8x15y2(); // tgen
};
//SIG(1 G8x15y2) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G8x15y2 ::~G8x15y2(){ note_dtor("G8x15y2", this);} // tgen
G8x15y2 ::G8x15y2(){ note_ctor("G8x15y2", this);} // tgen

static void Test_G8x15y2()
{
  extern Class_Descriptor cd_G8x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G8x15y2, buf);
    G8x15y2 *dp, &lv = *(dp=new (buf) G8x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G8x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x15y2)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(24,16), "G8x15y2");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(32,24), "G8x15y2");
    check_base_class_offset(lv, (C8*)(E8x15*), ABISELECT(16,12), "G8x15y2");
    check_base_class_offset(lv, (D0*)(E8x15*), ABISELECT(36,28), "G8x15y2");
    check_base_class_offset(lv, (E8x15*), 0, "G8x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G8x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x15y2.ff");
    test_class_info(&lv, &cd_G8x15y2);
    dp->~G8x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x15y2(Test_G8x15y2, "G8x15y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G8x15y2C1Ev();
extern void _ZN7G8x15y2D1Ev();
Name_Map name_map_G8x15y2[] = {
  NSPAIR(_ZN7G8x15y2C1Ev),
  NSPAIR(_ZN7G8x15y2D1Ev),
  {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_E8x15;
extern VTBL_ENTRY _ZTI5E8x15[];
extern  VTBL_ENTRY _ZTV5E8x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x15y2[] = {
  // 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
    7, //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_E8x15,    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
    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 _ZTI7G8x15y2[];
extern void _ZN5E8x153fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x15y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x15y2[0]),
  (VTBL_ENTRY)&_ZN5E8x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G8x15y2[0]),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G8x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G8x15y2[];
extern void _ZN5E8x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x15__7G8x15y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x15[0]),
  (VTBL_ENTRY)&_ZN5E8x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C8__5E8x15__7G8x15y2[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E8x15[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__7G8x15y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x15y2[] = {
  {&(_ZTV7G8x15y2[6]),  6,14},
  {&(_tg__ZTV5E8x15__7G8x15y2[5]),  5,6},
  {&(_tg__ZTV2C8__5E8x15__7G8x15y2[3]),  3,3},
  {&(_ZTV7G8x15y2[10]),  10,14},
  {&(_ZTV7G8x15y2[13]),  13,14},
  {&(_tg__ZTV2C8__7G8x15y2[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x15y2[];
extern  VTBL_ENTRY _ZTV7G8x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x15y2[];
Class_Descriptor cd_G8x15y2 = {  "G8x15y2", // class name
  bases_G8x15y2, 6,
  &(vtc_G8x15y2[0]), // expected_vtbl_contents
  &(vtt_G8x15y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G8x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x15y2),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x15y2),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  G8x15y3  : virtual E8x15 , virtual F1 {
  int ff;
  ~G8x15y3(); // tgen
  G8x15y3(); // tgen
};
//SIG(1 G8x15y3) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G8x15y3 ::~G8x15y3(){ note_dtor("G8x15y3", this);} // tgen
G8x15y3 ::G8x15y3(){ note_ctor("G8x15y3", this);} // tgen

static void Test_G8x15y3()
{
  extern Class_Descriptor cd_G8x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G8x15y3, buf);
    G8x15y3 *dp, &lv = *(dp=new (buf) G8x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G8x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x15y3)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,20), "G8x15y3");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,28), "G8x15y3");
    check_base_class_offset(lv, (C8*)(E8x15*), ABISELECT(32,16), "G8x15y3");
    check_base_class_offset(lv, (D0*)(E8x15*), ABISELECT(52,32), "G8x15y3");
    check_base_class_offset(lv, (E8x15*), ABISELECT(16,8), "G8x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G8x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G8x15y3.ff");
    test_class_info(&lv, &cd_G8x15y3);
    dp->~G8x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x15y3(Test_G8x15y3, "G8x15y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G8x15y3C1Ev();
extern void _ZN7G8x15y3D1Ev();
Name_Map name_map_G8x15y3[] = {
  NSPAIR(_ZN7G8x15y3C1Ev),
  NSPAIR(_ZN7G8x15y3D1Ev),
  {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_E8x15;
extern VTBL_ENTRY _ZTI5E8x15[];
extern  VTBL_ENTRY _ZTV5E8x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x15y3[] = {
  // 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
    14, //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_E8x15,    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
    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 _ZTI7G8x15y3[];
extern void _ZN5E8x153fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x15y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x15y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G8x15y3[0]),
  (VTBL_ENTRY)&_ZN5E8x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G8x15y3[0]),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G8x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G8x15y3[];
extern void _ZN5E8x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x15__7G8x15y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x15[0]),
  (VTBL_ENTRY)&_ZN5E8x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C8__5E8x15__7G8x15y3[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E8x15[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__7G8x15y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x15y3[] = {
  {&(_ZTV7G8x15y3[7]),  7,21},
  {&(_ZTV7G8x15y3[13]),  13,21},
  {&(_ZTV7G8x15y3[17]),  17,21},
  {&(_ZTV7G8x15y3[20]),  20,21},
  {&(_tg__ZTV5E8x15__7G8x15y3[5]),  5,6},
  {&(_tg__ZTV2C8__5E8x15__7G8x15y3[3]),  3,3},
  {&(_tg__ZTV2C8__7G8x15y3[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x15y3[];
extern  VTBL_ENTRY _ZTV7G8x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x15y3[];
Class_Descriptor cd_G8x15y3 = {  "G8x15y3", // class name
  bases_G8x15y3, 6,
  &(vtc_G8x15y3[0]), // expected_vtbl_contents
  &(vtt_G8x15y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G8x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x15y3),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x15y3),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  G8x15y4  : E8x15 , F0 {
  int ff;
  ~G8x15y4(); // tgen
  G8x15y4(); // tgen
};
//SIG(1 G8x15y4) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G8x15y4 ::~G8x15y4(){ note_dtor("G8x15y4", this);} // tgen
G8x15y4 ::G8x15y4(){ note_ctor("G8x15y4", this);} // tgen

static void Test_G8x15y4()
{
  extern Class_Descriptor cd_G8x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x15y4, buf);
    G8x15y4 *dp, &lv = *(dp=new (buf) G8x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x15y4)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(32,20), "G8x15y4");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(40,28), "G8x15y4");
    check_base_class_offset(lv, (C8*)(E8x15*), ABISELECT(24,16), "G8x15y4");
    check_base_class_offset(lv, (D0*)(E8x15*), ABISELECT(44,32), "G8x15y4");
    check_base_class_offset(lv, (E8x15*), 0, "G8x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G8x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G8x15y4.ff");
    test_class_info(&lv, &cd_G8x15y4);
    dp->~G8x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x15y4(Test_G8x15y4, "G8x15y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G8x15y4C1Ev();
extern void _ZN7G8x15y4D1Ev();
Name_Map name_map_G8x15y4[] = {
  NSPAIR(_ZN7G8x15y4C1Ev),
  NSPAIR(_ZN7G8x15y4D1Ev),
  {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_E8x15;
extern VTBL_ENTRY _ZTI5E8x15[];
extern  VTBL_ENTRY _ZTV5E8x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x15y4[] = {
  // 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
    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(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_E8x15,    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 _ZTI7G8x15y4[];
extern void _ZN5E8x153fooEv();
static  VTBL_ENTRY vtc_G8x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x15y4[0]),
  (VTBL_ENTRY)&_ZN5E8x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G8x15y4[0]),
};
extern VTBL_ENTRY _ZTV7G8x15y4[];
extern void _ZN5E8x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x15__7G8x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x15[0]),
  (VTBL_ENTRY)&_ZN5E8x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C8__5E8x15__7G8x15y4[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E8x15[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__7G8x15y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x15y4[] = {
  {&(_ZTV7G8x15y4[5]),  5,9},
  {&(_tg__ZTV5E8x15__7G8x15y4[5]),  5,6},
  {&(_tg__ZTV2C8__5E8x15__7G8x15y4[3]),  3,3},
  {&(_ZTV7G8x15y4[9]),  9,9},
  {&(_tg__ZTV2C8__7G8x15y4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x15y4[];
extern  VTBL_ENTRY _ZTV7G8x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x15y4[];
Class_Descriptor cd_G8x15y4 = {  "G8x15y4", // class name
  bases_G8x15y4, 6,
  &(vtc_G8x15y4[0]), // expected_vtbl_contents
  &(vtt_G8x15y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G8x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x15y4),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x15y4),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  G8x15y5  : virtual E8x15 , F0 {
  int ff;
  ~G8x15y5(); // tgen
  G8x15y5(); // tgen
};
//SIG(1 G8x15y5) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G8x15y5 ::~G8x15y5(){ note_dtor("G8x15y5", this);} // tgen
G8x15y5 ::G8x15y5(){ note_ctor("G8x15y5", this);} // tgen

static void Test_G8x15y5()
{
  extern Class_Descriptor cd_G8x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G8x15y5, buf);
    G8x15y5 *dp, &lv = *(dp=new (buf) G8x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G8x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x15y5)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,24), "G8x15y5");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,32), "G8x15y5");
    check_base_class_offset(lv, (C8*)(E8x15*), ABISELECT(32,20), "G8x15y5");
    check_base_class_offset(lv, (D0*)(E8x15*), ABISELECT(52,36), "G8x15y5");
    check_base_class_offset(lv, (E8x15*), ABISELECT(16,12), "G8x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G8x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x15y5.ff");
    test_class_info(&lv, &cd_G8x15y5);
    dp->~G8x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x15y5(Test_G8x15y5, "G8x15y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G8x15y5C1Ev();
extern void _ZN7G8x15y5D1Ev();
Name_Map name_map_G8x15y5[] = {
  NSPAIR(_ZN7G8x15y5C1Ev),
  NSPAIR(_ZN7G8x15y5D1Ev),
  {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_E8x15;
extern VTBL_ENTRY _ZTI5E8x15[];
extern  VTBL_ENTRY _ZTV5E8x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x15y5[] = {
  // 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
    13, //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_E8x15,    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
    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 _ZTI7G8x15y5[];
extern void _ZN5E8x153fooEv();
static  VTBL_ENTRY vtc_G8x15y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x15y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G8x15y5[0]),
  (VTBL_ENTRY)&_ZN5E8x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G8x15y5[0]),
};
extern VTBL_ENTRY _ZTV7G8x15y5[];
extern void _ZN5E8x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x15__7G8x15y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x15[0]),
  (VTBL_ENTRY)&_ZN5E8x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C8__5E8x15__7G8x15y5[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E8x15[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__7G8x15y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x15y5[] = {
  {&(_ZTV7G8x15y5[6]),  6,16},
  {&(_ZTV7G8x15y5[12]),  12,16},
  {&(_ZTV7G8x15y5[16]),  16,16},
  {&(_tg__ZTV5E8x15__7G8x15y5[5]),  5,6},
  {&(_tg__ZTV2C8__5E8x15__7G8x15y5[3]),  3,3},
  {&(_tg__ZTV2C8__7G8x15y5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x15y5[];
extern  VTBL_ENTRY _ZTV7G8x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x15y5[];
Class_Descriptor cd_G8x15y5 = {  "G8x15y5", // class name
  bases_G8x15y5, 6,
  &(vtc_G8x15y5[0]), // expected_vtbl_contents
  &(vtt_G8x15y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G8x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x15y5),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x15y5),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  G8x15y6  : E8x15 , virtual F0 {
  int ff;
  ~G8x15y6(); // tgen
  G8x15y6(); // tgen
};
//SIG(1 G8x15y6) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G8x15y6 ::~G8x15y6(){ note_dtor("G8x15y6", this);} // tgen
G8x15y6 ::G8x15y6(){ note_ctor("G8x15y6", this);} // tgen

static void Test_G8x15y6()
{
  extern Class_Descriptor cd_G8x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x15y6, buf);
    G8x15y6 *dp, &lv = *(dp=new (buf) G8x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x15y6)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(24,16), "G8x15y6");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(32,24), "G8x15y6");
    check_base_class_offset(lv, (C8*)(E8x15*), ABISELECT(16,12), "G8x15y6");
    check_base_class_offset(lv, (D0*)(E8x15*), ABISELECT(36,28), "G8x15y6");
    check_base_class_offset(lv, (E8x15*), 0, "G8x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G8x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x15y6.ff");
    test_class_info(&lv, &cd_G8x15y6);
    dp->~G8x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x15y6(Test_G8x15y6, "G8x15y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G8x15y6C1Ev();
extern void _ZN7G8x15y6D1Ev();
Name_Map name_map_G8x15y6[] = {
  NSPAIR(_ZN7G8x15y6C1Ev),
  NSPAIR(_ZN7G8x15y6D1Ev),
  {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_E8x15;
extern VTBL_ENTRY _ZTI5E8x15[];
extern  VTBL_ENTRY _ZTV5E8x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x15y6[] = {
  // 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
    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(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_E8x15,    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 _ZTI7G8x15y6[];
extern void _ZN5E8x153fooEv();
static  VTBL_ENTRY vtc_G8x15y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x15y6[0]),
  (VTBL_ENTRY)&_ZN5E8x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G8x15y6[0]),
};
extern VTBL_ENTRY _ZTV7G8x15y6[];
extern void _ZN5E8x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x15__7G8x15y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x15[0]),
  (VTBL_ENTRY)&_ZN5E8x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C8__5E8x15__7G8x15y6[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E8x15[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__7G8x15y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x15y6[] = {
  {&(_ZTV7G8x15y6[6]),  6,10},
  {&(_tg__ZTV5E8x15__7G8x15y6[5]),  5,6},
  {&(_tg__ZTV2C8__5E8x15__7G8x15y6[3]),  3,3},
  {&(_ZTV7G8x15y6[10]),  10,10},
  {&(_tg__ZTV2C8__7G8x15y6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x15y6[];
extern  VTBL_ENTRY _ZTV7G8x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x15y6[];
Class_Descriptor cd_G8x15y6 = {  "G8x15y6", // class name
  bases_G8x15y6, 6,
  &(vtc_G8x15y6[0]), // expected_vtbl_contents
  &(vtt_G8x15y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G8x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x15y6),10, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x15y6),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  G8x15y7  : virtual E8x15 , virtual F0 {
  int ff;
  ~G8x15y7(); // tgen
  G8x15y7(); // tgen
};
//SIG(1 G8x15y7) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G8x15y7 ::~G8x15y7(){ note_dtor("G8x15y7", this);} // tgen
G8x15y7 ::G8x15y7(){ note_ctor("G8x15y7", this);} // tgen

static void Test_G8x15y7()
{
  extern Class_Descriptor cd_G8x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G8x15y7, buf);
    G8x15y7 *dp, &lv = *(dp=new (buf) G8x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G8x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x15y7)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,20), "G8x15y7");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,28), "G8x15y7");
    check_base_class_offset(lv, (C8*)(E8x15*), ABISELECT(32,16), "G8x15y7");
    check_base_class_offset(lv, (D0*)(E8x15*), ABISELECT(52,32), "G8x15y7");
    check_base_class_offset(lv, (E8x15*), ABISELECT(16,8), "G8x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G8x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G8x15y7.ff");
    test_class_info(&lv, &cd_G8x15y7);
    dp->~G8x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x15y7(Test_G8x15y7, "G8x15y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G8x15y7C1Ev();
extern void _ZN7G8x15y7D1Ev();
Name_Map name_map_G8x15y7[] = {
  NSPAIR(_ZN7G8x15y7C1Ev),
  NSPAIR(_ZN7G8x15y7D1Ev),
  {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_E8x15;
extern VTBL_ENTRY _ZTI5E8x15[];
extern  VTBL_ENTRY _ZTV5E8x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E8x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x15y7[] = {
  // 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
    14, //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_E8x15,    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_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 _ZTI7G8x15y7[];
extern void _ZN5E8x153fooEv();
static  VTBL_ENTRY vtc_G8x15y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G8x15y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G8x15y7[0]),
  (VTBL_ENTRY)&_ZN5E8x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G8x15y7[0]),
};
extern VTBL_ENTRY _ZTV7G8x15y7[];
extern void _ZN5E8x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E8x15__7G8x15y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E8x15[0]),
  (VTBL_ENTRY)&_ZN5E8x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C8__5E8x15__7G8x15y7[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E8x15[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__7G8x15y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x15y7[] = {
  {&(_ZTV7G8x15y7[7]),  7,17},
  {&(_ZTV7G8x15y7[13]),  13,17},
  {&(_ZTV7G8x15y7[17]),  17,17},
  {&(_tg__ZTV5E8x15__7G8x15y7[5]),  5,6},
  {&(_tg__ZTV2C8__5E8x15__7G8x15y7[3]),  3,3},
  {&(_tg__ZTV2C8__7G8x15y7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI7G8x15y7[];
extern  VTBL_ENTRY _ZTV7G8x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G8x15y7[];
Class_Descriptor cd_G8x15y7 = {  "G8x15y7", // class name
  bases_G8x15y7, 6,
  &(vtc_G8x15y7[0]), // expected_vtbl_contents
  &(vtt_G8x15y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G8x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G8x15y7),17, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G8x15y7),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  E9x15  : virtual C9 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN5E9x153fooEv
  ~E9x15(); // tgen
  E9x15(); // tgen
};
//SIG(-1 E9x15) C1{ VBC2{ BC3{ v1 Fi} VBC4{ Fi} Fi} VBC5{ Fi} v1 Fi}


void  E9x15 ::foo(){vfunc_called(this, "_ZN5E9x153fooEv");}
E9x15 ::~E9x15(){ note_dtor("E9x15", this);} // tgen
E9x15 ::E9x15(){ note_ctor("E9x15", this);} // tgen

static void Test_E9x15()
{
  extern Class_Descriptor cd_E9x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E9x15, buf);
    E9x15 *dp, &lv = *(dp=new (buf) E9x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E9x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E9x15)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(16,8), "E9x15");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(32,20), "E9x15");
    check_base_class_offset(lv, (C9*), ABISELECT(16,8), "E9x15");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E9x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E9x15.fd");
    test_class_info(&lv, &cd_E9x15);
    dp->~E9x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE9x15(Test_E9x15, "E9x15", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E9x15C1Ev();
extern void _ZN5E9x15D1Ev();
Name_Map name_map_E9x15[] = {
  NSPAIR(_ZN5E9x15C1Ev),
  NSPAIR(_ZN5E9x15D1Ev),
  {0,0}
};
extern Class_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_E9x15[] = {
  // 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
    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_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 _ZTI5E9x15[];
extern void _ZN5E9x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv)();
extern void ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn8_N5E9x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E9x15[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x15[0]),
  (VTBL_ENTRY)&_ZN5E9x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E9x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv),
};
extern VTBL_ENTRY _ZTV5E9x15[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__5E9x15[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E9x15[] = {
  {&(_ZTV5E9x15[5]),  5,11},
  {&(_ZTV5E9x15[10]),  10,11},
  {&(_tg__ZTV2C9__5E9x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E9x15[];
extern  VTBL_ENTRY _ZTV5E9x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x15[];
static VTBL_ENTRY alt_thunk_names566[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn8_N5E9x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E9x15 = {  "E9x15", // class name
  bases_E9x15, 4,
  &(vtc_E9x15[0]), // expected_vtbl_contents
  &(vtt_E9x15[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E9x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E9x15),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E9x15),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names566,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x15y0  : E9x15 , F1 {
  int ff;
  ~G9x15y0(); // tgen
  G9x15y0(); // tgen
};
//SIG(1 G9x15y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G9x15y0 ::~G9x15y0(){ note_dtor("G9x15y0", this);} // tgen
G9x15y0 ::G9x15y0(){ note_ctor("G9x15y0", this);} // tgen

static void Test_G9x15y0()
{
  extern Class_Descriptor cd_G9x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G9x15y0, buf);
    G9x15y0 *dp, &lv = *(dp=new (buf) G9x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G9x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x15y0)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,20), "G9x15y0");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,32), "G9x15y0");
    check_base_class_offset(lv, (C9*)(E9x15*), ABISELECT(32,20), "G9x15y0");
    check_base_class_offset(lv, (D0*)(E9x15*), ABISELECT(52,36), "G9x15y0");
    check_base_class_offset(lv, (E9x15*), 0, "G9x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G9x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G9x15y0.ff");
    test_class_info(&lv, &cd_G9x15y0);
    dp->~G9x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x15y0(Test_G9x15y0, "G9x15y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G9x15y0C1Ev();
extern void _ZN7G9x15y0D1Ev();
Name_Map name_map_G9x15y0[] = {
  NSPAIR(_ZN7G9x15y0C1Ev),
  NSPAIR(_ZN7G9x15y0D1Ev),
  {0,0}
};
extern Class_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_E9x15;
extern VTBL_ENTRY _ZTI5E9x15[];
extern  VTBL_ENTRY _ZTV5E9x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x15y0[] = {
  // 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
    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
    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_E9x15,    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
    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 _ZTI7G9x15y0[];
extern void _ZN5E9x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv)();
extern void ABISELECT(_ZThn32_N5E9x153fooEv,_ZThn20_N5E9x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G9x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x15y0[0]),
  (VTBL_ENTRY)&_ZN5E9x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G9x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G9x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv),
};
extern VTBL_ENTRY _ZTV7G9x15y0[];
extern void _ZN5E9x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x15__7G9x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x15[0]),
  (VTBL_ENTRY)&_ZN5E9x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv)();
extern void ABISELECT(_ZThn32_N5E9x153fooEv,_ZThn20_N5E9x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C9__5E9x15__7G9x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E9x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__7G9x15y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x15y0[] = {
  {&(_ZTV7G9x15y0[5]),  5,14},
  {&(_tg__ZTV5E9x15__7G9x15y0[5]),  5,6},
  {&(_tg__ZTV2C9__5E9x15__7G9x15y0[4]),  4,5},
  {&(_ZTV7G9x15y0[13]),  13,14},
  {&(_tg__ZTV2C9__7G9x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x15y0[];
extern  VTBL_ENTRY _ZTV7G9x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x15y0[];
static VTBL_ENTRY alt_thunk_names567[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E9x153fooEv,_ZThn20_N5E9x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N5E9x153fooEv,_ZThn20_N5E9x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G9x15y0 = {  "G9x15y0", // class name
  bases_G9x15y0, 6,
  &(vtc_G9x15y0[0]), // expected_vtbl_contents
  &(vtt_G9x15y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G9x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x15y0),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x15y0),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names567,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x15y1  : virtual E9x15 , F1 {
  int ff;
  ~G9x15y1(); // tgen
  G9x15y1(); // tgen
};
//SIG(1 G9x15y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G9x15y1 ::~G9x15y1(){ note_dtor("G9x15y1", this);} // tgen
G9x15y1 ::G9x15y1(){ note_ctor("G9x15y1", this);} // tgen

static void Test_G9x15y1()
{
  extern Class_Descriptor cd_G9x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G9x15y1, buf);
    G9x15y1 *dp, &lv = *(dp=new (buf) G9x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G9x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x15y1)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,20), "G9x15y1");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,32), "G9x15y1");
    check_base_class_offset(lv, (C9*)(E9x15*), ABISELECT(32,20), "G9x15y1");
    check_base_class_offset(lv, (D0*)(E9x15*), ABISELECT(52,36), "G9x15y1");
    check_base_class_offset(lv, (E9x15*), ABISELECT(16,12), "G9x15y1");
    check_base_class_offset(lv, (F1*), 0, "G9x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x15y1.ff");
    test_class_info(&lv, &cd_G9x15y1);
    dp->~G9x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x15y1(Test_G9x15y1, "G9x15y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G9x15y1C1Ev();
extern void _ZN7G9x15y1D1Ev();
Name_Map name_map_G9x15y1[] = {
  NSPAIR(_ZN7G9x15y1C1Ev),
  NSPAIR(_ZN7G9x15y1D1Ev),
  {0,0}
};
extern Class_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_E9x15;
extern VTBL_ENTRY _ZTI5E9x15[];
extern  VTBL_ENTRY _ZTV5E9x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x15y1[] = {
  // 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
    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
    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_E9x15,    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 _ZTI7G9x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN5E9x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv)();
extern void ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn8_N5E9x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G9x15y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G9x15y1[0]),
  (VTBL_ENTRY)&_ZN5E9x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G9x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv),
};
extern VTBL_ENTRY _ZTV7G9x15y1[];
extern void _ZN5E9x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x15__7G9x15y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x15[0]),
  (VTBL_ENTRY)&_ZN5E9x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv)();
extern void ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn8_N5E9x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C9__5E9x15__7G9x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E9x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__7G9x15y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x15y1[] = {
  {&(_ZTV7G9x15y1[6]),  6,19},
  {&(_ZTV7G9x15y1[13]),  13,19},
  {&(_ZTV7G9x15y1[18]),  18,19},
  {&(_tg__ZTV5E9x15__7G9x15y1[5]),  5,6},
  {&(_tg__ZTV2C9__5E9x15__7G9x15y1[4]),  4,5},
  {&(_tg__ZTV2C9__7G9x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x15y1[];
extern  VTBL_ENTRY _ZTV7G9x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x15y1[];
static VTBL_ENTRY alt_thunk_names568[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn8_N5E9x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn8_N5E9x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G9x15y1 = {  "G9x15y1", // class name
  bases_G9x15y1, 6,
  &(vtc_G9x15y1[0]), // expected_vtbl_contents
  &(vtt_G9x15y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G9x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x15y1),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x15y1),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names568,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x15y2  : E9x15 , virtual F1 {
  int ff;
  ~G9x15y2(); // tgen
  G9x15y2(); // tgen
};
//SIG(1 G9x15y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G9x15y2 ::~G9x15y2(){ note_dtor("G9x15y2", this);} // tgen
G9x15y2 ::G9x15y2(){ note_ctor("G9x15y2", this);} // tgen

static void Test_G9x15y2()
{
  extern Class_Descriptor cd_G9x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G9x15y2, buf);
    G9x15y2 *dp, &lv = *(dp=new (buf) G9x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G9x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x15y2)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(16,12), "G9x15y2");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(32,24), "G9x15y2");
    check_base_class_offset(lv, (C9*)(E9x15*), ABISELECT(16,12), "G9x15y2");
    check_base_class_offset(lv, (D0*)(E9x15*), ABISELECT(36,28), "G9x15y2");
    check_base_class_offset(lv, (E9x15*), 0, "G9x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G9x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x15y2.ff");
    test_class_info(&lv, &cd_G9x15y2);
    dp->~G9x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x15y2(Test_G9x15y2, "G9x15y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G9x15y2C1Ev();
extern void _ZN7G9x15y2D1Ev();
Name_Map name_map_G9x15y2[] = {
  NSPAIR(_ZN7G9x15y2C1Ev),
  NSPAIR(_ZN7G9x15y2D1Ev),
  {0,0}
};
extern Class_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_E9x15;
extern VTBL_ENTRY _ZTI5E9x15[];
extern  VTBL_ENTRY _ZTV5E9x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x15y2[] = {
  // 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
    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
    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_E9x15,    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
    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
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G9x15y2[];
extern void _ZN5E9x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv)();
extern void ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn12_N5E9x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x15y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x15y2[0]),
  (VTBL_ENTRY)&_ZN5E9x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G9x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G9x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G9x15y2[];
extern void _ZN5E9x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x15__7G9x15y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x15[0]),
  (VTBL_ENTRY)&_ZN5E9x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv)();
extern void ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn12_N5E9x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C9__5E9x15__7G9x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E9x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__7G9x15y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x15y2[] = {
  {&(_ZTV7G9x15y2[6]),  6,16},
  {&(_tg__ZTV5E9x15__7G9x15y2[5]),  5,6},
  {&(_tg__ZTV2C9__5E9x15__7G9x15y2[4]),  4,5},
  {&(_ZTV7G9x15y2[11]),  11,16},
  {&(_ZTV7G9x15y2[15]),  15,16},
  {&(_tg__ZTV2C9__7G9x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x15y2[];
extern  VTBL_ENTRY _ZTV7G9x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x15y2[];
static VTBL_ENTRY alt_thunk_names569[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn12_N5E9x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn12_N5E9x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G9x15y2 = {  "G9x15y2", // class name
  bases_G9x15y2, 6,
  &(vtc_G9x15y2[0]), // expected_vtbl_contents
  &(vtt_G9x15y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G9x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x15y2),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x15y2),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names569,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x15y3  : virtual E9x15 , virtual F1 {
  int ff;
  ~G9x15y3(); // tgen
  G9x15y3(); // tgen
};
//SIG(1 G9x15y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G9x15y3 ::~G9x15y3(){ note_dtor("G9x15y3", this);} // tgen
G9x15y3 ::G9x15y3(){ note_ctor("G9x15y3", this);} // tgen

static void Test_G9x15y3()
{
  extern Class_Descriptor cd_G9x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G9x15y3, buf);
    G9x15y3 *dp, &lv = *(dp=new (buf) G9x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G9x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x15y3)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,16), "G9x15y3");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,28), "G9x15y3");
    check_base_class_offset(lv, (C9*)(E9x15*), ABISELECT(32,16), "G9x15y3");
    check_base_class_offset(lv, (D0*)(E9x15*), ABISELECT(52,32), "G9x15y3");
    check_base_class_offset(lv, (E9x15*), ABISELECT(16,8), "G9x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G9x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G9x15y3.ff");
    test_class_info(&lv, &cd_G9x15y3);
    dp->~G9x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x15y3(Test_G9x15y3, "G9x15y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G9x15y3C1Ev();
extern void _ZN7G9x15y3D1Ev();
Name_Map name_map_G9x15y3[] = {
  NSPAIR(_ZN7G9x15y3C1Ev),
  NSPAIR(_ZN7G9x15y3D1Ev),
  {0,0}
};
extern Class_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_E9x15;
extern VTBL_ENTRY _ZTI5E9x15[];
extern  VTBL_ENTRY _ZTV5E9x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x15y3[] = {
  // 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
    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
    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_E9x15,    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
    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G9x15y3[];
extern void _ZN5E9x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv)();
extern void ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn8_N5E9x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x15y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x15y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G9x15y3[0]),
  (VTBL_ENTRY)&_ZN5E9x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G9x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G9x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G9x15y3[];
extern void _ZN5E9x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x15__7G9x15y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x15[0]),
  (VTBL_ENTRY)&_ZN5E9x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv)();
extern void ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn8_N5E9x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C9__5E9x15__7G9x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E9x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__7G9x15y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x15y3[] = {
  {&(_ZTV7G9x15y3[7]),  7,23},
  {&(_ZTV7G9x15y3[13]),  13,23},
  {&(_ZTV7G9x15y3[18]),  18,23},
  {&(_ZTV7G9x15y3[22]),  22,23},
  {&(_tg__ZTV5E9x15__7G9x15y3[5]),  5,6},
  {&(_tg__ZTV2C9__5E9x15__7G9x15y3[4]),  4,5},
  {&(_tg__ZTV2C9__7G9x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x15y3[];
extern  VTBL_ENTRY _ZTV7G9x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x15y3[];
static VTBL_ENTRY alt_thunk_names570[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn8_N5E9x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn8_N5E9x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G9x15y3 = {  "G9x15y3", // class name
  bases_G9x15y3, 6,
  &(vtc_G9x15y3[0]), // expected_vtbl_contents
  &(vtt_G9x15y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G9x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x15y3),23, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x15y3),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names570,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x15y4  : E9x15 , F0 {
  int ff;
  ~G9x15y4(); // tgen
  G9x15y4(); // tgen
};
//SIG(1 G9x15y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G9x15y4 ::~G9x15y4(){ note_dtor("G9x15y4", this);} // tgen
G9x15y4 ::G9x15y4(){ note_ctor("G9x15y4", this);} // tgen

static void Test_G9x15y4()
{
  extern Class_Descriptor cd_G9x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x15y4, buf);
    G9x15y4 *dp, &lv = *(dp=new (buf) G9x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x15y4)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(24,16), "G9x15y4");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(40,28), "G9x15y4");
    check_base_class_offset(lv, (C9*)(E9x15*), ABISELECT(24,16), "G9x15y4");
    check_base_class_offset(lv, (D0*)(E9x15*), ABISELECT(44,32), "G9x15y4");
    check_base_class_offset(lv, (E9x15*), 0, "G9x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G9x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G9x15y4.ff");
    test_class_info(&lv, &cd_G9x15y4);
    dp->~G9x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x15y4(Test_G9x15y4, "G9x15y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G9x15y4C1Ev();
extern void _ZN7G9x15y4D1Ev();
Name_Map name_map_G9x15y4[] = {
  NSPAIR(_ZN7G9x15y4C1Ev),
  NSPAIR(_ZN7G9x15y4D1Ev),
  {0,0}
};
extern Class_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_E9x15;
extern VTBL_ENTRY _ZTI5E9x15[];
extern  VTBL_ENTRY _ZTV5E9x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x15y4[] = {
  // 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
    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(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_E9x15,    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 _ZTI7G9x15y4[];
extern void _ZN5E9x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv)();
extern void ABISELECT(_ZThn24_N5E9x153fooEv,_ZThn16_N5E9x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G9x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x15y4[0]),
  (VTBL_ENTRY)&_ZN5E9x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G9x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv),
};
extern VTBL_ENTRY _ZTV7G9x15y4[];
extern void _ZN5E9x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x15__7G9x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x15[0]),
  (VTBL_ENTRY)&_ZN5E9x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv)();
extern void ABISELECT(_ZThn24_N5E9x153fooEv,_ZThn16_N5E9x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C9__5E9x15__7G9x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E9x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__7G9x15y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x15y4[] = {
  {&(_ZTV7G9x15y4[5]),  5,11},
  {&(_tg__ZTV5E9x15__7G9x15y4[5]),  5,6},
  {&(_tg__ZTV2C9__5E9x15__7G9x15y4[4]),  4,5},
  {&(_ZTV7G9x15y4[10]),  10,11},
  {&(_tg__ZTV2C9__7G9x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x15y4[];
extern  VTBL_ENTRY _ZTV7G9x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x15y4[];
static VTBL_ENTRY alt_thunk_names571[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E9x153fooEv,_ZThn16_N5E9x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5E9x153fooEv,_ZThn16_N5E9x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G9x15y4 = {  "G9x15y4", // class name
  bases_G9x15y4, 6,
  &(vtc_G9x15y4[0]), // expected_vtbl_contents
  &(vtt_G9x15y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G9x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x15y4),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x15y4),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names571,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x15y5  : virtual E9x15 , F0 {
  int ff;
  ~G9x15y5(); // tgen
  G9x15y5(); // tgen
};
//SIG(1 G9x15y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G9x15y5 ::~G9x15y5(){ note_dtor("G9x15y5", this);} // tgen
G9x15y5 ::G9x15y5(){ note_ctor("G9x15y5", this);} // tgen

static void Test_G9x15y5()
{
  extern Class_Descriptor cd_G9x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G9x15y5, buf);
    G9x15y5 *dp, &lv = *(dp=new (buf) G9x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G9x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x15y5)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,20), "G9x15y5");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,32), "G9x15y5");
    check_base_class_offset(lv, (C9*)(E9x15*), ABISELECT(32,20), "G9x15y5");
    check_base_class_offset(lv, (D0*)(E9x15*), ABISELECT(52,36), "G9x15y5");
    check_base_class_offset(lv, (E9x15*), ABISELECT(16,12), "G9x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G9x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x15y5.ff");
    test_class_info(&lv, &cd_G9x15y5);
    dp->~G9x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x15y5(Test_G9x15y5, "G9x15y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G9x15y5C1Ev();
extern void _ZN7G9x15y5D1Ev();
Name_Map name_map_G9x15y5[] = {
  NSPAIR(_ZN7G9x15y5C1Ev),
  NSPAIR(_ZN7G9x15y5D1Ev),
  {0,0}
};
extern Class_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_E9x15;
extern VTBL_ENTRY _ZTI5E9x15[];
extern  VTBL_ENTRY _ZTV5E9x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x15y5[] = {
  // 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
    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
    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_E9x15,    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 _ZTI7G9x15y5[];
extern void _ZN5E9x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv)();
extern void ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn8_N5E9x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G9x15y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x15y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G9x15y5[0]),
  (VTBL_ENTRY)&_ZN5E9x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G9x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv),
};
extern VTBL_ENTRY _ZTV7G9x15y5[];
extern void _ZN5E9x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x15__7G9x15y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x15[0]),
  (VTBL_ENTRY)&_ZN5E9x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv)();
extern void ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn8_N5E9x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C9__5E9x15__7G9x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E9x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__7G9x15y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x15y5[] = {
  {&(_ZTV7G9x15y5[6]),  6,18},
  {&(_ZTV7G9x15y5[12]),  12,18},
  {&(_ZTV7G9x15y5[17]),  17,18},
  {&(_tg__ZTV5E9x15__7G9x15y5[5]),  5,6},
  {&(_tg__ZTV2C9__5E9x15__7G9x15y5[4]),  4,5},
  {&(_tg__ZTV2C9__7G9x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x15y5[];
extern  VTBL_ENTRY _ZTV7G9x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x15y5[];
static VTBL_ENTRY alt_thunk_names572[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn8_N5E9x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn8_N5E9x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G9x15y5 = {  "G9x15y5", // class name
  bases_G9x15y5, 6,
  &(vtc_G9x15y5[0]), // expected_vtbl_contents
  &(vtt_G9x15y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G9x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x15y5),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x15y5),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names572,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x15y6  : E9x15 , virtual F0 {
  int ff;
  ~G9x15y6(); // tgen
  G9x15y6(); // tgen
};
//SIG(1 G9x15y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G9x15y6 ::~G9x15y6(){ note_dtor("G9x15y6", this);} // tgen
G9x15y6 ::G9x15y6(){ note_ctor("G9x15y6", this);} // tgen

static void Test_G9x15y6()
{
  extern Class_Descriptor cd_G9x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x15y6, buf);
    G9x15y6 *dp, &lv = *(dp=new (buf) G9x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x15y6)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(16,12), "G9x15y6");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(32,24), "G9x15y6");
    check_base_class_offset(lv, (C9*)(E9x15*), ABISELECT(16,12), "G9x15y6");
    check_base_class_offset(lv, (D0*)(E9x15*), ABISELECT(36,28), "G9x15y6");
    check_base_class_offset(lv, (E9x15*), 0, "G9x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G9x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x15y6.ff");
    test_class_info(&lv, &cd_G9x15y6);
    dp->~G9x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x15y6(Test_G9x15y6, "G9x15y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G9x15y6C1Ev();
extern void _ZN7G9x15y6D1Ev();
Name_Map name_map_G9x15y6[] = {
  NSPAIR(_ZN7G9x15y6C1Ev),
  NSPAIR(_ZN7G9x15y6D1Ev),
  {0,0}
};
extern Class_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_E9x15;
extern VTBL_ENTRY _ZTI5E9x15[];
extern  VTBL_ENTRY _ZTV5E9x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x15y6[] = {
  // 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
    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(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_E9x15,    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 _ZTI7G9x15y6[];
extern void _ZN5E9x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv)();
extern void ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn12_N5E9x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G9x15y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x15y6[0]),
  (VTBL_ENTRY)&_ZN5E9x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G9x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv),
};
extern VTBL_ENTRY _ZTV7G9x15y6[];
extern void _ZN5E9x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x15__7G9x15y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x15[0]),
  (VTBL_ENTRY)&_ZN5E9x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv)();
extern void ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn12_N5E9x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C9__5E9x15__7G9x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E9x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__7G9x15y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x15y6[] = {
  {&(_ZTV7G9x15y6[6]),  6,12},
  {&(_tg__ZTV5E9x15__7G9x15y6[5]),  5,6},
  {&(_tg__ZTV2C9__5E9x15__7G9x15y6[4]),  4,5},
  {&(_ZTV7G9x15y6[11]),  11,12},
  {&(_tg__ZTV2C9__7G9x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x15y6[];
extern  VTBL_ENTRY _ZTV7G9x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x15y6[];
static VTBL_ENTRY alt_thunk_names573[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn12_N5E9x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn12_N5E9x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G9x15y6 = {  "G9x15y6", // class name
  bases_G9x15y6, 6,
  &(vtc_G9x15y6[0]), // expected_vtbl_contents
  &(vtt_G9x15y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G9x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x15y6),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x15y6),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names573,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x15y7  : virtual E9x15 , virtual F0 {
  int ff;
  ~G9x15y7(); // tgen
  G9x15y7(); // tgen
};
//SIG(1 G9x15y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G9x15y7 ::~G9x15y7(){ note_dtor("G9x15y7", this);} // tgen
G9x15y7 ::G9x15y7(){ note_ctor("G9x15y7", this);} // tgen

static void Test_G9x15y7()
{
  extern Class_Descriptor cd_G9x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G9x15y7, buf);
    G9x15y7 *dp, &lv = *(dp=new (buf) G9x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G9x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x15y7)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,16), "G9x15y7");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,28), "G9x15y7");
    check_base_class_offset(lv, (C9*)(E9x15*), ABISELECT(32,16), "G9x15y7");
    check_base_class_offset(lv, (D0*)(E9x15*), ABISELECT(52,32), "G9x15y7");
    check_base_class_offset(lv, (E9x15*), ABISELECT(16,8), "G9x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G9x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G9x15y7.ff");
    test_class_info(&lv, &cd_G9x15y7);
    dp->~G9x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x15y7(Test_G9x15y7, "G9x15y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G9x15y7C1Ev();
extern void _ZN7G9x15y7D1Ev();
Name_Map name_map_G9x15y7[] = {
  NSPAIR(_ZN7G9x15y7C1Ev),
  NSPAIR(_ZN7G9x15y7D1Ev),
  {0,0}
};
extern Class_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_E9x15;
extern VTBL_ENTRY _ZTI5E9x15[];
extern  VTBL_ENTRY _ZTV5E9x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E9x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x15y7[] = {
  // 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
    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
    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_E9x15,    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 _ZTI7G9x15y7[];
extern void _ZN5E9x153fooEv();
extern void ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv)();
extern void ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn8_N5E9x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G9x15y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G9x15y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G9x15y7[0]),
  (VTBL_ENTRY)&_ZN5E9x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G9x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv),
};
extern VTBL_ENTRY _ZTV7G9x15y7[];
extern void _ZN5E9x153fooEv();
static  VTBL_ENTRY _tg__ZTV5E9x15__7G9x15y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E9x15[0]),
  (VTBL_ENTRY)&_ZN5E9x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv)();
extern void ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn8_N5E9x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2C9__5E9x15__7G9x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E9x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__7G9x15y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x15y7[] = {
  {&(_ZTV7G9x15y7[7]),  7,19},
  {&(_ZTV7G9x15y7[13]),  13,19},
  {&(_ZTV7G9x15y7[18]),  18,19},
  {&(_tg__ZTV5E9x15__7G9x15y7[5]),  5,6},
  {&(_tg__ZTV2C9__5E9x15__7G9x15y7[4]),  4,5},
  {&(_tg__ZTV2C9__7G9x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G9x15y7[];
extern  VTBL_ENTRY _ZTV7G9x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G9x15y7[];
static VTBL_ENTRY alt_thunk_names574[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5E9x153fooEv,_ZTv0_n16_N5E9x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn8_N5E9x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5E9x153fooEv,_ZThn8_N5E9x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G9x15y7 = {  "G9x15y7", // class name
  bases_G9x15y7, 6,
  &(vtc_G9x15y7[0]), // expected_vtbl_contents
  &(vtt_G9x15y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G9x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G9x15y7),19, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G9x15y7),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names574,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E10x15  : virtual C10 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E10x153fooEv
  ~E10x15(); // tgen
  E10x15(); // tgen
};
//SIG(-1 E10x15) C1{ VBC2{ VBC3{ Fi} VBC4{ Fi} Fi} VBC5{ Fi} v1 Fi}


void  E10x15 ::foo(){vfunc_called(this, "_ZN6E10x153fooEv");}
E10x15 ::~E10x15(){ note_dtor("E10x15", this);} // tgen
E10x15 ::E10x15(){ note_ctor("E10x15", this);} // tgen

static void Test_E10x15()
{
  extern Class_Descriptor cd_E10x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E10x15, buf);
    E10x15 *dp, &lv = *(dp=new (buf) E10x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E10x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E10x15)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(28,16), "E10x15");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(32,20), "E10x15");
    check_base_class_offset(lv, (C10*), ABISELECT(16,8), "E10x15");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E10x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E10x15.fd");
    test_class_info(&lv, &cd_E10x15);
    dp->~E10x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE10x15(Test_E10x15, "E10x15", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E10x15C1Ev();
extern void _ZN6E10x15D1Ev();
Name_Map name_map_E10x15[] = {
  NSPAIR(_ZN6E10x15C1Ev),
  NSPAIR(_ZN6E10x15D1Ev),
  {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_E10x15[] = {
  // 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
    7, //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 _ZTI6E10x15[];
extern void _ZN6E10x153fooEv();
static  VTBL_ENTRY vtc_E10x15[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x15[0]),
  (VTBL_ENTRY)&_ZN6E10x153fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E10x15[0]),
};
extern VTBL_ENTRY _ZTV6E10x15[];
static  VTBL_ENTRY _tg__ZTV3C10__6E10x15[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_E10x15[] = {
  {&(_ZTV6E10x15[6]),  6,11},
  {&(_ZTV6E10x15[11]),  11,11},
  {&(_tg__ZTV3C10__6E10x15[4]),  4,4},
};
extern VTBL_ENTRY _ZTI6E10x15[];
extern  VTBL_ENTRY _ZTV6E10x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x15[];
Class_Descriptor cd_E10x15 = {  "E10x15", // class name
  bases_E10x15, 4,
  &(vtc_E10x15[0]), // expected_vtbl_contents
  &(vtt_E10x15[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E10x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E10x15),11, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E10x15),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  G10x15y0  : E10x15 , F1 {
  int ff;
  ~G10x15y0(); // tgen
  G10x15y0(); // tgen
};
//SIG(1 G10x15y0) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G10x15y0 ::~G10x15y0(){ note_dtor("G10x15y0", this);} // tgen
G10x15y0 ::G10x15y0(){ note_ctor("G10x15y0", this);} // tgen

static void Test_G10x15y0()
{
  extern Class_Descriptor cd_G10x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G10x15y0, buf);
    G10x15y0 *dp, &lv = *(dp=new (buf) G10x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G10x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x15y0)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,28), "G10x15y0");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,32), "G10x15y0");
    check_base_class_offset(lv, (C10*)(E10x15*), ABISELECT(32,20), "G10x15y0");
    check_base_class_offset(lv, (D0*)(E10x15*), ABISELECT(52,36), "G10x15y0");
    check_base_class_offset(lv, (E10x15*), 0, "G10x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G10x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G10x15y0.ff");
    test_class_info(&lv, &cd_G10x15y0);
    dp->~G10x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x15y0(Test_G10x15y0, "G10x15y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G10x15y0C1Ev();
extern void _ZN8G10x15y0D1Ev();
Name_Map name_map_G10x15y0[] = {
  NSPAIR(_ZN8G10x15y0C1Ev),
  NSPAIR(_ZN8G10x15y0D1Ev),
  {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_E10x15;
extern VTBL_ENTRY _ZTI6E10x15[];
extern  VTBL_ENTRY _ZTV6E10x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x15y0[] = {
  // 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
    10, //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_E10x15,    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
    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
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8G10x15y0[];
extern void _ZN6E10x153fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x15y0[0]),
  (VTBL_ENTRY)&_ZN6E10x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G10x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G10x15y0[0]),
};
extern VTBL_ENTRY _ZTV8G10x15y0[];
extern void _ZN6E10x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x15__8G10x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x15[0]),
  (VTBL_ENTRY)&_ZN6E10x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C10__6E10x15__8G10x15y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E10x15[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__8G10x15y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x15y0[] = {
  {&(_ZTV8G10x15y0[6]),  6,14},
  {&(_tg__ZTV6E10x15__8G10x15y0[6]),  6,7},
  {&(_tg__ZTV3C10__6E10x15__8G10x15y0[4]),  4,4},
  {&(_ZTV8G10x15y0[14]),  14,14},
  {&(_tg__ZTV3C10__8G10x15y0[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x15y0[];
extern  VTBL_ENTRY _ZTV8G10x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x15y0[];
Class_Descriptor cd_G10x15y0 = {  "G10x15y0", // class name
  bases_G10x15y0, 6,
  &(vtc_G10x15y0[0]), // expected_vtbl_contents
  &(vtt_G10x15y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G10x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x15y0),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x15y0),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  G10x15y1  : virtual E10x15 , F1 {
  int ff;
  ~G10x15y1(); // tgen
  G10x15y1(); // tgen
};
//SIG(1 G10x15y1) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G10x15y1 ::~G10x15y1(){ note_dtor("G10x15y1", this);} // tgen
G10x15y1 ::G10x15y1(){ note_ctor("G10x15y1", this);} // tgen

static void Test_G10x15y1()
{
  extern Class_Descriptor cd_G10x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G10x15y1, buf);
    G10x15y1 *dp, &lv = *(dp=new (buf) G10x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G10x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x15y1)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,28), "G10x15y1");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,32), "G10x15y1");
    check_base_class_offset(lv, (C10*)(E10x15*), ABISELECT(32,20), "G10x15y1");
    check_base_class_offset(lv, (D0*)(E10x15*), ABISELECT(52,36), "G10x15y1");
    check_base_class_offset(lv, (E10x15*), ABISELECT(16,12), "G10x15y1");
    check_base_class_offset(lv, (F1*), 0, "G10x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x15y1.ff");
    test_class_info(&lv, &cd_G10x15y1);
    dp->~G10x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x15y1(Test_G10x15y1, "G10x15y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G10x15y1C1Ev();
extern void _ZN8G10x15y1D1Ev();
Name_Map name_map_G10x15y1[] = {
  NSPAIR(_ZN8G10x15y1C1Ev),
  NSPAIR(_ZN8G10x15y1D1Ev),
  {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_E10x15;
extern VTBL_ENTRY _ZTI6E10x15[];
extern  VTBL_ENTRY _ZTV6E10x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x15y1[] = {
  // 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
    16, //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_E10x15,    ABISELECT(16,12), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G10x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E10x153fooEv();
static  VTBL_ENTRY vtc_G10x15y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G10x15y1[0]),
  (VTBL_ENTRY)&_ZN6E10x153fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G10x15y1[0]),
};
extern VTBL_ENTRY _ZTV8G10x15y1[];
extern void _ZN6E10x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x15__8G10x15y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x15[0]),
  (VTBL_ENTRY)&_ZN6E10x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C10__6E10x15__8G10x15y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E10x15[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__8G10x15y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x15y1[] = {
  {&(_ZTV8G10x15y1[7]),  7,20},
  {&(_ZTV8G10x15y1[15]),  15,20},
  {&(_ZTV8G10x15y1[20]),  20,20},
  {&(_tg__ZTV6E10x15__8G10x15y1[6]),  6,7},
  {&(_tg__ZTV3C10__6E10x15__8G10x15y1[4]),  4,4},
  {&(_tg__ZTV3C10__8G10x15y1[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x15y1[];
extern  VTBL_ENTRY _ZTV8G10x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x15y1[];
Class_Descriptor cd_G10x15y1 = {  "G10x15y1", // class name
  bases_G10x15y1, 6,
  &(vtc_G10x15y1[0]), // expected_vtbl_contents
  &(vtt_G10x15y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G10x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x15y1),20, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x15y1),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  G10x15y2  : E10x15 , virtual F1 {
  int ff;
  ~G10x15y2(); // tgen
  G10x15y2(); // tgen
};
//SIG(1 G10x15y2) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G10x15y2 ::~G10x15y2(){ note_dtor("G10x15y2", this);} // tgen
G10x15y2 ::G10x15y2(){ note_ctor("G10x15y2", this);} // tgen

static void Test_G10x15y2()
{
  extern Class_Descriptor cd_G10x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G10x15y2, buf);
    G10x15y2 *dp, &lv = *(dp=new (buf) G10x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G10x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x15y2)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(28,20), "G10x15y2");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(32,24), "G10x15y2");
    check_base_class_offset(lv, (C10*)(E10x15*), ABISELECT(16,12), "G10x15y2");
    check_base_class_offset(lv, (D0*)(E10x15*), ABISELECT(36,28), "G10x15y2");
    check_base_class_offset(lv, (E10x15*), 0, "G10x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G10x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x15y2.ff");
    test_class_info(&lv, &cd_G10x15y2);
    dp->~G10x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x15y2(Test_G10x15y2, "G10x15y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G10x15y2C1Ev();
extern void _ZN8G10x15y2D1Ev();
Name_Map name_map_G10x15y2[] = {
  NSPAIR(_ZN8G10x15y2C1Ev),
  NSPAIR(_ZN8G10x15y2D1Ev),
  {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_E10x15;
extern VTBL_ENTRY _ZTI6E10x15[];
extern  VTBL_ENTRY _ZTV6E10x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x15y2[] = {
  // 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
    8, //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_E10x15,    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
    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 _ZTI8G10x15y2[];
extern void _ZN6E10x153fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x15y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x15y2[0]),
  (VTBL_ENTRY)&_ZN6E10x153fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G10x15y2[0]),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G10x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G10x15y2[];
extern void _ZN6E10x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x15__8G10x15y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x15[0]),
  (VTBL_ENTRY)&_ZN6E10x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C10__6E10x15__8G10x15y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E10x15[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__8G10x15y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x15y2[] = {
  {&(_ZTV8G10x15y2[7]),  7,16},
  {&(_tg__ZTV6E10x15__8G10x15y2[6]),  6,7},
  {&(_tg__ZTV3C10__6E10x15__8G10x15y2[4]),  4,4},
  {&(_ZTV8G10x15y2[12]),  12,16},
  {&(_ZTV8G10x15y2[15]),  15,16},
  {&(_tg__ZTV3C10__8G10x15y2[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x15y2[];
extern  VTBL_ENTRY _ZTV8G10x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x15y2[];
Class_Descriptor cd_G10x15y2 = {  "G10x15y2", // class name
  bases_G10x15y2, 6,
  &(vtc_G10x15y2[0]), // expected_vtbl_contents
  &(vtt_G10x15y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G10x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x15y2),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x15y2),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  G10x15y3  : virtual E10x15 , virtual F1 {
  int ff;
  ~G10x15y3(); // tgen
  G10x15y3(); // tgen
};
//SIG(1 G10x15y3) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G10x15y3 ::~G10x15y3(){ note_dtor("G10x15y3", this);} // tgen
G10x15y3 ::G10x15y3(){ note_ctor("G10x15y3", this);} // tgen

static void Test_G10x15y3()
{
  extern Class_Descriptor cd_G10x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G10x15y3, buf);
    G10x15y3 *dp, &lv = *(dp=new (buf) G10x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G10x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x15y3)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,24), "G10x15y3");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,28), "G10x15y3");
    check_base_class_offset(lv, (C10*)(E10x15*), ABISELECT(32,16), "G10x15y3");
    check_base_class_offset(lv, (D0*)(E10x15*), ABISELECT(52,32), "G10x15y3");
    check_base_class_offset(lv, (E10x15*), ABISELECT(16,8), "G10x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G10x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G10x15y3.ff");
    test_class_info(&lv, &cd_G10x15y3);
    dp->~G10x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x15y3(Test_G10x15y3, "G10x15y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G10x15y3C1Ev();
extern void _ZN8G10x15y3D1Ev();
Name_Map name_map_G10x15y3[] = {
  NSPAIR(_ZN8G10x15y3C1Ev),
  NSPAIR(_ZN8G10x15y3D1Ev),
  {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_E10x15;
extern VTBL_ENTRY _ZTI6E10x15[];
extern  VTBL_ENTRY _ZTV6E10x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x15y3[] = {
  // 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
    16, //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_E10x15,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G10x15y3[];
extern void _ZN6E10x153fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x15y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x15y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G10x15y3[0]),
  (VTBL_ENTRY)&_ZN6E10x153fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G10x15y3[0]),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G10x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G10x15y3[];
extern void _ZN6E10x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x15__8G10x15y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x15[0]),
  (VTBL_ENTRY)&_ZN6E10x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C10__6E10x15__8G10x15y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E10x15[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__8G10x15y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x15y3[] = {
  {&(_ZTV8G10x15y3[8]),  8,24},
  {&(_ZTV8G10x15y3[15]),  15,24},
  {&(_ZTV8G10x15y3[20]),  20,24},
  {&(_ZTV8G10x15y3[23]),  23,24},
  {&(_tg__ZTV6E10x15__8G10x15y3[6]),  6,7},
  {&(_tg__ZTV3C10__6E10x15__8G10x15y3[4]),  4,4},
  {&(_tg__ZTV3C10__8G10x15y3[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x15y3[];
extern  VTBL_ENTRY _ZTV8G10x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x15y3[];
Class_Descriptor cd_G10x15y3 = {  "G10x15y3", // class name
  bases_G10x15y3, 6,
  &(vtc_G10x15y3[0]), // expected_vtbl_contents
  &(vtt_G10x15y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G10x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x15y3),24, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x15y3),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  G10x15y4  : E10x15 , F0 {
  int ff;
  ~G10x15y4(); // tgen
  G10x15y4(); // tgen
};
//SIG(1 G10x15y4) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G10x15y4 ::~G10x15y4(){ note_dtor("G10x15y4", this);} // tgen
G10x15y4 ::G10x15y4(){ note_ctor("G10x15y4", this);} // tgen

static void Test_G10x15y4()
{
  extern Class_Descriptor cd_G10x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x15y4, buf);
    G10x15y4 *dp, &lv = *(dp=new (buf) G10x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x15y4)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(36,24), "G10x15y4");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(40,28), "G10x15y4");
    check_base_class_offset(lv, (C10*)(E10x15*), ABISELECT(24,16), "G10x15y4");
    check_base_class_offset(lv, (D0*)(E10x15*), ABISELECT(44,32), "G10x15y4");
    check_base_class_offset(lv, (E10x15*), 0, "G10x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G10x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G10x15y4.ff");
    test_class_info(&lv, &cd_G10x15y4);
    dp->~G10x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x15y4(Test_G10x15y4, "G10x15y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G10x15y4C1Ev();
extern void _ZN8G10x15y4D1Ev();
Name_Map name_map_G10x15y4[] = {
  NSPAIR(_ZN8G10x15y4C1Ev),
  NSPAIR(_ZN8G10x15y4D1Ev),
  {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_E10x15;
extern VTBL_ENTRY _ZTI6E10x15[];
extern  VTBL_ENTRY _ZTV6E10x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x15y4[] = {
  // 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
    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(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_E10x15,    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 _ZTI8G10x15y4[];
extern void _ZN6E10x153fooEv();
static  VTBL_ENTRY vtc_G10x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x15y4[0]),
  (VTBL_ENTRY)&_ZN6E10x153fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G10x15y4[0]),
};
extern VTBL_ENTRY _ZTV8G10x15y4[];
extern void _ZN6E10x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x15__8G10x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x15[0]),
  (VTBL_ENTRY)&_ZN6E10x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C10__6E10x15__8G10x15y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E10x15[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__8G10x15y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x15y4[] = {
  {&(_ZTV8G10x15y4[6]),  6,11},
  {&(_tg__ZTV6E10x15__8G10x15y4[6]),  6,7},
  {&(_tg__ZTV3C10__6E10x15__8G10x15y4[4]),  4,4},
  {&(_ZTV8G10x15y4[11]),  11,11},
  {&(_tg__ZTV3C10__8G10x15y4[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x15y4[];
extern  VTBL_ENTRY _ZTV8G10x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x15y4[];
Class_Descriptor cd_G10x15y4 = {  "G10x15y4", // class name
  bases_G10x15y4, 6,
  &(vtc_G10x15y4[0]), // expected_vtbl_contents
  &(vtt_G10x15y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G10x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x15y4),11, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x15y4),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  G10x15y5  : virtual E10x15 , F0 {
  int ff;
  ~G10x15y5(); // tgen
  G10x15y5(); // tgen
};
//SIG(1 G10x15y5) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G10x15y5 ::~G10x15y5(){ note_dtor("G10x15y5", this);} // tgen
G10x15y5 ::G10x15y5(){ note_ctor("G10x15y5", this);} // tgen

static void Test_G10x15y5()
{
  extern Class_Descriptor cd_G10x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G10x15y5, buf);
    G10x15y5 *dp, &lv = *(dp=new (buf) G10x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G10x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x15y5)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,28), "G10x15y5");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,32), "G10x15y5");
    check_base_class_offset(lv, (C10*)(E10x15*), ABISELECT(32,20), "G10x15y5");
    check_base_class_offset(lv, (D0*)(E10x15*), ABISELECT(52,36), "G10x15y5");
    check_base_class_offset(lv, (E10x15*), ABISELECT(16,12), "G10x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G10x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x15y5.ff");
    test_class_info(&lv, &cd_G10x15y5);
    dp->~G10x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x15y5(Test_G10x15y5, "G10x15y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G10x15y5C1Ev();
extern void _ZN8G10x15y5D1Ev();
Name_Map name_map_G10x15y5[] = {
  NSPAIR(_ZN8G10x15y5C1Ev),
  NSPAIR(_ZN8G10x15y5D1Ev),
  {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_E10x15;
extern VTBL_ENTRY _ZTI6E10x15[];
extern  VTBL_ENTRY _ZTV6E10x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x15y5[] = {
  // 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
    15, //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_E10x15,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G10x15y5[];
extern void _ZN6E10x153fooEv();
static  VTBL_ENTRY vtc_G10x15y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x15y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G10x15y5[0]),
  (VTBL_ENTRY)&_ZN6E10x153fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G10x15y5[0]),
};
extern VTBL_ENTRY _ZTV8G10x15y5[];
extern void _ZN6E10x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x15__8G10x15y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x15[0]),
  (VTBL_ENTRY)&_ZN6E10x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C10__6E10x15__8G10x15y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E10x15[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__8G10x15y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x15y5[] = {
  {&(_ZTV8G10x15y5[7]),  7,19},
  {&(_ZTV8G10x15y5[14]),  14,19},
  {&(_ZTV8G10x15y5[19]),  19,19},
  {&(_tg__ZTV6E10x15__8G10x15y5[6]),  6,7},
  {&(_tg__ZTV3C10__6E10x15__8G10x15y5[4]),  4,4},
  {&(_tg__ZTV3C10__8G10x15y5[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x15y5[];
extern  VTBL_ENTRY _ZTV8G10x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x15y5[];
Class_Descriptor cd_G10x15y5 = {  "G10x15y5", // class name
  bases_G10x15y5, 6,
  &(vtc_G10x15y5[0]), // expected_vtbl_contents
  &(vtt_G10x15y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G10x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x15y5),19, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x15y5),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  G10x15y6  : E10x15 , virtual F0 {
  int ff;
  ~G10x15y6(); // tgen
  G10x15y6(); // tgen
};
//SIG(1 G10x15y6) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G10x15y6 ::~G10x15y6(){ note_dtor("G10x15y6", this);} // tgen
G10x15y6 ::G10x15y6(){ note_ctor("G10x15y6", this);} // tgen

static void Test_G10x15y6()
{
  extern Class_Descriptor cd_G10x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x15y6, buf);
    G10x15y6 *dp, &lv = *(dp=new (buf) G10x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x15y6)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(28,20), "G10x15y6");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(32,24), "G10x15y6");
    check_base_class_offset(lv, (C10*)(E10x15*), ABISELECT(16,12), "G10x15y6");
    check_base_class_offset(lv, (D0*)(E10x15*), ABISELECT(36,28), "G10x15y6");
    check_base_class_offset(lv, (E10x15*), 0, "G10x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G10x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x15y6.ff");
    test_class_info(&lv, &cd_G10x15y6);
    dp->~G10x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x15y6(Test_G10x15y6, "G10x15y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G10x15y6C1Ev();
extern void _ZN8G10x15y6D1Ev();
Name_Map name_map_G10x15y6[] = {
  NSPAIR(_ZN8G10x15y6C1Ev),
  NSPAIR(_ZN8G10x15y6D1Ev),
  {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_E10x15;
extern VTBL_ENTRY _ZTI6E10x15[];
extern  VTBL_ENTRY _ZTV6E10x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x15y6[] = {
  // 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
    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(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_E10x15,    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 _ZTI8G10x15y6[];
extern void _ZN6E10x153fooEv();
static  VTBL_ENTRY vtc_G10x15y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x15y6[0]),
  (VTBL_ENTRY)&_ZN6E10x153fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G10x15y6[0]),
};
extern VTBL_ENTRY _ZTV8G10x15y6[];
extern void _ZN6E10x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x15__8G10x15y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x15[0]),
  (VTBL_ENTRY)&_ZN6E10x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C10__6E10x15__8G10x15y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E10x15[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__8G10x15y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x15y6[] = {
  {&(_ZTV8G10x15y6[7]),  7,12},
  {&(_tg__ZTV6E10x15__8G10x15y6[6]),  6,7},
  {&(_tg__ZTV3C10__6E10x15__8G10x15y6[4]),  4,4},
  {&(_ZTV8G10x15y6[12]),  12,12},
  {&(_tg__ZTV3C10__8G10x15y6[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x15y6[];
extern  VTBL_ENTRY _ZTV8G10x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x15y6[];
Class_Descriptor cd_G10x15y6 = {  "G10x15y6", // class name
  bases_G10x15y6, 6,
  &(vtc_G10x15y6[0]), // expected_vtbl_contents
  &(vtt_G10x15y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G10x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x15y6),12, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x15y6),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  G10x15y7  : virtual E10x15 , virtual F0 {
  int ff;
  ~G10x15y7(); // tgen
  G10x15y7(); // tgen
};
//SIG(1 G10x15y7) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G10x15y7 ::~G10x15y7(){ note_dtor("G10x15y7", this);} // tgen
G10x15y7 ::G10x15y7(){ note_ctor("G10x15y7", this);} // tgen

static void Test_G10x15y7()
{
  extern Class_Descriptor cd_G10x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G10x15y7, buf);
    G10x15y7 *dp, &lv = *(dp=new (buf) G10x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G10x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x15y7)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,24), "G10x15y7");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,28), "G10x15y7");
    check_base_class_offset(lv, (C10*)(E10x15*), ABISELECT(32,16), "G10x15y7");
    check_base_class_offset(lv, (D0*)(E10x15*), ABISELECT(52,32), "G10x15y7");
    check_base_class_offset(lv, (E10x15*), ABISELECT(16,8), "G10x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G10x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G10x15y7.ff");
    test_class_info(&lv, &cd_G10x15y7);
    dp->~G10x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x15y7(Test_G10x15y7, "G10x15y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G10x15y7C1Ev();
extern void _ZN8G10x15y7D1Ev();
Name_Map name_map_G10x15y7[] = {
  NSPAIR(_ZN8G10x15y7C1Ev),
  NSPAIR(_ZN8G10x15y7D1Ev),
  {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_E10x15;
extern VTBL_ENTRY _ZTI6E10x15[];
extern  VTBL_ENTRY _ZTV6E10x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E10x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x15y7[] = {
  // 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
    16, //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_E10x15,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G10x15y7[];
extern void _ZN6E10x153fooEv();
static  VTBL_ENTRY vtc_G10x15y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G10x15y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G10x15y7[0]),
  (VTBL_ENTRY)&_ZN6E10x153fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G10x15y7[0]),
};
extern VTBL_ENTRY _ZTV8G10x15y7[];
extern void _ZN6E10x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E10x15__8G10x15y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E10x15[0]),
  (VTBL_ENTRY)&_ZN6E10x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C10__6E10x15__8G10x15y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E10x15[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__8G10x15y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x15y7[] = {
  {&(_ZTV8G10x15y7[8]),  8,20},
  {&(_ZTV8G10x15y7[15]),  15,20},
  {&(_ZTV8G10x15y7[20]),  20,20},
  {&(_tg__ZTV6E10x15__8G10x15y7[6]),  6,7},
  {&(_tg__ZTV3C10__6E10x15__8G10x15y7[4]),  4,4},
  {&(_tg__ZTV3C10__8G10x15y7[4]),  4,4},
};
extern VTBL_ENTRY _ZTI8G10x15y7[];
extern  VTBL_ENTRY _ZTV8G10x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G10x15y7[];
Class_Descriptor cd_G10x15y7 = {  "G10x15y7", // class name
  bases_G10x15y7, 6,
  &(vtc_G10x15y7[0]), // expected_vtbl_contents
  &(vtt_G10x15y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G10x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G10x15y7),20, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G10x15y7),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  E11x15  : virtual C11 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E11x153fooEv
  ~E11x15(); // tgen
  E11x15(); // tgen
};
//SIG(-1 E11x15) C1{ VBC2{ VBC3{ v1 Fi} VBC4{ Fi} Fi} VBC5{ Fi} v1 Fi}


void  E11x15 ::foo(){vfunc_called(this, "_ZN6E11x153fooEv");}
E11x15 ::~E11x15(){ note_dtor("E11x15", this);} // tgen
E11x15 ::E11x15(){ note_ctor("E11x15", this);} // tgen

static void Test_E11x15()
{
  extern Class_Descriptor cd_E11x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_E11x15, buf);
    E11x15 *dp, &lv = *(dp=new (buf) E11x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(E11x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E11x15)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(32,16), "E11x15");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(44,24), "E11x15");
    check_base_class_offset(lv, (C11*), ABISELECT(16,8), "E11x15");
    check_base_class_offset(lv, (D0*), ABISELECT(48,28), "E11x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E11x15.fd");
    test_class_info(&lv, &cd_E11x15);
    dp->~E11x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE11x15(Test_E11x15, "E11x15", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN6E11x15C1Ev();
extern void _ZN6E11x15D1Ev();
Name_Map name_map_E11x15[] = {
  NSPAIR(_ZN6E11x15C1Ev),
  NSPAIR(_ZN6E11x15D1Ev),
  {0,0}
};
extern Class_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_E11x15[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //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,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //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
    7, //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 _ZTI6E11x15[];
extern void _ZN6E11x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv)();
extern void ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn16_N6E11x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E11x15[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
  (VTBL_ENTRY)&_ZN6E11x153fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv),
};
extern VTBL_ENTRY _ZTV6E11x15[];
static  VTBL_ENTRY _tg__ZTV3C11__6E11x15[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__6E11x15[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E11x15[] = {
  {&(_ZTV6E11x15[6]),  6,15},
  {&(_ZTV6E11x15[11]),  11,15},
  {&(_ZTV6E11x15[14]),  14,15},
  {&(_tg__ZTV3C11__6E11x15[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__6E11x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E11x15[];
extern  VTBL_ENTRY _ZTV6E11x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x15[];
static VTBL_ENTRY alt_thunk_names575[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn16_N6E11x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E11x15 = {  "E11x15", // class name
  bases_E11x15, 4,
  &(vtc_E11x15[0]), // expected_vtbl_contents
  &(vtt_E11x15[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI6E11x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E11x15),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E11x15),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names575,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x15y0  : E11x15 , F1 {
  int ff;
  ~G11x15y0(); // tgen
  G11x15y0(); // tgen
};
//SIG(1 G11x15y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G11x15y0 ::~G11x15y0(){ note_dtor("G11x15y0", this);} // tgen
G11x15y0 ::G11x15y0(){ note_ctor("G11x15y0", this);} // tgen

static void Test_G11x15y0()
{
  extern Class_Descriptor cd_G11x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G11x15y0, buf);
    G11x15y0 *dp, &lv = *(dp=new (buf) G11x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G11x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x15y0)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,28), "G11x15y0");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,36), "G11x15y0");
    check_base_class_offset(lv, (C11*)(E11x15*), ABISELECT(32,20), "G11x15y0");
    check_base_class_offset(lv, (D0*)(E11x15*), ABISELECT(64,40), "G11x15y0");
    check_base_class_offset(lv, (E11x15*), 0, "G11x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G11x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G11x15y0.ff");
    test_class_info(&lv, &cd_G11x15y0);
    dp->~G11x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x15y0(Test_G11x15y0, "G11x15y0", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G11x15y0C1Ev();
extern void _ZN8G11x15y0D1Ev();
Name_Map name_map_G11x15y0[] = {
  NSPAIR(_ZN8G11x15y0C1Ev),
  NSPAIR(_ZN8G11x15y0D1Ev),
  {0,0}
};
extern Class_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_E11x15;
extern VTBL_ENTRY _ZTI6E11x15[];
extern  VTBL_ENTRY _ZTV6E11x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x15y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //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,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //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
    10, //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_E11x15,    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
    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
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8G11x15y0[];
extern void _ZN6E11x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv)();
extern void ABISELECT(_ZThn48_N6E11x153fooEv,_ZThn28_N6E11x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x15y0[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x15y0[0]),
  (VTBL_ENTRY)&_ZN6E11x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G11x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G11x15y0[0]),
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G11x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv),
};
extern VTBL_ENTRY _ZTV8G11x15y0[];
extern void _ZN6E11x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x15__8G11x15y0[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
  (VTBL_ENTRY)&_ZN6E11x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__6E11x15__8G11x15y0[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv)();
extern void ABISELECT(_ZThn48_N6E11x153fooEv,_ZThn28_N6E11x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x15__8G11x15y0[] = {
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C11__8G11x15y0[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__8G11x15y0[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x15y0[] = {
  {&(_ZTV8G11x15y0[6]),  6,18},
  {&(_tg__ZTV6E11x15__8G11x15y0[6]),  6,7},
  {&(_tg__ZTV3C11__6E11x15__8G11x15y0[4]),  4,4},
  {&(_tg__ZTV2A1__6E11x15__8G11x15y0[3]),  3,4},
  {&(_ZTV8G11x15y0[14]),  14,18},
  {&(_ZTV8G11x15y0[17]),  17,18},
  {&(_tg__ZTV3C11__8G11x15y0[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__8G11x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x15y0[];
extern  VTBL_ENTRY _ZTV8G11x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x15y0[];
static VTBL_ENTRY alt_thunk_names576[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E11x153fooEv,_ZThn28_N6E11x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E11x153fooEv,_ZThn28_N6E11x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x15y0 = {  "G11x15y0", // class name
  bases_G11x15y0, 6,
  &(vtc_G11x15y0[0]), // expected_vtbl_contents
  &(vtt_G11x15y0[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G11x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x15y0),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x15y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names576,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x15y1  : virtual E11x15 , F1 {
  int ff;
  ~G11x15y1(); // tgen
  G11x15y1(); // tgen
};
//SIG(1 G11x15y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G11x15y1 ::~G11x15y1(){ note_dtor("G11x15y1", this);} // tgen
G11x15y1 ::G11x15y1(){ note_ctor("G11x15y1", this);} // tgen

static void Test_G11x15y1()
{
  extern Class_Descriptor cd_G11x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G11x15y1, buf);
    G11x15y1 *dp, &lv = *(dp=new (buf) G11x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G11x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x15y1)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,28), "G11x15y1");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,36), "G11x15y1");
    check_base_class_offset(lv, (C11*)(E11x15*), ABISELECT(32,20), "G11x15y1");
    check_base_class_offset(lv, (D0*)(E11x15*), ABISELECT(64,40), "G11x15y1");
    check_base_class_offset(lv, (E11x15*), ABISELECT(16,12), "G11x15y1");
    check_base_class_offset(lv, (F1*), 0, "G11x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x15y1.ff");
    test_class_info(&lv, &cd_G11x15y1);
    dp->~G11x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x15y1(Test_G11x15y1, "G11x15y1", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G11x15y1C1Ev();
extern void _ZN8G11x15y1D1Ev();
Name_Map name_map_G11x15y1[] = {
  NSPAIR(_ZN8G11x15y1C1Ev),
  NSPAIR(_ZN8G11x15y1D1Ev),
  {0,0}
};
extern Class_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_E11x15;
extern VTBL_ENTRY _ZTI6E11x15[];
extern  VTBL_ENTRY _ZTV6E11x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x15y1[] = {
  // 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_C11,    ABISELECT(32,20), //bcp->offset
    16, //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_E11x15,    ABISELECT(16,12), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G11x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E11x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv)();
extern void ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn16_N6E11x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x15y1[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G11x15y1[0]),
  (VTBL_ENTRY)&_ZN6E11x153fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G11x15y1[0]),
  ABISELECT(-32,-16),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G11x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv),
};
extern VTBL_ENTRY _ZTV8G11x15y1[];
extern void _ZN6E11x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x15__8G11x15y1[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
  (VTBL_ENTRY)&_ZN6E11x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__6E11x15__8G11x15y1[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv)();
extern void ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn16_N6E11x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x15__8G11x15y1[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C11__8G11x15y1[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__8G11x15y1[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x15y1[] = {
  {&(_ZTV8G11x15y1[7]),  7,24},
  {&(_ZTV8G11x15y1[15]),  15,24},
  {&(_ZTV8G11x15y1[20]),  20,24},
  {&(_ZTV8G11x15y1[23]),  23,24},
  {&(_tg__ZTV6E11x15__8G11x15y1[6]),  6,7},
  {&(_tg__ZTV3C11__6E11x15__8G11x15y1[4]),  4,4},
  {&(_tg__ZTV2A1__6E11x15__8G11x15y1[3]),  3,4},
  {&(_tg__ZTV3C11__8G11x15y1[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__8G11x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x15y1[];
extern  VTBL_ENTRY _ZTV8G11x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x15y1[];
static VTBL_ENTRY alt_thunk_names577[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn16_N6E11x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn16_N6E11x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x15y1 = {  "G11x15y1", // class name
  bases_G11x15y1, 6,
  &(vtc_G11x15y1[0]), // expected_vtbl_contents
  &(vtt_G11x15y1[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G11x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x15y1),24, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x15y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names577,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x15y2  : E11x15 , virtual F1 {
  int ff;
  ~G11x15y2(); // tgen
  G11x15y2(); // tgen
};
//SIG(1 G11x15y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G11x15y2 ::~G11x15y2(){ note_dtor("G11x15y2", this);} // tgen
G11x15y2 ::G11x15y2(){ note_ctor("G11x15y2", this);} // tgen

static void Test_G11x15y2()
{
  extern Class_Descriptor cd_G11x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G11x15y2, buf);
    G11x15y2 *dp, &lv = *(dp=new (buf) G11x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G11x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x15y2)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(32,20), "G11x15y2");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(44,28), "G11x15y2");
    check_base_class_offset(lv, (C11*)(E11x15*), ABISELECT(16,12), "G11x15y2");
    check_base_class_offset(lv, (D0*)(E11x15*), ABISELECT(48,32), "G11x15y2");
    check_base_class_offset(lv, (E11x15*), 0, "G11x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G11x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x15y2.ff");
    test_class_info(&lv, &cd_G11x15y2);
    dp->~G11x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x15y2(Test_G11x15y2, "G11x15y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G11x15y2C1Ev();
extern void _ZN8G11x15y2D1Ev();
Name_Map name_map_G11x15y2[] = {
  NSPAIR(_ZN8G11x15y2C1Ev),
  NSPAIR(_ZN8G11x15y2D1Ev),
  {0,0}
};
extern Class_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_E11x15;
extern VTBL_ENTRY _ZTI6E11x15[];
extern  VTBL_ENTRY _ZTV6E11x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x15y2[] = {
  // 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)
    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
    8, //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_E11x15,    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
    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 _ZTI8G11x15y2[];
extern void _ZN6E11x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv)();
extern void ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn20_N6E11x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G11x15y2[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x15y2[0]),
  (VTBL_ENTRY)&_ZN6E11x153fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G11x15y2[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G11x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G11x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G11x15y2[];
extern void _ZN6E11x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x15__8G11x15y2[] = {
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
  (VTBL_ENTRY)&_ZN6E11x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__6E11x15__8G11x15y2[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv)();
extern void ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn20_N6E11x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x15__8G11x15y2[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C11__8G11x15y2[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__8G11x15y2[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x15y2[] = {
  {&(_ZTV8G11x15y2[7]),  7,20},
  {&(_tg__ZTV6E11x15__8G11x15y2[6]),  6,7},
  {&(_tg__ZTV3C11__6E11x15__8G11x15y2[4]),  4,4},
  {&(_tg__ZTV2A1__6E11x15__8G11x15y2[3]),  3,4},
  {&(_ZTV8G11x15y2[12]),  12,20},
  {&(_ZTV8G11x15y2[15]),  15,20},
  {&(_ZTV8G11x15y2[19]),  19,20},
  {&(_tg__ZTV3C11__8G11x15y2[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__8G11x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x15y2[];
extern  VTBL_ENTRY _ZTV8G11x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x15y2[];
static VTBL_ENTRY alt_thunk_names578[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn20_N6E11x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn20_N6E11x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x15y2 = {  "G11x15y2", // class name
  bases_G11x15y2, 6,
  &(vtc_G11x15y2[0]), // expected_vtbl_contents
  &(vtt_G11x15y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G11x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x15y2),20, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x15y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names578,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x15y3  : virtual E11x15 , virtual F1 {
  int ff;
  ~G11x15y3(); // tgen
  G11x15y3(); // tgen
};
//SIG(1 G11x15y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G11x15y3 ::~G11x15y3(){ note_dtor("G11x15y3", this);} // tgen
G11x15y3 ::G11x15y3(){ note_ctor("G11x15y3", this);} // tgen

static void Test_G11x15y3()
{
  extern Class_Descriptor cd_G11x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G11x15y3, buf);
    G11x15y3 *dp, &lv = *(dp=new (buf) G11x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G11x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x15y3)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,24), "G11x15y3");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,32), "G11x15y3");
    check_base_class_offset(lv, (C11*)(E11x15*), ABISELECT(32,16), "G11x15y3");
    check_base_class_offset(lv, (D0*)(E11x15*), ABISELECT(64,36), "G11x15y3");
    check_base_class_offset(lv, (E11x15*), ABISELECT(16,8), "G11x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(72,40), "G11x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G11x15y3.ff");
    test_class_info(&lv, &cd_G11x15y3);
    dp->~G11x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x15y3(Test_G11x15y3, "G11x15y3", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN8G11x15y3C1Ev();
extern void _ZN8G11x15y3D1Ev();
Name_Map name_map_G11x15y3[] = {
  NSPAIR(_ZN8G11x15y3C1Ev),
  NSPAIR(_ZN8G11x15y3D1Ev),
  {0,0}
};
extern Class_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_E11x15;
extern VTBL_ENTRY _ZTI6E11x15[];
extern  VTBL_ENTRY _ZTV6E11x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x15y3[] = {
  // 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_C11,    ABISELECT(32,16), //bcp->offset
    16, //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_E11x15,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G11x15y3[];
extern void _ZN6E11x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv)();
extern void ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn16_N6E11x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G11x15y3[] = {
  ABISELECT(72,40),
  ABISELECT(64,36),
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x15y3[0]),
  0,
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G11x15y3[0]),
  (VTBL_ENTRY)&_ZN6E11x153fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G11x15y3[0]),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI8G11x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv),
  0,
  ABISELECT(-72,-40),
  (VTBL_ENTRY)&(_ZTI8G11x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G11x15y3[];
extern void _ZN6E11x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x15__8G11x15y3[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
  (VTBL_ENTRY)&_ZN6E11x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__6E11x15__8G11x15y3[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv)();
extern void ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn16_N6E11x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x15__8G11x15y3[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C11__8G11x15y3[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__8G11x15y3[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x15y3[] = {
  {&(_ZTV8G11x15y3[8]),  8,28},
  {&(_ZTV8G11x15y3[15]),  15,28},
  {&(_ZTV8G11x15y3[20]),  20,28},
  {&(_ZTV8G11x15y3[23]),  23,28},
  {&(_ZTV8G11x15y3[27]),  27,28},
  {&(_tg__ZTV6E11x15__8G11x15y3[6]),  6,7},
  {&(_tg__ZTV3C11__6E11x15__8G11x15y3[4]),  4,4},
  {&(_tg__ZTV2A1__6E11x15__8G11x15y3[3]),  3,4},
  {&(_tg__ZTV3C11__8G11x15y3[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__8G11x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x15y3[];
extern  VTBL_ENTRY _ZTV8G11x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x15y3[];
static VTBL_ENTRY alt_thunk_names579[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn16_N6E11x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn16_N6E11x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x15y3 = {  "G11x15y3", // class name
  bases_G11x15y3, 6,
  &(vtc_G11x15y3[0]), // expected_vtbl_contents
  &(vtt_G11x15y3[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI8G11x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x15y3),28, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x15y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names579,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x15y4  : E11x15 , F0 {
  int ff;
  ~G11x15y4(); // tgen
  G11x15y4(); // tgen
};
//SIG(1 G11x15y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G11x15y4 ::~G11x15y4(){ note_dtor("G11x15y4", this);} // tgen
G11x15y4 ::G11x15y4(){ note_ctor("G11x15y4", this);} // tgen

static void Test_G11x15y4()
{
  extern Class_Descriptor cd_G11x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G11x15y4, buf);
    G11x15y4 *dp, &lv = *(dp=new (buf) G11x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G11x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x15y4)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(40,24), "G11x15y4");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(52,32), "G11x15y4");
    check_base_class_offset(lv, (C11*)(E11x15*), ABISELECT(24,16), "G11x15y4");
    check_base_class_offset(lv, (D0*)(E11x15*), ABISELECT(56,36), "G11x15y4");
    check_base_class_offset(lv, (E11x15*), 0, "G11x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G11x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G11x15y4.ff");
    test_class_info(&lv, &cd_G11x15y4);
    dp->~G11x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x15y4(Test_G11x15y4, "G11x15y4", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G11x15y4C1Ev();
extern void _ZN8G11x15y4D1Ev();
Name_Map name_map_G11x15y4[] = {
  NSPAIR(_ZN8G11x15y4C1Ev),
  NSPAIR(_ZN8G11x15y4D1Ev),
  {0,0}
};
extern Class_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_E11x15;
extern VTBL_ENTRY _ZTI6E11x15[];
extern  VTBL_ENTRY _ZTV6E11x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x15y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,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(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
    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(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_E11x15,    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 _ZTI8G11x15y4[];
extern void _ZN6E11x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv)();
extern void ABISELECT(_ZThn40_N6E11x153fooEv,_ZThn24_N6E11x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x15y4[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x15y4[0]),
  (VTBL_ENTRY)&_ZN6E11x153fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G11x15y4[0]),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G11x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv),
};
extern VTBL_ENTRY _ZTV8G11x15y4[];
extern void _ZN6E11x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x15__8G11x15y4[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
  (VTBL_ENTRY)&_ZN6E11x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__6E11x15__8G11x15y4[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv)();
extern void ABISELECT(_ZThn40_N6E11x153fooEv,_ZThn24_N6E11x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x15__8G11x15y4[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C11__8G11x15y4[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__8G11x15y4[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x15y4[] = {
  {&(_ZTV8G11x15y4[6]),  6,15},
  {&(_tg__ZTV6E11x15__8G11x15y4[6]),  6,7},
  {&(_tg__ZTV3C11__6E11x15__8G11x15y4[4]),  4,4},
  {&(_tg__ZTV2A1__6E11x15__8G11x15y4[3]),  3,4},
  {&(_ZTV8G11x15y4[11]),  11,15},
  {&(_ZTV8G11x15y4[14]),  14,15},
  {&(_tg__ZTV3C11__8G11x15y4[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__8G11x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x15y4[];
extern  VTBL_ENTRY _ZTV8G11x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x15y4[];
static VTBL_ENTRY alt_thunk_names580[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E11x153fooEv,_ZThn24_N6E11x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E11x153fooEv,_ZThn24_N6E11x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x15y4 = {  "G11x15y4", // class name
  bases_G11x15y4, 6,
  &(vtc_G11x15y4[0]), // expected_vtbl_contents
  &(vtt_G11x15y4[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G11x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x15y4),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x15y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names580,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x15y5  : virtual E11x15 , F0 {
  int ff;
  ~G11x15y5(); // tgen
  G11x15y5(); // tgen
};
//SIG(1 G11x15y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G11x15y5 ::~G11x15y5(){ note_dtor("G11x15y5", this);} // tgen
G11x15y5 ::G11x15y5(){ note_ctor("G11x15y5", this);} // tgen

static void Test_G11x15y5()
{
  extern Class_Descriptor cd_G11x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G11x15y5, buf);
    G11x15y5 *dp, &lv = *(dp=new (buf) G11x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G11x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x15y5)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,28), "G11x15y5");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,36), "G11x15y5");
    check_base_class_offset(lv, (C11*)(E11x15*), ABISELECT(32,20), "G11x15y5");
    check_base_class_offset(lv, (D0*)(E11x15*), ABISELECT(64,40), "G11x15y5");
    check_base_class_offset(lv, (E11x15*), ABISELECT(16,12), "G11x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G11x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x15y5.ff");
    test_class_info(&lv, &cd_G11x15y5);
    dp->~G11x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x15y5(Test_G11x15y5, "G11x15y5", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G11x15y5C1Ev();
extern void _ZN8G11x15y5D1Ev();
Name_Map name_map_G11x15y5[] = {
  NSPAIR(_ZN8G11x15y5C1Ev),
  NSPAIR(_ZN8G11x15y5D1Ev),
  {0,0}
};
extern Class_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_E11x15;
extern VTBL_ENTRY _ZTI6E11x15[];
extern  VTBL_ENTRY _ZTV6E11x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x15y5[] = {
  // 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_C11,    ABISELECT(32,20), //bcp->offset
    15, //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_E11x15,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G11x15y5[];
extern void _ZN6E11x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv)();
extern void ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn16_N6E11x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x15y5[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x15y5[0]),
  0,
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G11x15y5[0]),
  (VTBL_ENTRY)&_ZN6E11x153fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G11x15y5[0]),
  ABISELECT(-32,-16),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G11x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv),
};
extern VTBL_ENTRY _ZTV8G11x15y5[];
extern void _ZN6E11x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x15__8G11x15y5[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
  (VTBL_ENTRY)&_ZN6E11x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__6E11x15__8G11x15y5[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv)();
extern void ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn16_N6E11x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x15__8G11x15y5[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C11__8G11x15y5[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__8G11x15y5[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x15y5[] = {
  {&(_ZTV8G11x15y5[7]),  7,23},
  {&(_ZTV8G11x15y5[14]),  14,23},
  {&(_ZTV8G11x15y5[19]),  19,23},
  {&(_ZTV8G11x15y5[22]),  22,23},
  {&(_tg__ZTV6E11x15__8G11x15y5[6]),  6,7},
  {&(_tg__ZTV3C11__6E11x15__8G11x15y5[4]),  4,4},
  {&(_tg__ZTV2A1__6E11x15__8G11x15y5[3]),  3,4},
  {&(_tg__ZTV3C11__8G11x15y5[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__8G11x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x15y5[];
extern  VTBL_ENTRY _ZTV8G11x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x15y5[];
static VTBL_ENTRY alt_thunk_names581[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn16_N6E11x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn16_N6E11x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x15y5 = {  "G11x15y5", // class name
  bases_G11x15y5, 6,
  &(vtc_G11x15y5[0]), // expected_vtbl_contents
  &(vtt_G11x15y5[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G11x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x15y5),23, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x15y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names581,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x15y6  : E11x15 , virtual F0 {
  int ff;
  ~G11x15y6(); // tgen
  G11x15y6(); // tgen
};
//SIG(1 G11x15y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G11x15y6 ::~G11x15y6(){ note_dtor("G11x15y6", this);} // tgen
G11x15y6 ::G11x15y6(){ note_ctor("G11x15y6", this);} // tgen

static void Test_G11x15y6()
{
  extern Class_Descriptor cd_G11x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x15y6, buf);
    G11x15y6 *dp, &lv = *(dp=new (buf) G11x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x15y6)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(32,20), "G11x15y6");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(44,28), "G11x15y6");
    check_base_class_offset(lv, (C11*)(E11x15*), ABISELECT(16,12), "G11x15y6");
    check_base_class_offset(lv, (D0*)(E11x15*), ABISELECT(48,32), "G11x15y6");
    check_base_class_offset(lv, (E11x15*), 0, "G11x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G11x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x15y6.ff");
    test_class_info(&lv, &cd_G11x15y6);
    dp->~G11x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x15y6(Test_G11x15y6, "G11x15y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G11x15y6C1Ev();
extern void _ZN8G11x15y6D1Ev();
Name_Map name_map_G11x15y6[] = {
  NSPAIR(_ZN8G11x15y6C1Ev),
  NSPAIR(_ZN8G11x15y6D1Ev),
  {0,0}
};
extern Class_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_E11x15;
extern VTBL_ENTRY _ZTI6E11x15[];
extern  VTBL_ENTRY _ZTV6E11x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x15y6[] = {
  // 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)
    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
    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(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_E11x15,    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 _ZTI8G11x15y6[];
extern void _ZN6E11x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv)();
extern void ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn20_N6E11x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x15y6[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x15y6[0]),
  (VTBL_ENTRY)&_ZN6E11x153fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G11x15y6[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G11x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv),
};
extern VTBL_ENTRY _ZTV8G11x15y6[];
extern void _ZN6E11x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x15__8G11x15y6[] = {
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
  (VTBL_ENTRY)&_ZN6E11x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__6E11x15__8G11x15y6[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv)();
extern void ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn20_N6E11x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x15__8G11x15y6[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C11__8G11x15y6[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__8G11x15y6[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x15y6[] = {
  {&(_ZTV8G11x15y6[7]),  7,16},
  {&(_tg__ZTV6E11x15__8G11x15y6[6]),  6,7},
  {&(_tg__ZTV3C11__6E11x15__8G11x15y6[4]),  4,4},
  {&(_tg__ZTV2A1__6E11x15__8G11x15y6[3]),  3,4},
  {&(_ZTV8G11x15y6[12]),  12,16},
  {&(_ZTV8G11x15y6[15]),  15,16},
  {&(_tg__ZTV3C11__8G11x15y6[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__8G11x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x15y6[];
extern  VTBL_ENTRY _ZTV8G11x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x15y6[];
static VTBL_ENTRY alt_thunk_names582[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn20_N6E11x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn20_N6E11x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x15y6 = {  "G11x15y6", // class name
  bases_G11x15y6, 6,
  &(vtc_G11x15y6[0]), // expected_vtbl_contents
  &(vtt_G11x15y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G11x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x15y6),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x15y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names582,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x15y7  : virtual E11x15 , virtual F0 {
  int ff;
  ~G11x15y7(); // tgen
  G11x15y7(); // tgen
};
//SIG(1 G11x15y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G11x15y7 ::~G11x15y7(){ note_dtor("G11x15y7", this);} // tgen
G11x15y7 ::G11x15y7(){ note_ctor("G11x15y7", this);} // tgen

static void Test_G11x15y7()
{
  extern Class_Descriptor cd_G11x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G11x15y7, buf);
    G11x15y7 *dp, &lv = *(dp=new (buf) G11x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G11x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x15y7)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,24), "G11x15y7");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,32), "G11x15y7");
    check_base_class_offset(lv, (C11*)(E11x15*), ABISELECT(32,16), "G11x15y7");
    check_base_class_offset(lv, (D0*)(E11x15*), ABISELECT(64,36), "G11x15y7");
    check_base_class_offset(lv, (E11x15*), ABISELECT(16,8), "G11x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(68,40), "G11x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G11x15y7.ff");
    test_class_info(&lv, &cd_G11x15y7);
    dp->~G11x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x15y7(Test_G11x15y7, "G11x15y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G11x15y7C1Ev();
extern void _ZN8G11x15y7D1Ev();
Name_Map name_map_G11x15y7[] = {
  NSPAIR(_ZN8G11x15y7C1Ev),
  NSPAIR(_ZN8G11x15y7D1Ev),
  {0,0}
};
extern Class_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_E11x15;
extern VTBL_ENTRY _ZTI6E11x15[];
extern  VTBL_ENTRY _ZTV6E11x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E11x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x15y7[] = {
  // 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_C11,    ABISELECT(32,16), //bcp->offset
    16, //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_E11x15,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G11x15y7[];
extern void _ZN6E11x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv)();
extern void ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn16_N6E11x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G11x15y7[] = {
  ABISELECT(68,40),
  ABISELECT(64,36),
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G11x15y7[0]),
  0,
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G11x15y7[0]),
  (VTBL_ENTRY)&_ZN6E11x153fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G11x15y7[0]),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI8G11x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv),
};
extern VTBL_ENTRY _ZTV8G11x15y7[];
extern void _ZN6E11x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E11x15__8G11x15y7[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
  (VTBL_ENTRY)&_ZN6E11x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__6E11x15__8G11x15y7[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv)();
extern void ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn16_N6E11x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E11x15__8G11x15y7[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E11x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C11__8G11x15y7[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__8G11x15y7[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x15y7[] = {
  {&(_ZTV8G11x15y7[8]),  8,24},
  {&(_ZTV8G11x15y7[15]),  15,24},
  {&(_ZTV8G11x15y7[20]),  20,24},
  {&(_ZTV8G11x15y7[23]),  23,24},
  {&(_tg__ZTV6E11x15__8G11x15y7[6]),  6,7},
  {&(_tg__ZTV3C11__6E11x15__8G11x15y7[4]),  4,4},
  {&(_tg__ZTV2A1__6E11x15__8G11x15y7[3]),  3,4},
  {&(_tg__ZTV3C11__8G11x15y7[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__8G11x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G11x15y7[];
extern  VTBL_ENTRY _ZTV8G11x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G11x15y7[];
static VTBL_ENTRY alt_thunk_names583[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E11x153fooEv,_ZTv0_n12_N6E11x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn16_N6E11x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E11x153fooEv,_ZThn16_N6E11x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G11x15y7 = {  "G11x15y7", // class name
  bases_G11x15y7, 6,
  &(vtc_G11x15y7[0]), // expected_vtbl_contents
  &(vtt_G11x15y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G11x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G11x15y7),24, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G11x15y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names583,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E12x15  : virtual C12 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E12x153fooEv
  ~E12x15(); // tgen
  E12x15(); // tgen
};
//SIG(-1 E12x15) C1{ VBC2{ BC3{ Fi} VBC4{ v1 Fi} Fi} VBC5{ Fi} v1 Fi}


void  E12x15 ::foo(){vfunc_called(this, "_ZN6E12x153fooEv");}
E12x15 ::~E12x15(){ note_dtor("E12x15", this);} // tgen
E12x15 ::E12x15(){ note_ctor("E12x15", this);} // tgen

static void Test_E12x15()
{
  extern Class_Descriptor cd_E12x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E12x15, buf);
    E12x15 *dp, &lv = *(dp=new (buf) E12x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E12x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E12x15)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(24,12), "E12x15");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(32,20), "E12x15");
    check_base_class_offset(lv, (C12*), ABISELECT(16,8), "E12x15");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E12x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E12x15.fd");
    test_class_info(&lv, &cd_E12x15);
    dp->~E12x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE12x15(Test_E12x15, "E12x15", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E12x15C1Ev();
extern void _ZN6E12x15D1Ev();
Name_Map name_map_E12x15[] = {
  NSPAIR(_ZN6E12x15C1Ev),
  NSPAIR(_ZN6E12x15D1Ev),
  {0,0}
};
extern Class_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_E12x15[] = {
  // 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
    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,8), //bcp->offset
    6, //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 _ZTI6E12x15[];
extern void _ZN6E12x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv)();
extern void ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn20_N6E12x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E12x15[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
  (VTBL_ENTRY)&_ZN6E12x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv),
};
extern VTBL_ENTRY _ZTV6E12x15[];
static  VTBL_ENTRY _tg__ZTV3C12__6E12x15[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__6E12x15[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E12x15[] = {
  {&(_ZTV6E12x15[5]),  5,13},
  {&(_ZTV6E12x15[9]),  9,13},
  {&(_ZTV6E12x15[12]),  12,13},
  {&(_tg__ZTV3C12__6E12x15[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__6E12x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E12x15[];
extern  VTBL_ENTRY _ZTV6E12x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x15[];
static VTBL_ENTRY alt_thunk_names584[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn20_N6E12x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E12x15 = {  "E12x15", // class name
  bases_E12x15, 4,
  &(vtc_E12x15[0]), // expected_vtbl_contents
  &(vtt_E12x15[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E12x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E12x15),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E12x15),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names584,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x15y0  : E12x15 , F1 {
  int ff;
  ~G12x15y0(); // tgen
  G12x15y0(); // tgen
};
//SIG(1 G12x15y0) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G12x15y0 ::~G12x15y0(){ note_dtor("G12x15y0", this);} // tgen
G12x15y0 ::G12x15y0(){ note_ctor("G12x15y0", this);} // tgen

static void Test_G12x15y0()
{
  extern Class_Descriptor cd_G12x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G12x15y0, buf);
    G12x15y0 *dp, &lv = *(dp=new (buf) G12x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G12x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x15y0)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,24), "G12x15y0");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,32), "G12x15y0");
    check_base_class_offset(lv, (C12*)(E12x15*), ABISELECT(32,20), "G12x15y0");
    check_base_class_offset(lv, (D0*)(E12x15*), ABISELECT(60,40), "G12x15y0");
    check_base_class_offset(lv, (E12x15*), 0, "G12x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G12x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G12x15y0.ff");
    test_class_info(&lv, &cd_G12x15y0);
    dp->~G12x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x15y0(Test_G12x15y0, "G12x15y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G12x15y0C1Ev();
extern void _ZN8G12x15y0D1Ev();
Name_Map name_map_G12x15y0[] = {
  NSPAIR(_ZN8G12x15y0C1Ev),
  NSPAIR(_ZN8G12x15y0D1Ev),
  {0,0}
};
extern Class_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_E12x15;
extern VTBL_ENTRY _ZTI6E12x15[];
extern  VTBL_ENTRY _ZTV6E12x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x15y0[] = {
  // 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
    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_C12,    ABISELECT(32,20), //bcp->offset
    9, //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_E12x15,    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
    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 _ZTI8G12x15y0[];
extern void _ZN6E12x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv)();
extern void ABISELECT(_ZThn48_N6E12x153fooEv,_ZThn32_N6E12x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x15y0[0]),
  (VTBL_ENTRY)&_ZN6E12x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G12x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G12x15y0[0]),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G12x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv),
};
extern VTBL_ENTRY _ZTV8G12x15y0[];
extern void _ZN6E12x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x15__8G12x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
  (VTBL_ENTRY)&_ZN6E12x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__6E12x15__8G12x15y0[] = {
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv)();
extern void ABISELECT(_ZThn48_N6E12x153fooEv,_ZThn32_N6E12x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x15__8G12x15y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C12__8G12x15y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__8G12x15y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x15y0[] = {
  {&(_ZTV8G12x15y0[5]),  5,16},
  {&(_tg__ZTV6E12x15__8G12x15y0[5]),  5,6},
  {&(_tg__ZTV3C12__6E12x15__8G12x15y0[3]),  3,3},
  {&(_tg__ZTV2B1__6E12x15__8G12x15y0[3]),  3,4},
  {&(_ZTV8G12x15y0[12]),  12,16},
  {&(_ZTV8G12x15y0[15]),  15,16},
  {&(_tg__ZTV3C12__8G12x15y0[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__8G12x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x15y0[];
extern  VTBL_ENTRY _ZTV8G12x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x15y0[];
static VTBL_ENTRY alt_thunk_names585[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E12x153fooEv,_ZThn32_N6E12x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E12x153fooEv,_ZThn32_N6E12x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x15y0 = {  "G12x15y0", // class name
  bases_G12x15y0, 6,
  &(vtc_G12x15y0[0]), // expected_vtbl_contents
  &(vtt_G12x15y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G12x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x15y0),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x15y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names585,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x15y1  : virtual E12x15 , F1 {
  int ff;
  ~G12x15y1(); // tgen
  G12x15y1(); // tgen
};
//SIG(1 G12x15y1) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G12x15y1 ::~G12x15y1(){ note_dtor("G12x15y1", this);} // tgen
G12x15y1 ::G12x15y1(){ note_ctor("G12x15y1", this);} // tgen

static void Test_G12x15y1()
{
  extern Class_Descriptor cd_G12x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G12x15y1, buf);
    G12x15y1 *dp, &lv = *(dp=new (buf) G12x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G12x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x15y1)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,24), "G12x15y1");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,32), "G12x15y1");
    check_base_class_offset(lv, (C12*)(E12x15*), ABISELECT(32,20), "G12x15y1");
    check_base_class_offset(lv, (D0*)(E12x15*), ABISELECT(60,40), "G12x15y1");
    check_base_class_offset(lv, (E12x15*), ABISELECT(16,12), "G12x15y1");
    check_base_class_offset(lv, (F1*), 0, "G12x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x15y1.ff");
    test_class_info(&lv, &cd_G12x15y1);
    dp->~G12x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x15y1(Test_G12x15y1, "G12x15y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G12x15y1C1Ev();
extern void _ZN8G12x15y1D1Ev();
Name_Map name_map_G12x15y1[] = {
  NSPAIR(_ZN8G12x15y1C1Ev),
  NSPAIR(_ZN8G12x15y1D1Ev),
  {0,0}
};
extern Class_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_E12x15;
extern VTBL_ENTRY _ZTI6E12x15[];
extern  VTBL_ENTRY _ZTV6E12x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x15y1[] = {
  // 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_C12,    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
    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_E12x15,    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_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 _ZTI8G12x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E12x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv)();
extern void ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn20_N6E12x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x15y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G12x15y1[0]),
  (VTBL_ENTRY)&_ZN6E12x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G12x15y1[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G12x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv),
};
extern VTBL_ENTRY _ZTV8G12x15y1[];
extern void _ZN6E12x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x15__8G12x15y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
  (VTBL_ENTRY)&_ZN6E12x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__6E12x15__8G12x15y1[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv)();
extern void ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn20_N6E12x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x15__8G12x15y1[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C12__8G12x15y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__8G12x15y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x15y1[] = {
  {&(_ZTV8G12x15y1[6]),  6,21},
  {&(_ZTV8G12x15y1[13]),  13,21},
  {&(_ZTV8G12x15y1[17]),  17,21},
  {&(_ZTV8G12x15y1[20]),  20,21},
  {&(_tg__ZTV6E12x15__8G12x15y1[5]),  5,6},
  {&(_tg__ZTV3C12__6E12x15__8G12x15y1[3]),  3,3},
  {&(_tg__ZTV2B1__6E12x15__8G12x15y1[3]),  3,4},
  {&(_tg__ZTV3C12__8G12x15y1[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__8G12x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x15y1[];
extern  VTBL_ENTRY _ZTV8G12x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x15y1[];
static VTBL_ENTRY alt_thunk_names586[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn20_N6E12x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn20_N6E12x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x15y1 = {  "G12x15y1", // class name
  bases_G12x15y1, 6,
  &(vtc_G12x15y1[0]), // expected_vtbl_contents
  &(vtt_G12x15y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G12x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x15y1),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x15y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names586,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x15y2  : E12x15 , virtual F1 {
  int ff;
  ~G12x15y2(); // tgen
  G12x15y2(); // tgen
};
//SIG(1 G12x15y2) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G12x15y2 ::~G12x15y2(){ note_dtor("G12x15y2", this);} // tgen
G12x15y2 ::G12x15y2(){ note_ctor("G12x15y2", this);} // tgen

static void Test_G12x15y2()
{
  extern Class_Descriptor cd_G12x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G12x15y2, buf);
    G12x15y2 *dp, &lv = *(dp=new (buf) G12x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G12x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x15y2)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(24,16), "G12x15y2");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(32,24), "G12x15y2");
    check_base_class_offset(lv, (C12*)(E12x15*), ABISELECT(16,12), "G12x15y2");
    check_base_class_offset(lv, (D0*)(E12x15*), ABISELECT(44,32), "G12x15y2");
    check_base_class_offset(lv, (E12x15*), 0, "G12x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G12x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x15y2.ff");
    test_class_info(&lv, &cd_G12x15y2);
    dp->~G12x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x15y2(Test_G12x15y2, "G12x15y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G12x15y2C1Ev();
extern void _ZN8G12x15y2D1Ev();
Name_Map name_map_G12x15y2[] = {
  NSPAIR(_ZN8G12x15y2C1Ev),
  NSPAIR(_ZN8G12x15y2D1Ev),
  {0,0}
};
extern Class_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_E12x15;
extern VTBL_ENTRY _ZTI6E12x15[];
extern  VTBL_ENTRY _ZTV6E12x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x15y2[] = {
  // 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
    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(16,12), //bcp->offset
    7, //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_E12x15,    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
    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 _ZTI8G12x15y2[];
extern void _ZN6E12x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv)();
extern void ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn24_N6E12x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G12x15y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x15y2[0]),
  (VTBL_ENTRY)&_ZN6E12x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G12x15y2[0]),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G12x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G12x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G12x15y2[];
extern void _ZN6E12x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x15__8G12x15y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
  (VTBL_ENTRY)&_ZN6E12x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__6E12x15__8G12x15y2[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv)();
extern void ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn24_N6E12x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x15__8G12x15y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C12__8G12x15y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__8G12x15y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x15y2[] = {
  {&(_ZTV8G12x15y2[6]),  6,18},
  {&(_tg__ZTV6E12x15__8G12x15y2[5]),  5,6},
  {&(_tg__ZTV3C12__6E12x15__8G12x15y2[3]),  3,3},
  {&(_tg__ZTV2B1__6E12x15__8G12x15y2[3]),  3,4},
  {&(_ZTV8G12x15y2[10]),  10,18},
  {&(_ZTV8G12x15y2[13]),  13,18},
  {&(_ZTV8G12x15y2[17]),  17,18},
  {&(_tg__ZTV3C12__8G12x15y2[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__8G12x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x15y2[];
extern  VTBL_ENTRY _ZTV8G12x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x15y2[];
static VTBL_ENTRY alt_thunk_names587[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn24_N6E12x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn24_N6E12x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x15y2 = {  "G12x15y2", // class name
  bases_G12x15y2, 6,
  &(vtc_G12x15y2[0]), // expected_vtbl_contents
  &(vtt_G12x15y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G12x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x15y2),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x15y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names587,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x15y3  : virtual E12x15 , virtual F1 {
  int ff;
  ~G12x15y3(); // tgen
  G12x15y3(); // tgen
};
//SIG(1 G12x15y3) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G12x15y3 ::~G12x15y3(){ note_dtor("G12x15y3", this);} // tgen
G12x15y3 ::G12x15y3(){ note_ctor("G12x15y3", this);} // tgen

static void Test_G12x15y3()
{
  extern Class_Descriptor cd_G12x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G12x15y3, buf);
    G12x15y3 *dp, &lv = *(dp=new (buf) G12x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G12x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x15y3)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,20), "G12x15y3");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,28), "G12x15y3");
    check_base_class_offset(lv, (C12*)(E12x15*), ABISELECT(32,16), "G12x15y3");
    check_base_class_offset(lv, (D0*)(E12x15*), ABISELECT(60,36), "G12x15y3");
    check_base_class_offset(lv, (E12x15*), ABISELECT(16,8), "G12x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G12x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G12x15y3.ff");
    test_class_info(&lv, &cd_G12x15y3);
    dp->~G12x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x15y3(Test_G12x15y3, "G12x15y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G12x15y3C1Ev();
extern void _ZN8G12x15y3D1Ev();
Name_Map name_map_G12x15y3[] = {
  NSPAIR(_ZN8G12x15y3C1Ev),
  NSPAIR(_ZN8G12x15y3D1Ev),
  {0,0}
};
extern Class_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_E12x15;
extern VTBL_ENTRY _ZTI6E12x15[];
extern  VTBL_ENTRY _ZTV6E12x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x15y3[] = {
  // 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_C12,    ABISELECT(32,16), //bcp->offset
    14, //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_E12x15,    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
    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 _ZTI8G12x15y3[];
extern void _ZN6E12x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv)();
extern void ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn20_N6E12x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G12x15y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x15y3[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G12x15y3[0]),
  (VTBL_ENTRY)&_ZN6E12x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G12x15y3[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G12x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G12x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G12x15y3[];
extern void _ZN6E12x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x15__8G12x15y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
  (VTBL_ENTRY)&_ZN6E12x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__6E12x15__8G12x15y3[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv)();
extern void ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn20_N6E12x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x15__8G12x15y3[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C12__8G12x15y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__8G12x15y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x15y3[] = {
  {&(_ZTV8G12x15y3[7]),  7,25},
  {&(_ZTV8G12x15y3[13]),  13,25},
  {&(_ZTV8G12x15y3[17]),  17,25},
  {&(_ZTV8G12x15y3[20]),  20,25},
  {&(_ZTV8G12x15y3[24]),  24,25},
  {&(_tg__ZTV6E12x15__8G12x15y3[5]),  5,6},
  {&(_tg__ZTV3C12__6E12x15__8G12x15y3[3]),  3,3},
  {&(_tg__ZTV2B1__6E12x15__8G12x15y3[3]),  3,4},
  {&(_tg__ZTV3C12__8G12x15y3[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__8G12x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x15y3[];
extern  VTBL_ENTRY _ZTV8G12x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x15y3[];
static VTBL_ENTRY alt_thunk_names588[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn20_N6E12x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn20_N6E12x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x15y3 = {  "G12x15y3", // class name
  bases_G12x15y3, 6,
  &(vtc_G12x15y3[0]), // expected_vtbl_contents
  &(vtt_G12x15y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G12x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x15y3),25, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x15y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names588,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x15y4  : E12x15 , F0 {
  int ff;
  ~G12x15y4(); // tgen
  G12x15y4(); // tgen
};
//SIG(1 G12x15y4) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G12x15y4 ::~G12x15y4(){ note_dtor("G12x15y4", this);} // tgen
G12x15y4 ::G12x15y4(){ note_ctor("G12x15y4", this);} // tgen

static void Test_G12x15y4()
{
  extern Class_Descriptor cd_G12x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x15y4, buf);
    G12x15y4 *dp, &lv = *(dp=new (buf) G12x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x15y4)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(32,20), "G12x15y4");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(40,28), "G12x15y4");
    check_base_class_offset(lv, (C12*)(E12x15*), ABISELECT(24,16), "G12x15y4");
    check_base_class_offset(lv, (D0*)(E12x15*), ABISELECT(52,36), "G12x15y4");
    check_base_class_offset(lv, (E12x15*), 0, "G12x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G12x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G12x15y4.ff");
    test_class_info(&lv, &cd_G12x15y4);
    dp->~G12x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x15y4(Test_G12x15y4, "G12x15y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G12x15y4C1Ev();
extern void _ZN8G12x15y4D1Ev();
Name_Map name_map_G12x15y4[] = {
  NSPAIR(_ZN8G12x15y4C1Ev),
  NSPAIR(_ZN8G12x15y4D1Ev),
  {0,0}
};
extern Class_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_E12x15;
extern VTBL_ENTRY _ZTI6E12x15[];
extern  VTBL_ENTRY _ZTV6E12x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x15y4[] = {
  // 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
    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(24,16), //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(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_E12x15,    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 _ZTI8G12x15y4[];
extern void _ZN6E12x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv)();
extern void ABISELECT(_ZThn40_N6E12x153fooEv,_ZThn28_N6E12x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x15y4[0]),
  (VTBL_ENTRY)&_ZN6E12x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G12x15y4[0]),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G12x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv),
};
extern VTBL_ENTRY _ZTV8G12x15y4[];
extern void _ZN6E12x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x15__8G12x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
  (VTBL_ENTRY)&_ZN6E12x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__6E12x15__8G12x15y4[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv)();
extern void ABISELECT(_ZThn40_N6E12x153fooEv,_ZThn28_N6E12x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x15__8G12x15y4[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C12__8G12x15y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__8G12x15y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x15y4[] = {
  {&(_ZTV8G12x15y4[5]),  5,13},
  {&(_tg__ZTV6E12x15__8G12x15y4[5]),  5,6},
  {&(_tg__ZTV3C12__6E12x15__8G12x15y4[3]),  3,3},
  {&(_tg__ZTV2B1__6E12x15__8G12x15y4[3]),  3,4},
  {&(_ZTV8G12x15y4[9]),  9,13},
  {&(_ZTV8G12x15y4[12]),  12,13},
  {&(_tg__ZTV3C12__8G12x15y4[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__8G12x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x15y4[];
extern  VTBL_ENTRY _ZTV8G12x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x15y4[];
static VTBL_ENTRY alt_thunk_names589[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E12x153fooEv,_ZThn28_N6E12x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E12x153fooEv,_ZThn28_N6E12x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x15y4 = {  "G12x15y4", // class name
  bases_G12x15y4, 6,
  &(vtc_G12x15y4[0]), // expected_vtbl_contents
  &(vtt_G12x15y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G12x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x15y4),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x15y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names589,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x15y5  : virtual E12x15 , F0 {
  int ff;
  ~G12x15y5(); // tgen
  G12x15y5(); // tgen
};
//SIG(1 G12x15y5) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G12x15y5 ::~G12x15y5(){ note_dtor("G12x15y5", this);} // tgen
G12x15y5 ::G12x15y5(){ note_ctor("G12x15y5", this);} // tgen

static void Test_G12x15y5()
{
  extern Class_Descriptor cd_G12x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G12x15y5, buf);
    G12x15y5 *dp, &lv = *(dp=new (buf) G12x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G12x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x15y5)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,24), "G12x15y5");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,32), "G12x15y5");
    check_base_class_offset(lv, (C12*)(E12x15*), ABISELECT(32,20), "G12x15y5");
    check_base_class_offset(lv, (D0*)(E12x15*), ABISELECT(60,40), "G12x15y5");
    check_base_class_offset(lv, (E12x15*), ABISELECT(16,12), "G12x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G12x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x15y5.ff");
    test_class_info(&lv, &cd_G12x15y5);
    dp->~G12x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x15y5(Test_G12x15y5, "G12x15y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G12x15y5C1Ev();
extern void _ZN8G12x15y5D1Ev();
Name_Map name_map_G12x15y5[] = {
  NSPAIR(_ZN8G12x15y5C1Ev),
  NSPAIR(_ZN8G12x15y5D1Ev),
  {0,0}
};
extern Class_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_E12x15;
extern VTBL_ENTRY _ZTI6E12x15[];
extern  VTBL_ENTRY _ZTV6E12x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x15y5[] = {
  // 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_C12,    ABISELECT(32,20), //bcp->offset
    13, //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_E12x15,    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
    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 _ZTI8G12x15y5[];
extern void _ZN6E12x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv)();
extern void ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn20_N6E12x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x15y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x15y5[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G12x15y5[0]),
  (VTBL_ENTRY)&_ZN6E12x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G12x15y5[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G12x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv),
};
extern VTBL_ENTRY _ZTV8G12x15y5[];
extern void _ZN6E12x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x15__8G12x15y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
  (VTBL_ENTRY)&_ZN6E12x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__6E12x15__8G12x15y5[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv)();
extern void ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn20_N6E12x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x15__8G12x15y5[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C12__8G12x15y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__8G12x15y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x15y5[] = {
  {&(_ZTV8G12x15y5[6]),  6,20},
  {&(_ZTV8G12x15y5[12]),  12,20},
  {&(_ZTV8G12x15y5[16]),  16,20},
  {&(_ZTV8G12x15y5[19]),  19,20},
  {&(_tg__ZTV6E12x15__8G12x15y5[5]),  5,6},
  {&(_tg__ZTV3C12__6E12x15__8G12x15y5[3]),  3,3},
  {&(_tg__ZTV2B1__6E12x15__8G12x15y5[3]),  3,4},
  {&(_tg__ZTV3C12__8G12x15y5[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__8G12x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x15y5[];
extern  VTBL_ENTRY _ZTV8G12x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x15y5[];
static VTBL_ENTRY alt_thunk_names590[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn20_N6E12x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn20_N6E12x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x15y5 = {  "G12x15y5", // class name
  bases_G12x15y5, 6,
  &(vtc_G12x15y5[0]), // expected_vtbl_contents
  &(vtt_G12x15y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G12x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x15y5),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x15y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names590,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x15y6  : E12x15 , virtual F0 {
  int ff;
  ~G12x15y6(); // tgen
  G12x15y6(); // tgen
};
//SIG(1 G12x15y6) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G12x15y6 ::~G12x15y6(){ note_dtor("G12x15y6", this);} // tgen
G12x15y6 ::G12x15y6(){ note_ctor("G12x15y6", this);} // tgen

static void Test_G12x15y6()
{
  extern Class_Descriptor cd_G12x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x15y6, buf);
    G12x15y6 *dp, &lv = *(dp=new (buf) G12x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x15y6)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(24,16), "G12x15y6");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(32,24), "G12x15y6");
    check_base_class_offset(lv, (C12*)(E12x15*), ABISELECT(16,12), "G12x15y6");
    check_base_class_offset(lv, (D0*)(E12x15*), ABISELECT(44,32), "G12x15y6");
    check_base_class_offset(lv, (E12x15*), 0, "G12x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G12x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x15y6.ff");
    test_class_info(&lv, &cd_G12x15y6);
    dp->~G12x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x15y6(Test_G12x15y6, "G12x15y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G12x15y6C1Ev();
extern void _ZN8G12x15y6D1Ev();
Name_Map name_map_G12x15y6[] = {
  NSPAIR(_ZN8G12x15y6C1Ev),
  NSPAIR(_ZN8G12x15y6D1Ev),
  {0,0}
};
extern Class_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_E12x15;
extern VTBL_ENTRY _ZTI6E12x15[];
extern  VTBL_ENTRY _ZTV6E12x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x15y6[] = {
  // 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
    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(16,12), //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(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_E12x15,    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 _ZTI8G12x15y6[];
extern void _ZN6E12x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv)();
extern void ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn24_N6E12x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x15y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x15y6[0]),
  (VTBL_ENTRY)&_ZN6E12x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G12x15y6[0]),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G12x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv),
};
extern VTBL_ENTRY _ZTV8G12x15y6[];
extern void _ZN6E12x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x15__8G12x15y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
  (VTBL_ENTRY)&_ZN6E12x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__6E12x15__8G12x15y6[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv)();
extern void ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn24_N6E12x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x15__8G12x15y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C12__8G12x15y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__8G12x15y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x15y6[] = {
  {&(_ZTV8G12x15y6[6]),  6,14},
  {&(_tg__ZTV6E12x15__8G12x15y6[5]),  5,6},
  {&(_tg__ZTV3C12__6E12x15__8G12x15y6[3]),  3,3},
  {&(_tg__ZTV2B1__6E12x15__8G12x15y6[3]),  3,4},
  {&(_ZTV8G12x15y6[10]),  10,14},
  {&(_ZTV8G12x15y6[13]),  13,14},
  {&(_tg__ZTV3C12__8G12x15y6[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__8G12x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x15y6[];
extern  VTBL_ENTRY _ZTV8G12x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x15y6[];
static VTBL_ENTRY alt_thunk_names591[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn24_N6E12x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn24_N6E12x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x15y6 = {  "G12x15y6", // class name
  bases_G12x15y6, 6,
  &(vtc_G12x15y6[0]), // expected_vtbl_contents
  &(vtt_G12x15y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G12x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x15y6),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x15y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names591,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x15y7  : virtual E12x15 , virtual F0 {
  int ff;
  ~G12x15y7(); // tgen
  G12x15y7(); // tgen
};
//SIG(1 G12x15y7) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G12x15y7 ::~G12x15y7(){ note_dtor("G12x15y7", this);} // tgen
G12x15y7 ::G12x15y7(){ note_ctor("G12x15y7", this);} // tgen

static void Test_G12x15y7()
{
  extern Class_Descriptor cd_G12x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G12x15y7, buf);
    G12x15y7 *dp, &lv = *(dp=new (buf) G12x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G12x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x15y7)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,20), "G12x15y7");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,28), "G12x15y7");
    check_base_class_offset(lv, (C12*)(E12x15*), ABISELECT(32,16), "G12x15y7");
    check_base_class_offset(lv, (D0*)(E12x15*), ABISELECT(60,36), "G12x15y7");
    check_base_class_offset(lv, (E12x15*), ABISELECT(16,8), "G12x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G12x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G12x15y7.ff");
    test_class_info(&lv, &cd_G12x15y7);
    dp->~G12x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x15y7(Test_G12x15y7, "G12x15y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G12x15y7C1Ev();
extern void _ZN8G12x15y7D1Ev();
Name_Map name_map_G12x15y7[] = {
  NSPAIR(_ZN8G12x15y7C1Ev),
  NSPAIR(_ZN8G12x15y7D1Ev),
  {0,0}
};
extern Class_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_E12x15;
extern VTBL_ENTRY _ZTI6E12x15[];
extern  VTBL_ENTRY _ZTV6E12x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E12x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x15y7[] = {
  // 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_C12,    ABISELECT(32,16), //bcp->offset
    14, //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_E12x15,    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_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 _ZTI8G12x15y7[];
extern void _ZN6E12x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv)();
extern void ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn20_N6E12x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G12x15y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G12x15y7[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G12x15y7[0]),
  (VTBL_ENTRY)&_ZN6E12x153fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G12x15y7[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G12x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv),
};
extern VTBL_ENTRY _ZTV8G12x15y7[];
extern void _ZN6E12x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E12x15__8G12x15y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
  (VTBL_ENTRY)&_ZN6E12x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__6E12x15__8G12x15y7[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv)();
extern void ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn20_N6E12x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E12x15__8G12x15y7[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E12x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C12__8G12x15y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__8G12x15y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x15y7[] = {
  {&(_ZTV8G12x15y7[7]),  7,21},
  {&(_ZTV8G12x15y7[13]),  13,21},
  {&(_ZTV8G12x15y7[17]),  17,21},
  {&(_ZTV8G12x15y7[20]),  20,21},
  {&(_tg__ZTV6E12x15__8G12x15y7[5]),  5,6},
  {&(_tg__ZTV3C12__6E12x15__8G12x15y7[3]),  3,3},
  {&(_tg__ZTV2B1__6E12x15__8G12x15y7[3]),  3,4},
  {&(_tg__ZTV3C12__8G12x15y7[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__8G12x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G12x15y7[];
extern  VTBL_ENTRY _ZTV8G12x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G12x15y7[];
static VTBL_ENTRY alt_thunk_names592[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E12x153fooEv,_ZTv0_n12_N6E12x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn20_N6E12x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E12x153fooEv,_ZThn20_N6E12x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G12x15y7 = {  "G12x15y7", // class name
  bases_G12x15y7, 6,
  &(vtc_G12x15y7[0]), // expected_vtbl_contents
  &(vtt_G12x15y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G12x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G12x15y7),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G12x15y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names592,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E13x15  : virtual C13 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E13x153fooEv
  ~E13x15(); // tgen
  E13x15(); // tgen
};
//SIG(-1 E13x15) C1{ VBC2{ BC3{ v1 Fi} VBC4{ v1 Fi} Fi} VBC5{ Fi} v1 Fi}


void  E13x15 ::foo(){vfunc_called(this, "_ZN6E13x153fooEv");}
E13x15 ::~E13x15(){ note_dtor("E13x15", this);} // tgen
E13x15 ::E13x15(){ note_ctor("E13x15", this);} // tgen

static void Test_E13x15()
{
  extern Class_Descriptor cd_E13x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E13x15, buf);
    E13x15 *dp, &lv = *(dp=new (buf) E13x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E13x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E13x15)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(16,8), "E13x15");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(32,20), "E13x15");
    check_base_class_offset(lv, (C13*), ABISELECT(16,8), "E13x15");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E13x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E13x15.fd");
    test_class_info(&lv, &cd_E13x15);
    dp->~E13x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE13x15(Test_E13x15, "E13x15", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E13x15C1Ev();
extern void _ZN6E13x15D1Ev();
Name_Map name_map_E13x15[] = {
  NSPAIR(_ZN6E13x15C1Ev),
  NSPAIR(_ZN6E13x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x15[] = {
  // 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
    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,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_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 _ZTI6E13x15[];
extern void _ZN6E13x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv)();
extern void ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn8_N6E13x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv)();
extern void ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E13x15[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&_ZN6E13x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv),
};
extern VTBL_ENTRY _ZTV6E13x15[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__6E13x15[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__6E13x15[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E13x15[] = {
  {&(_ZTV6E13x15[5]),  5,15},
  {&(_ZTV6E13x15[10]),  10,15},
  {&(_ZTV6E13x15[14]),  14,15},
  {&(_tg__ZTV3C13__6E13x15[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__6E13x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E13x15[];
extern  VTBL_ENTRY _ZTV6E13x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x15[];
static VTBL_ENTRY alt_thunk_names593[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn8_N6E13x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E13x15 = {  "E13x15", // class name
  bases_E13x15, 4,
  &(vtc_E13x15[0]), // expected_vtbl_contents
  &(vtt_E13x15[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E13x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E13x15),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E13x15),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names593,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x15y0  : E13x15 , F1 {
  int ff;
  ~G13x15y0(); // tgen
  G13x15y0(); // tgen
};
//SIG(1 G13x15y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G13x15y0 ::~G13x15y0(){ note_dtor("G13x15y0", this);} // tgen
G13x15y0 ::G13x15y0(){ note_ctor("G13x15y0", this);} // tgen

static void Test_G13x15y0()
{
  extern Class_Descriptor cd_G13x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G13x15y0, buf);
    G13x15y0 *dp, &lv = *(dp=new (buf) G13x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G13x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x15y0)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,20), "G13x15y0");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,32), "G13x15y0");
    check_base_class_offset(lv, (C13*)(E13x15*), ABISELECT(32,20), "G13x15y0");
    check_base_class_offset(lv, (D0*)(E13x15*), ABISELECT(60,40), "G13x15y0");
    check_base_class_offset(lv, (E13x15*), 0, "G13x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G13x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G13x15y0.ff");
    test_class_info(&lv, &cd_G13x15y0);
    dp->~G13x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x15y0(Test_G13x15y0, "G13x15y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G13x15y0C1Ev();
extern void _ZN8G13x15y0D1Ev();
Name_Map name_map_G13x15y0[] = {
  NSPAIR(_ZN8G13x15y0C1Ev),
  NSPAIR(_ZN8G13x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x15;
extern VTBL_ENTRY _ZTI6E13x15[];
extern  VTBL_ENTRY _ZTV6E13x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x15y0[] = {
  // 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
    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_C13,    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
    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_E13x15,    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
    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 _ZTI8G13x15y0[];
extern void _ZN6E13x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv)();
extern void ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv)();
extern void ABISELECT(_ZThn48_N6E13x153fooEv,_ZThn32_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x15y0[0]),
  (VTBL_ENTRY)&_ZN6E13x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G13x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G13x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G13x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv),
};
extern VTBL_ENTRY _ZTV8G13x15y0[];
extern void _ZN6E13x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x15__8G13x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&_ZN6E13x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv)();
extern void ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C13__6E13x15__8G13x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv)();
extern void ABISELECT(_ZThn48_N6E13x153fooEv,_ZThn32_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x15__8G13x15y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__8G13x15y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__8G13x15y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x15y0[] = {
  {&(_ZTV8G13x15y0[5]),  5,18},
  {&(_tg__ZTV6E13x15__8G13x15y0[5]),  5,6},
  {&(_tg__ZTV3C13__6E13x15__8G13x15y0[4]),  4,5},
  {&(_tg__ZTV2B1__6E13x15__8G13x15y0[3]),  3,4},
  {&(_ZTV8G13x15y0[13]),  13,18},
  {&(_ZTV8G13x15y0[17]),  17,18},
  {&(_tg__ZTV3C13__8G13x15y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__8G13x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x15y0[];
extern  VTBL_ENTRY _ZTV8G13x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x15y0[];
static VTBL_ENTRY alt_thunk_names594[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E13x153fooEv,_ZThn32_N6E13x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E13x153fooEv,_ZThn32_N6E13x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x15y0 = {  "G13x15y0", // class name
  bases_G13x15y0, 6,
  &(vtc_G13x15y0[0]), // expected_vtbl_contents
  &(vtt_G13x15y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G13x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x15y0),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x15y0),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names594,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x15y1  : virtual E13x15 , F1 {
  int ff;
  ~G13x15y1(); // tgen
  G13x15y1(); // tgen
};
//SIG(1 G13x15y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G13x15y1 ::~G13x15y1(){ note_dtor("G13x15y1", this);} // tgen
G13x15y1 ::G13x15y1(){ note_ctor("G13x15y1", this);} // tgen

static void Test_G13x15y1()
{
  extern Class_Descriptor cd_G13x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G13x15y1, buf);
    G13x15y1 *dp, &lv = *(dp=new (buf) G13x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G13x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x15y1)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,20), "G13x15y1");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,32), "G13x15y1");
    check_base_class_offset(lv, (C13*)(E13x15*), ABISELECT(32,20), "G13x15y1");
    check_base_class_offset(lv, (D0*)(E13x15*), ABISELECT(60,40), "G13x15y1");
    check_base_class_offset(lv, (E13x15*), ABISELECT(16,12), "G13x15y1");
    check_base_class_offset(lv, (F1*), 0, "G13x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x15y1.ff");
    test_class_info(&lv, &cd_G13x15y1);
    dp->~G13x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x15y1(Test_G13x15y1, "G13x15y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G13x15y1C1Ev();
extern void _ZN8G13x15y1D1Ev();
Name_Map name_map_G13x15y1[] = {
  NSPAIR(_ZN8G13x15y1C1Ev),
  NSPAIR(_ZN8G13x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x15;
extern VTBL_ENTRY _ZTI6E13x15[];
extern  VTBL_ENTRY _ZTV6E13x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x15y1[] = {
  // 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
    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_C13,    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
    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_E13x15,    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 _ZTI8G13x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E13x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv)();
extern void ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn8_N6E13x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv)();
extern void ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x15y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G13x15y1[0]),
  (VTBL_ENTRY)&_ZN6E13x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G13x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G13x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv),
};
extern VTBL_ENTRY _ZTV8G13x15y1[];
extern void _ZN6E13x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x15__8G13x15y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&_ZN6E13x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv)();
extern void ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn8_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C13__6E13x15__8G13x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv)();
extern void ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x15__8G13x15y1[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__8G13x15y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__8G13x15y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x15y1[] = {
  {&(_ZTV8G13x15y1[6]),  6,23},
  {&(_ZTV8G13x15y1[13]),  13,23},
  {&(_ZTV8G13x15y1[18]),  18,23},
  {&(_ZTV8G13x15y1[22]),  22,23},
  {&(_tg__ZTV6E13x15__8G13x15y1[5]),  5,6},
  {&(_tg__ZTV3C13__6E13x15__8G13x15y1[4]),  4,5},
  {&(_tg__ZTV2B1__6E13x15__8G13x15y1[3]),  3,4},
  {&(_tg__ZTV3C13__8G13x15y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__8G13x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x15y1[];
extern  VTBL_ENTRY _ZTV8G13x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x15y1[];
static VTBL_ENTRY alt_thunk_names595[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn8_N6E13x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn8_N6E13x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x15y1 = {  "G13x15y1", // class name
  bases_G13x15y1, 6,
  &(vtc_G13x15y1[0]), // expected_vtbl_contents
  &(vtt_G13x15y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G13x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x15y1),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x15y1),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names595,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x15y2  : E13x15 , virtual F1 {
  int ff;
  ~G13x15y2(); // tgen
  G13x15y2(); // tgen
};
//SIG(1 G13x15y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G13x15y2 ::~G13x15y2(){ note_dtor("G13x15y2", this);} // tgen
G13x15y2 ::G13x15y2(){ note_ctor("G13x15y2", this);} // tgen

static void Test_G13x15y2()
{
  extern Class_Descriptor cd_G13x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G13x15y2, buf);
    G13x15y2 *dp, &lv = *(dp=new (buf) G13x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G13x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x15y2)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(16,12), "G13x15y2");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(32,24), "G13x15y2");
    check_base_class_offset(lv, (C13*)(E13x15*), ABISELECT(16,12), "G13x15y2");
    check_base_class_offset(lv, (D0*)(E13x15*), ABISELECT(44,32), "G13x15y2");
    check_base_class_offset(lv, (E13x15*), 0, "G13x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G13x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x15y2.ff");
    test_class_info(&lv, &cd_G13x15y2);
    dp->~G13x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x15y2(Test_G13x15y2, "G13x15y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G13x15y2C1Ev();
extern void _ZN8G13x15y2D1Ev();
Name_Map name_map_G13x15y2[] = {
  NSPAIR(_ZN8G13x15y2C1Ev),
  NSPAIR(_ZN8G13x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x15;
extern VTBL_ENTRY _ZTI6E13x15[];
extern  VTBL_ENTRY _ZTV6E13x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x15y2[] = {
  // 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
    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(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
    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_E13x15,    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
    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI8G13x15y2[];
extern void _ZN6E13x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv)();
extern void ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn12_N6E13x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv)();
extern void ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn24_N6E13x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G13x15y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x15y2[0]),
  (VTBL_ENTRY)&_ZN6E13x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G13x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G13x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G13x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G13x15y2[];
extern void _ZN6E13x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x15__8G13x15y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&_ZN6E13x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv)();
extern void ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn12_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C13__6E13x15__8G13x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv)();
extern void ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn24_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x15__8G13x15y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__8G13x15y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__8G13x15y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x15y2[] = {
  {&(_ZTV8G13x15y2[6]),  6,20},
  {&(_tg__ZTV6E13x15__8G13x15y2[5]),  5,6},
  {&(_tg__ZTV3C13__6E13x15__8G13x15y2[4]),  4,5},
  {&(_tg__ZTV2B1__6E13x15__8G13x15y2[3]),  3,4},
  {&(_ZTV8G13x15y2[11]),  11,20},
  {&(_ZTV8G13x15y2[15]),  15,20},
  {&(_ZTV8G13x15y2[19]),  19,20},
  {&(_tg__ZTV3C13__8G13x15y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__8G13x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x15y2[];
extern  VTBL_ENTRY _ZTV8G13x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x15y2[];
static VTBL_ENTRY alt_thunk_names596[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn24_N6E13x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn24_N6E13x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn12_N6E13x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn12_N6E13x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x15y2 = {  "G13x15y2", // class name
  bases_G13x15y2, 6,
  &(vtc_G13x15y2[0]), // expected_vtbl_contents
  &(vtt_G13x15y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G13x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x15y2),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x15y2),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names596,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x15y3  : virtual E13x15 , virtual F1 {
  int ff;
  ~G13x15y3(); // tgen
  G13x15y3(); // tgen
};
//SIG(1 G13x15y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G13x15y3 ::~G13x15y3(){ note_dtor("G13x15y3", this);} // tgen
G13x15y3 ::G13x15y3(){ note_ctor("G13x15y3", this);} // tgen

static void Test_G13x15y3()
{
  extern Class_Descriptor cd_G13x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G13x15y3, buf);
    G13x15y3 *dp, &lv = *(dp=new (buf) G13x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G13x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x15y3)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,16), "G13x15y3");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,28), "G13x15y3");
    check_base_class_offset(lv, (C13*)(E13x15*), ABISELECT(32,16), "G13x15y3");
    check_base_class_offset(lv, (D0*)(E13x15*), ABISELECT(60,36), "G13x15y3");
    check_base_class_offset(lv, (E13x15*), ABISELECT(16,8), "G13x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G13x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G13x15y3.ff");
    test_class_info(&lv, &cd_G13x15y3);
    dp->~G13x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x15y3(Test_G13x15y3, "G13x15y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G13x15y3C1Ev();
extern void _ZN8G13x15y3D1Ev();
Name_Map name_map_G13x15y3[] = {
  NSPAIR(_ZN8G13x15y3C1Ev),
  NSPAIR(_ZN8G13x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x15;
extern VTBL_ENTRY _ZTI6E13x15[];
extern  VTBL_ENTRY _ZTV6E13x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x15y3[] = {
  // 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
    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_C13,    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
    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_E13x15,    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
    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
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI8G13x15y3[];
extern void _ZN6E13x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv)();
extern void ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn8_N6E13x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv)();
extern void ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G13x15y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x15y3[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G13x15y3[0]),
  (VTBL_ENTRY)&_ZN6E13x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G13x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G13x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G13x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G13x15y3[];
extern void _ZN6E13x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x15__8G13x15y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&_ZN6E13x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv)();
extern void ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn8_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C13__6E13x15__8G13x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv)();
extern void ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x15__8G13x15y3[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__8G13x15y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__8G13x15y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x15y3[] = {
  {&(_ZTV8G13x15y3[7]),  7,27},
  {&(_ZTV8G13x15y3[13]),  13,27},
  {&(_ZTV8G13x15y3[18]),  18,27},
  {&(_ZTV8G13x15y3[22]),  22,27},
  {&(_ZTV8G13x15y3[26]),  26,27},
  {&(_tg__ZTV6E13x15__8G13x15y3[5]),  5,6},
  {&(_tg__ZTV3C13__6E13x15__8G13x15y3[4]),  4,5},
  {&(_tg__ZTV2B1__6E13x15__8G13x15y3[3]),  3,4},
  {&(_tg__ZTV3C13__8G13x15y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__8G13x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x15y3[];
extern  VTBL_ENTRY _ZTV8G13x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x15y3[];
static VTBL_ENTRY alt_thunk_names597[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn8_N6E13x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn8_N6E13x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x15y3 = {  "G13x15y3", // class name
  bases_G13x15y3, 6,
  &(vtc_G13x15y3[0]), // expected_vtbl_contents
  &(vtt_G13x15y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G13x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x15y3),27, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x15y3),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names597,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x15y4  : E13x15 , F0 {
  int ff;
  ~G13x15y4(); // tgen
  G13x15y4(); // tgen
};
//SIG(1 G13x15y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G13x15y4 ::~G13x15y4(){ note_dtor("G13x15y4", this);} // tgen
G13x15y4 ::G13x15y4(){ note_ctor("G13x15y4", this);} // tgen

static void Test_G13x15y4()
{
  extern Class_Descriptor cd_G13x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x15y4, buf);
    G13x15y4 *dp, &lv = *(dp=new (buf) G13x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x15y4)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(24,16), "G13x15y4");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(40,28), "G13x15y4");
    check_base_class_offset(lv, (C13*)(E13x15*), ABISELECT(24,16), "G13x15y4");
    check_base_class_offset(lv, (D0*)(E13x15*), ABISELECT(52,36), "G13x15y4");
    check_base_class_offset(lv, (E13x15*), 0, "G13x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G13x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G13x15y4.ff");
    test_class_info(&lv, &cd_G13x15y4);
    dp->~G13x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x15y4(Test_G13x15y4, "G13x15y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G13x15y4C1Ev();
extern void _ZN8G13x15y4D1Ev();
Name_Map name_map_G13x15y4[] = {
  NSPAIR(_ZN8G13x15y4C1Ev),
  NSPAIR(_ZN8G13x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x15;
extern VTBL_ENTRY _ZTI6E13x15[];
extern  VTBL_ENTRY _ZTV6E13x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x15y4[] = {
  // 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
    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(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
    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_E13x15,    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 _ZTI8G13x15y4[];
extern void _ZN6E13x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv)();
extern void ABISELECT(_ZThn24_N6E13x153fooEv,_ZThn16_N6E13x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv)();
extern void ABISELECT(_ZThn40_N6E13x153fooEv,_ZThn28_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x15y4[0]),
  (VTBL_ENTRY)&_ZN6E13x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G13x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G13x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv),
};
extern VTBL_ENTRY _ZTV8G13x15y4[];
extern void _ZN6E13x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x15__8G13x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&_ZN6E13x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv)();
extern void ABISELECT(_ZThn24_N6E13x153fooEv,_ZThn16_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C13__6E13x15__8G13x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv)();
extern void ABISELECT(_ZThn40_N6E13x153fooEv,_ZThn28_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x15__8G13x15y4[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__8G13x15y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__8G13x15y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x15y4[] = {
  {&(_ZTV8G13x15y4[5]),  5,15},
  {&(_tg__ZTV6E13x15__8G13x15y4[5]),  5,6},
  {&(_tg__ZTV3C13__6E13x15__8G13x15y4[4]),  4,5},
  {&(_tg__ZTV2B1__6E13x15__8G13x15y4[3]),  3,4},
  {&(_ZTV8G13x15y4[10]),  10,15},
  {&(_ZTV8G13x15y4[14]),  14,15},
  {&(_tg__ZTV3C13__8G13x15y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__8G13x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x15y4[];
extern  VTBL_ENTRY _ZTV8G13x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x15y4[];
static VTBL_ENTRY alt_thunk_names598[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E13x153fooEv,_ZThn28_N6E13x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E13x153fooEv,_ZThn28_N6E13x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x153fooEv,_ZThn16_N6E13x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E13x153fooEv,_ZThn16_N6E13x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x15y4 = {  "G13x15y4", // class name
  bases_G13x15y4, 6,
  &(vtc_G13x15y4[0]), // expected_vtbl_contents
  &(vtt_G13x15y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G13x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x15y4),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x15y4),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names598,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x15y5  : virtual E13x15 , F0 {
  int ff;
  ~G13x15y5(); // tgen
  G13x15y5(); // tgen
};
//SIG(1 G13x15y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G13x15y5 ::~G13x15y5(){ note_dtor("G13x15y5", this);} // tgen
G13x15y5 ::G13x15y5(){ note_ctor("G13x15y5", this);} // tgen

static void Test_G13x15y5()
{
  extern Class_Descriptor cd_G13x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G13x15y5, buf);
    G13x15y5 *dp, &lv = *(dp=new (buf) G13x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G13x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x15y5)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,20), "G13x15y5");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,32), "G13x15y5");
    check_base_class_offset(lv, (C13*)(E13x15*), ABISELECT(32,20), "G13x15y5");
    check_base_class_offset(lv, (D0*)(E13x15*), ABISELECT(60,40), "G13x15y5");
    check_base_class_offset(lv, (E13x15*), ABISELECT(16,12), "G13x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G13x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x15y5.ff");
    test_class_info(&lv, &cd_G13x15y5);
    dp->~G13x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x15y5(Test_G13x15y5, "G13x15y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G13x15y5C1Ev();
extern void _ZN8G13x15y5D1Ev();
Name_Map name_map_G13x15y5[] = {
  NSPAIR(_ZN8G13x15y5C1Ev),
  NSPAIR(_ZN8G13x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x15;
extern VTBL_ENTRY _ZTI6E13x15[];
extern  VTBL_ENTRY _ZTV6E13x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x15y5[] = {
  // 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
    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_C13,    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
    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_E13x15,    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 _ZTI8G13x15y5[];
extern void _ZN6E13x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv)();
extern void ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn8_N6E13x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv)();
extern void ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x15y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x15y5[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G13x15y5[0]),
  (VTBL_ENTRY)&_ZN6E13x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G13x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G13x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv),
};
extern VTBL_ENTRY _ZTV8G13x15y5[];
extern void _ZN6E13x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x15__8G13x15y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&_ZN6E13x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv)();
extern void ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn8_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C13__6E13x15__8G13x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv)();
extern void ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x15__8G13x15y5[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__8G13x15y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__8G13x15y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x15y5[] = {
  {&(_ZTV8G13x15y5[6]),  6,22},
  {&(_ZTV8G13x15y5[12]),  12,22},
  {&(_ZTV8G13x15y5[17]),  17,22},
  {&(_ZTV8G13x15y5[21]),  21,22},
  {&(_tg__ZTV6E13x15__8G13x15y5[5]),  5,6},
  {&(_tg__ZTV3C13__6E13x15__8G13x15y5[4]),  4,5},
  {&(_tg__ZTV2B1__6E13x15__8G13x15y5[3]),  3,4},
  {&(_tg__ZTV3C13__8G13x15y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__8G13x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x15y5[];
extern  VTBL_ENTRY _ZTV8G13x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x15y5[];
static VTBL_ENTRY alt_thunk_names599[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn8_N6E13x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn8_N6E13x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x15y5 = {  "G13x15y5", // class name
  bases_G13x15y5, 6,
  &(vtc_G13x15y5[0]), // expected_vtbl_contents
  &(vtt_G13x15y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G13x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x15y5),22, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x15y5),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names599,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x15y6  : E13x15 , virtual F0 {
  int ff;
  ~G13x15y6(); // tgen
  G13x15y6(); // tgen
};
//SIG(1 G13x15y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G13x15y6 ::~G13x15y6(){ note_dtor("G13x15y6", this);} // tgen
G13x15y6 ::G13x15y6(){ note_ctor("G13x15y6", this);} // tgen

static void Test_G13x15y6()
{
  extern Class_Descriptor cd_G13x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x15y6, buf);
    G13x15y6 *dp, &lv = *(dp=new (buf) G13x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x15y6)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(16,12), "G13x15y6");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(32,24), "G13x15y6");
    check_base_class_offset(lv, (C13*)(E13x15*), ABISELECT(16,12), "G13x15y6");
    check_base_class_offset(lv, (D0*)(E13x15*), ABISELECT(44,32), "G13x15y6");
    check_base_class_offset(lv, (E13x15*), 0, "G13x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G13x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x15y6.ff");
    test_class_info(&lv, &cd_G13x15y6);
    dp->~G13x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x15y6(Test_G13x15y6, "G13x15y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G13x15y6C1Ev();
extern void _ZN8G13x15y6D1Ev();
Name_Map name_map_G13x15y6[] = {
  NSPAIR(_ZN8G13x15y6C1Ev),
  NSPAIR(_ZN8G13x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x15;
extern VTBL_ENTRY _ZTI6E13x15[];
extern  VTBL_ENTRY _ZTV6E13x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x15y6[] = {
  // 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
    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(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
    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_E13x15,    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 _ZTI8G13x15y6[];
extern void _ZN6E13x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv)();
extern void ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn12_N6E13x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv)();
extern void ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn24_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x15y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x15y6[0]),
  (VTBL_ENTRY)&_ZN6E13x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G13x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G13x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv),
};
extern VTBL_ENTRY _ZTV8G13x15y6[];
extern void _ZN6E13x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x15__8G13x15y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&_ZN6E13x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv)();
extern void ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn12_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C13__6E13x15__8G13x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv)();
extern void ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn24_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x15__8G13x15y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__8G13x15y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__8G13x15y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x15y6[] = {
  {&(_ZTV8G13x15y6[6]),  6,16},
  {&(_tg__ZTV6E13x15__8G13x15y6[5]),  5,6},
  {&(_tg__ZTV3C13__6E13x15__8G13x15y6[4]),  4,5},
  {&(_tg__ZTV2B1__6E13x15__8G13x15y6[3]),  3,4},
  {&(_ZTV8G13x15y6[11]),  11,16},
  {&(_ZTV8G13x15y6[15]),  15,16},
  {&(_tg__ZTV3C13__8G13x15y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__8G13x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x15y6[];
extern  VTBL_ENTRY _ZTV8G13x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x15y6[];
static VTBL_ENTRY alt_thunk_names600[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn24_N6E13x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn24_N6E13x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn12_N6E13x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn12_N6E13x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x15y6 = {  "G13x15y6", // class name
  bases_G13x15y6, 6,
  &(vtc_G13x15y6[0]), // expected_vtbl_contents
  &(vtt_G13x15y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G13x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x15y6),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x15y6),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names600,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x15y7  : virtual E13x15 , virtual F0 {
  int ff;
  ~G13x15y7(); // tgen
  G13x15y7(); // tgen
};
//SIG(1 G13x15y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G13x15y7 ::~G13x15y7(){ note_dtor("G13x15y7", this);} // tgen
G13x15y7 ::G13x15y7(){ note_ctor("G13x15y7", this);} // tgen

static void Test_G13x15y7()
{
  extern Class_Descriptor cd_G13x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G13x15y7, buf);
    G13x15y7 *dp, &lv = *(dp=new (buf) G13x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G13x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x15y7)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,16), "G13x15y7");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,28), "G13x15y7");
    check_base_class_offset(lv, (C13*)(E13x15*), ABISELECT(32,16), "G13x15y7");
    check_base_class_offset(lv, (D0*)(E13x15*), ABISELECT(60,36), "G13x15y7");
    check_base_class_offset(lv, (E13x15*), ABISELECT(16,8), "G13x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G13x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G13x15y7.ff");
    test_class_info(&lv, &cd_G13x15y7);
    dp->~G13x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x15y7(Test_G13x15y7, "G13x15y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G13x15y7C1Ev();
extern void _ZN8G13x15y7D1Ev();
Name_Map name_map_G13x15y7[] = {
  NSPAIR(_ZN8G13x15y7C1Ev),
  NSPAIR(_ZN8G13x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E13x15;
extern VTBL_ENTRY _ZTI6E13x15[];
extern  VTBL_ENTRY _ZTV6E13x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E13x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x15y7[] = {
  // 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
    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_C13,    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
    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_E13x15,    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 _ZTI8G13x15y7[];
extern void _ZN6E13x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv)();
extern void ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn8_N6E13x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv)();
extern void ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G13x15y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G13x15y7[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G13x15y7[0]),
  (VTBL_ENTRY)&_ZN6E13x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G13x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G13x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv),
};
extern VTBL_ENTRY _ZTV8G13x15y7[];
extern void _ZN6E13x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E13x15__8G13x15y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&_ZN6E13x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv)();
extern void ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn8_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C13__6E13x15__8G13x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv)();
extern void ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E13x15__8G13x15y7[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E13x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__8G13x15y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__8G13x15y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x15y7[] = {
  {&(_ZTV8G13x15y7[7]),  7,23},
  {&(_ZTV8G13x15y7[13]),  13,23},
  {&(_ZTV8G13x15y7[18]),  18,23},
  {&(_ZTV8G13x15y7[22]),  22,23},
  {&(_tg__ZTV6E13x15__8G13x15y7[5]),  5,6},
  {&(_tg__ZTV3C13__6E13x15__8G13x15y7[4]),  4,5},
  {&(_tg__ZTV2B1__6E13x15__8G13x15y7[3]),  3,4},
  {&(_tg__ZTV3C13__8G13x15y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__8G13x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G13x15y7[];
extern  VTBL_ENTRY _ZTV8G13x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G13x15y7[];
static VTBL_ENTRY alt_thunk_names601[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E13x153fooEv,_ZTv0_n12_N6E13x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E13x153fooEv,_ZThn20_N6E13x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E13x153fooEv,_ZTv0_n16_N6E13x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn8_N6E13x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E13x153fooEv,_ZThn8_N6E13x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G13x15y7 = {  "G13x15y7", // class name
  bases_G13x15y7, 6,
  &(vtc_G13x15y7[0]), // expected_vtbl_contents
  &(vtt_G13x15y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G13x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G13x15y7),23, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G13x15y7),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names601,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E14x15  : virtual C14 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E14x153fooEv
  ~E14x15(); // tgen
  E14x15(); // tgen
};
//SIG(-1 E14x15) C1{ VBC2{ VBC3{ Fi} VBC4{ v1 Fi} Fi} VBC5{ Fi} v1 Fi}


void  E14x15 ::foo(){vfunc_called(this, "_ZN6E14x153fooEv");}
E14x15 ::~E14x15(){ note_dtor("E14x15", this);} // tgen
E14x15 ::E14x15(){ note_ctor("E14x15", this);} // tgen

static void Test_E14x15()
{
  extern Class_Descriptor cd_E14x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E14x15, buf);
    E14x15 *dp, &lv = *(dp=new (buf) E14x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E14x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E14x15)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(28,16), "E14x15");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(32,20), "E14x15");
    check_base_class_offset(lv, (C14*), ABISELECT(16,8), "E14x15");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E14x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E14x15.fd");
    test_class_info(&lv, &cd_E14x15);
    dp->~E14x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE14x15(Test_E14x15, "E14x15", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E14x15C1Ev();
extern void _ZN6E14x15D1Ev();
Name_Map name_map_E14x15[] = {
  NSPAIR(_ZN6E14x15C1Ev),
  NSPAIR(_ZN6E14x15D1Ev),
  {0,0}
};
extern Class_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_E14x15[] = {
  // 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
    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,8), //bcp->offset
    7, //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 _ZTI6E14x15[];
extern void _ZN6E14x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv)();
extern void ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn20_N6E14x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E14x15[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
  (VTBL_ENTRY)&_ZN6E14x153fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv),
};
extern VTBL_ENTRY _ZTV6E14x15[];
static  VTBL_ENTRY _tg__ZTV3C14__6E14x15[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__6E14x15[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E14x15[] = {
  {&(_ZTV6E14x15[6]),  6,15},
  {&(_ZTV6E14x15[11]),  11,15},
  {&(_ZTV6E14x15[14]),  14,15},
  {&(_tg__ZTV3C14__6E14x15[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__6E14x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E14x15[];
extern  VTBL_ENTRY _ZTV6E14x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x15[];
static VTBL_ENTRY alt_thunk_names602[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn20_N6E14x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E14x15 = {  "E14x15", // class name
  bases_E14x15, 4,
  &(vtc_E14x15[0]), // expected_vtbl_contents
  &(vtt_E14x15[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E14x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E14x15),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E14x15),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names602,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x15y0  : E14x15 , F1 {
  int ff;
  ~G14x15y0(); // tgen
  G14x15y0(); // tgen
};
//SIG(1 G14x15y0) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G14x15y0 ::~G14x15y0(){ note_dtor("G14x15y0", this);} // tgen
G14x15y0 ::G14x15y0(){ note_ctor("G14x15y0", this);} // tgen

static void Test_G14x15y0()
{
  extern Class_Descriptor cd_G14x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G14x15y0, buf);
    G14x15y0 *dp, &lv = *(dp=new (buf) G14x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G14x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x15y0)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,28), "G14x15y0");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,32), "G14x15y0");
    check_base_class_offset(lv, (C14*)(E14x15*), ABISELECT(32,20), "G14x15y0");
    check_base_class_offset(lv, (D0*)(E14x15*), ABISELECT(60,40), "G14x15y0");
    check_base_class_offset(lv, (E14x15*), 0, "G14x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G14x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G14x15y0.ff");
    test_class_info(&lv, &cd_G14x15y0);
    dp->~G14x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x15y0(Test_G14x15y0, "G14x15y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G14x15y0C1Ev();
extern void _ZN8G14x15y0D1Ev();
Name_Map name_map_G14x15y0[] = {
  NSPAIR(_ZN8G14x15y0C1Ev),
  NSPAIR(_ZN8G14x15y0D1Ev),
  {0,0}
};
extern Class_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_E14x15;
extern VTBL_ENTRY _ZTI6E14x15[];
extern  VTBL_ENTRY _ZTV6E14x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x15y0[] = {
  // 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
    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_C14,    ABISELECT(32,20), //bcp->offset
    10, //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_E14x15,    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
    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
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8G14x15y0[];
extern void _ZN6E14x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv)();
extern void ABISELECT(_ZThn48_N6E14x153fooEv,_ZThn32_N6E14x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x15y0[0]),
  (VTBL_ENTRY)&_ZN6E14x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G14x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G14x15y0[0]),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G14x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv),
};
extern VTBL_ENTRY _ZTV8G14x15y0[];
extern void _ZN6E14x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x15__8G14x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
  (VTBL_ENTRY)&_ZN6E14x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__6E14x15__8G14x15y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv)();
extern void ABISELECT(_ZThn48_N6E14x153fooEv,_ZThn32_N6E14x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x15__8G14x15y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C14__8G14x15y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__8G14x15y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x15y0[] = {
  {&(_ZTV8G14x15y0[6]),  6,18},
  {&(_tg__ZTV6E14x15__8G14x15y0[6]),  6,7},
  {&(_tg__ZTV3C14__6E14x15__8G14x15y0[4]),  4,4},
  {&(_tg__ZTV2B1__6E14x15__8G14x15y0[3]),  3,4},
  {&(_ZTV8G14x15y0[14]),  14,18},
  {&(_ZTV8G14x15y0[17]),  17,18},
  {&(_tg__ZTV3C14__8G14x15y0[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__8G14x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x15y0[];
extern  VTBL_ENTRY _ZTV8G14x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x15y0[];
static VTBL_ENTRY alt_thunk_names603[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E14x153fooEv,_ZThn32_N6E14x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E14x153fooEv,_ZThn32_N6E14x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x15y0 = {  "G14x15y0", // class name
  bases_G14x15y0, 6,
  &(vtc_G14x15y0[0]), // expected_vtbl_contents
  &(vtt_G14x15y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G14x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x15y0),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x15y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names603,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x15y1  : virtual E14x15 , F1 {
  int ff;
  ~G14x15y1(); // tgen
  G14x15y1(); // tgen
};
//SIG(1 G14x15y1) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G14x15y1 ::~G14x15y1(){ note_dtor("G14x15y1", this);} // tgen
G14x15y1 ::G14x15y1(){ note_ctor("G14x15y1", this);} // tgen

static void Test_G14x15y1()
{
  extern Class_Descriptor cd_G14x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G14x15y1, buf);
    G14x15y1 *dp, &lv = *(dp=new (buf) G14x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G14x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x15y1)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,28), "G14x15y1");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,32), "G14x15y1");
    check_base_class_offset(lv, (C14*)(E14x15*), ABISELECT(32,20), "G14x15y1");
    check_base_class_offset(lv, (D0*)(E14x15*), ABISELECT(60,40), "G14x15y1");
    check_base_class_offset(lv, (E14x15*), ABISELECT(16,12), "G14x15y1");
    check_base_class_offset(lv, (F1*), 0, "G14x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x15y1.ff");
    test_class_info(&lv, &cd_G14x15y1);
    dp->~G14x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x15y1(Test_G14x15y1, "G14x15y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G14x15y1C1Ev();
extern void _ZN8G14x15y1D1Ev();
Name_Map name_map_G14x15y1[] = {
  NSPAIR(_ZN8G14x15y1C1Ev),
  NSPAIR(_ZN8G14x15y1D1Ev),
  {0,0}
};
extern Class_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_E14x15;
extern VTBL_ENTRY _ZTI6E14x15[];
extern  VTBL_ENTRY _ZTV6E14x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x15y1[] = {
  // 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_C14,    ABISELECT(32,20), //bcp->offset
    16, //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_E14x15,    ABISELECT(16,12), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G14x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E14x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv)();
extern void ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn20_N6E14x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x15y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G14x15y1[0]),
  (VTBL_ENTRY)&_ZN6E14x153fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G14x15y1[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G14x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv),
};
extern VTBL_ENTRY _ZTV8G14x15y1[];
extern void _ZN6E14x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x15__8G14x15y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
  (VTBL_ENTRY)&_ZN6E14x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__6E14x15__8G14x15y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv)();
extern void ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn20_N6E14x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x15__8G14x15y1[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C14__8G14x15y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__8G14x15y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x15y1[] = {
  {&(_ZTV8G14x15y1[7]),  7,24},
  {&(_ZTV8G14x15y1[15]),  15,24},
  {&(_ZTV8G14x15y1[20]),  20,24},
  {&(_ZTV8G14x15y1[23]),  23,24},
  {&(_tg__ZTV6E14x15__8G14x15y1[6]),  6,7},
  {&(_tg__ZTV3C14__6E14x15__8G14x15y1[4]),  4,4},
  {&(_tg__ZTV2B1__6E14x15__8G14x15y1[3]),  3,4},
  {&(_tg__ZTV3C14__8G14x15y1[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__8G14x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x15y1[];
extern  VTBL_ENTRY _ZTV8G14x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x15y1[];
static VTBL_ENTRY alt_thunk_names604[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn20_N6E14x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn20_N6E14x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x15y1 = {  "G14x15y1", // class name
  bases_G14x15y1, 6,
  &(vtc_G14x15y1[0]), // expected_vtbl_contents
  &(vtt_G14x15y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G14x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x15y1),24, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x15y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names604,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x15y2  : E14x15 , virtual F1 {
  int ff;
  ~G14x15y2(); // tgen
  G14x15y2(); // tgen
};
//SIG(1 G14x15y2) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G14x15y2 ::~G14x15y2(){ note_dtor("G14x15y2", this);} // tgen
G14x15y2 ::G14x15y2(){ note_ctor("G14x15y2", this);} // tgen

static void Test_G14x15y2()
{
  extern Class_Descriptor cd_G14x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G14x15y2, buf);
    G14x15y2 *dp, &lv = *(dp=new (buf) G14x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G14x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x15y2)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(28,20), "G14x15y2");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(32,24), "G14x15y2");
    check_base_class_offset(lv, (C14*)(E14x15*), ABISELECT(16,12), "G14x15y2");
    check_base_class_offset(lv, (D0*)(E14x15*), ABISELECT(44,32), "G14x15y2");
    check_base_class_offset(lv, (E14x15*), 0, "G14x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G14x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x15y2.ff");
    test_class_info(&lv, &cd_G14x15y2);
    dp->~G14x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x15y2(Test_G14x15y2, "G14x15y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G14x15y2C1Ev();
extern void _ZN8G14x15y2D1Ev();
Name_Map name_map_G14x15y2[] = {
  NSPAIR(_ZN8G14x15y2C1Ev),
  NSPAIR(_ZN8G14x15y2D1Ev),
  {0,0}
};
extern Class_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_E14x15;
extern VTBL_ENTRY _ZTI6E14x15[];
extern  VTBL_ENTRY _ZTV6E14x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x15y2[] = {
  // 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
    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(16,12), //bcp->offset
    8, //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_E14x15,    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
    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 _ZTI8G14x15y2[];
extern void _ZN6E14x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv)();
extern void ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn24_N6E14x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G14x15y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x15y2[0]),
  (VTBL_ENTRY)&_ZN6E14x153fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G14x15y2[0]),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G14x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G14x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G14x15y2[];
extern void _ZN6E14x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x15__8G14x15y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
  (VTBL_ENTRY)&_ZN6E14x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__6E14x15__8G14x15y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv)();
extern void ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn24_N6E14x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x15__8G14x15y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C14__8G14x15y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__8G14x15y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x15y2[] = {
  {&(_ZTV8G14x15y2[7]),  7,20},
  {&(_tg__ZTV6E14x15__8G14x15y2[6]),  6,7},
  {&(_tg__ZTV3C14__6E14x15__8G14x15y2[4]),  4,4},
  {&(_tg__ZTV2B1__6E14x15__8G14x15y2[3]),  3,4},
  {&(_ZTV8G14x15y2[12]),  12,20},
  {&(_ZTV8G14x15y2[15]),  15,20},
  {&(_ZTV8G14x15y2[19]),  19,20},
  {&(_tg__ZTV3C14__8G14x15y2[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__8G14x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x15y2[];
extern  VTBL_ENTRY _ZTV8G14x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x15y2[];
static VTBL_ENTRY alt_thunk_names605[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn24_N6E14x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn24_N6E14x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x15y2 = {  "G14x15y2", // class name
  bases_G14x15y2, 6,
  &(vtc_G14x15y2[0]), // expected_vtbl_contents
  &(vtt_G14x15y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G14x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x15y2),20, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x15y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names605,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x15y3  : virtual E14x15 , virtual F1 {
  int ff;
  ~G14x15y3(); // tgen
  G14x15y3(); // tgen
};
//SIG(1 G14x15y3) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G14x15y3 ::~G14x15y3(){ note_dtor("G14x15y3", this);} // tgen
G14x15y3 ::G14x15y3(){ note_ctor("G14x15y3", this);} // tgen

static void Test_G14x15y3()
{
  extern Class_Descriptor cd_G14x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G14x15y3, buf);
    G14x15y3 *dp, &lv = *(dp=new (buf) G14x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G14x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x15y3)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,24), "G14x15y3");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,28), "G14x15y3");
    check_base_class_offset(lv, (C14*)(E14x15*), ABISELECT(32,16), "G14x15y3");
    check_base_class_offset(lv, (D0*)(E14x15*), ABISELECT(60,36), "G14x15y3");
    check_base_class_offset(lv, (E14x15*), ABISELECT(16,8), "G14x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G14x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G14x15y3.ff");
    test_class_info(&lv, &cd_G14x15y3);
    dp->~G14x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x15y3(Test_G14x15y3, "G14x15y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G14x15y3C1Ev();
extern void _ZN8G14x15y3D1Ev();
Name_Map name_map_G14x15y3[] = {
  NSPAIR(_ZN8G14x15y3C1Ev),
  NSPAIR(_ZN8G14x15y3D1Ev),
  {0,0}
};
extern Class_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_E14x15;
extern VTBL_ENTRY _ZTI6E14x15[];
extern  VTBL_ENTRY _ZTV6E14x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x15y3[] = {
  // 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_C14,    ABISELECT(32,16), //bcp->offset
    16, //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_E14x15,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G14x15y3[];
extern void _ZN6E14x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv)();
extern void ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn20_N6E14x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G14x15y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x15y3[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G14x15y3[0]),
  (VTBL_ENTRY)&_ZN6E14x153fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G14x15y3[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G14x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G14x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G14x15y3[];
extern void _ZN6E14x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x15__8G14x15y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
  (VTBL_ENTRY)&_ZN6E14x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__6E14x15__8G14x15y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv)();
extern void ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn20_N6E14x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x15__8G14x15y3[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C14__8G14x15y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__8G14x15y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x15y3[] = {
  {&(_ZTV8G14x15y3[8]),  8,28},
  {&(_ZTV8G14x15y3[15]),  15,28},
  {&(_ZTV8G14x15y3[20]),  20,28},
  {&(_ZTV8G14x15y3[23]),  23,28},
  {&(_ZTV8G14x15y3[27]),  27,28},
  {&(_tg__ZTV6E14x15__8G14x15y3[6]),  6,7},
  {&(_tg__ZTV3C14__6E14x15__8G14x15y3[4]),  4,4},
  {&(_tg__ZTV2B1__6E14x15__8G14x15y3[3]),  3,4},
  {&(_tg__ZTV3C14__8G14x15y3[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__8G14x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x15y3[];
extern  VTBL_ENTRY _ZTV8G14x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x15y3[];
static VTBL_ENTRY alt_thunk_names606[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn20_N6E14x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn20_N6E14x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x15y3 = {  "G14x15y3", // class name
  bases_G14x15y3, 6,
  &(vtc_G14x15y3[0]), // expected_vtbl_contents
  &(vtt_G14x15y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G14x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x15y3),28, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x15y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names606,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x15y4  : E14x15 , F0 {
  int ff;
  ~G14x15y4(); // tgen
  G14x15y4(); // tgen
};
//SIG(1 G14x15y4) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G14x15y4 ::~G14x15y4(){ note_dtor("G14x15y4", this);} // tgen
G14x15y4 ::G14x15y4(){ note_ctor("G14x15y4", this);} // tgen

static void Test_G14x15y4()
{
  extern Class_Descriptor cd_G14x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x15y4, buf);
    G14x15y4 *dp, &lv = *(dp=new (buf) G14x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x15y4)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(36,24), "G14x15y4");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(40,28), "G14x15y4");
    check_base_class_offset(lv, (C14*)(E14x15*), ABISELECT(24,16), "G14x15y4");
    check_base_class_offset(lv, (D0*)(E14x15*), ABISELECT(52,36), "G14x15y4");
    check_base_class_offset(lv, (E14x15*), 0, "G14x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G14x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G14x15y4.ff");
    test_class_info(&lv, &cd_G14x15y4);
    dp->~G14x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x15y4(Test_G14x15y4, "G14x15y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G14x15y4C1Ev();
extern void _ZN8G14x15y4D1Ev();
Name_Map name_map_G14x15y4[] = {
  NSPAIR(_ZN8G14x15y4C1Ev),
  NSPAIR(_ZN8G14x15y4D1Ev),
  {0,0}
};
extern Class_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_E14x15;
extern VTBL_ENTRY _ZTI6E14x15[];
extern  VTBL_ENTRY _ZTV6E14x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x15y4[] = {
  // 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
    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(24,16), //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(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_E14x15,    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 _ZTI8G14x15y4[];
extern void _ZN6E14x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv)();
extern void ABISELECT(_ZThn40_N6E14x153fooEv,_ZThn28_N6E14x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x15y4[0]),
  (VTBL_ENTRY)&_ZN6E14x153fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G14x15y4[0]),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G14x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv),
};
extern VTBL_ENTRY _ZTV8G14x15y4[];
extern void _ZN6E14x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x15__8G14x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
  (VTBL_ENTRY)&_ZN6E14x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__6E14x15__8G14x15y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv)();
extern void ABISELECT(_ZThn40_N6E14x153fooEv,_ZThn28_N6E14x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x15__8G14x15y4[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C14__8G14x15y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__8G14x15y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x15y4[] = {
  {&(_ZTV8G14x15y4[6]),  6,15},
  {&(_tg__ZTV6E14x15__8G14x15y4[6]),  6,7},
  {&(_tg__ZTV3C14__6E14x15__8G14x15y4[4]),  4,4},
  {&(_tg__ZTV2B1__6E14x15__8G14x15y4[3]),  3,4},
  {&(_ZTV8G14x15y4[11]),  11,15},
  {&(_ZTV8G14x15y4[14]),  14,15},
  {&(_tg__ZTV3C14__8G14x15y4[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__8G14x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x15y4[];
extern  VTBL_ENTRY _ZTV8G14x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x15y4[];
static VTBL_ENTRY alt_thunk_names607[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E14x153fooEv,_ZThn28_N6E14x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E14x153fooEv,_ZThn28_N6E14x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x15y4 = {  "G14x15y4", // class name
  bases_G14x15y4, 6,
  &(vtc_G14x15y4[0]), // expected_vtbl_contents
  &(vtt_G14x15y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G14x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x15y4),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x15y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names607,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x15y5  : virtual E14x15 , F0 {
  int ff;
  ~G14x15y5(); // tgen
  G14x15y5(); // tgen
};
//SIG(1 G14x15y5) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G14x15y5 ::~G14x15y5(){ note_dtor("G14x15y5", this);} // tgen
G14x15y5 ::G14x15y5(){ note_ctor("G14x15y5", this);} // tgen

static void Test_G14x15y5()
{
  extern Class_Descriptor cd_G14x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G14x15y5, buf);
    G14x15y5 *dp, &lv = *(dp=new (buf) G14x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G14x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x15y5)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,28), "G14x15y5");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,32), "G14x15y5");
    check_base_class_offset(lv, (C14*)(E14x15*), ABISELECT(32,20), "G14x15y5");
    check_base_class_offset(lv, (D0*)(E14x15*), ABISELECT(60,40), "G14x15y5");
    check_base_class_offset(lv, (E14x15*), ABISELECT(16,12), "G14x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G14x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x15y5.ff");
    test_class_info(&lv, &cd_G14x15y5);
    dp->~G14x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x15y5(Test_G14x15y5, "G14x15y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G14x15y5C1Ev();
extern void _ZN8G14x15y5D1Ev();
Name_Map name_map_G14x15y5[] = {
  NSPAIR(_ZN8G14x15y5C1Ev),
  NSPAIR(_ZN8G14x15y5D1Ev),
  {0,0}
};
extern Class_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_E14x15;
extern VTBL_ENTRY _ZTI6E14x15[];
extern  VTBL_ENTRY _ZTV6E14x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x15y5[] = {
  // 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_C14,    ABISELECT(32,20), //bcp->offset
    15, //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_E14x15,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G14x15y5[];
extern void _ZN6E14x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv)();
extern void ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn20_N6E14x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x15y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x15y5[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G14x15y5[0]),
  (VTBL_ENTRY)&_ZN6E14x153fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G14x15y5[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G14x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv),
};
extern VTBL_ENTRY _ZTV8G14x15y5[];
extern void _ZN6E14x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x15__8G14x15y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
  (VTBL_ENTRY)&_ZN6E14x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__6E14x15__8G14x15y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv)();
extern void ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn20_N6E14x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x15__8G14x15y5[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C14__8G14x15y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__8G14x15y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x15y5[] = {
  {&(_ZTV8G14x15y5[7]),  7,23},
  {&(_ZTV8G14x15y5[14]),  14,23},
  {&(_ZTV8G14x15y5[19]),  19,23},
  {&(_ZTV8G14x15y5[22]),  22,23},
  {&(_tg__ZTV6E14x15__8G14x15y5[6]),  6,7},
  {&(_tg__ZTV3C14__6E14x15__8G14x15y5[4]),  4,4},
  {&(_tg__ZTV2B1__6E14x15__8G14x15y5[3]),  3,4},
  {&(_tg__ZTV3C14__8G14x15y5[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__8G14x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x15y5[];
extern  VTBL_ENTRY _ZTV8G14x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x15y5[];
static VTBL_ENTRY alt_thunk_names608[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn20_N6E14x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn20_N6E14x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x15y5 = {  "G14x15y5", // class name
  bases_G14x15y5, 6,
  &(vtc_G14x15y5[0]), // expected_vtbl_contents
  &(vtt_G14x15y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G14x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x15y5),23, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x15y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names608,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x15y6  : E14x15 , virtual F0 {
  int ff;
  ~G14x15y6(); // tgen
  G14x15y6(); // tgen
};
//SIG(1 G14x15y6) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G14x15y6 ::~G14x15y6(){ note_dtor("G14x15y6", this);} // tgen
G14x15y6 ::G14x15y6(){ note_ctor("G14x15y6", this);} // tgen

static void Test_G14x15y6()
{
  extern Class_Descriptor cd_G14x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x15y6, buf);
    G14x15y6 *dp, &lv = *(dp=new (buf) G14x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x15y6)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(28,20), "G14x15y6");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(32,24), "G14x15y6");
    check_base_class_offset(lv, (C14*)(E14x15*), ABISELECT(16,12), "G14x15y6");
    check_base_class_offset(lv, (D0*)(E14x15*), ABISELECT(44,32), "G14x15y6");
    check_base_class_offset(lv, (E14x15*), 0, "G14x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G14x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x15y6.ff");
    test_class_info(&lv, &cd_G14x15y6);
    dp->~G14x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x15y6(Test_G14x15y6, "G14x15y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G14x15y6C1Ev();
extern void _ZN8G14x15y6D1Ev();
Name_Map name_map_G14x15y6[] = {
  NSPAIR(_ZN8G14x15y6C1Ev),
  NSPAIR(_ZN8G14x15y6D1Ev),
  {0,0}
};
extern Class_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_E14x15;
extern VTBL_ENTRY _ZTI6E14x15[];
extern  VTBL_ENTRY _ZTV6E14x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x15y6[] = {
  // 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
    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(16,12), //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(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_E14x15,    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 _ZTI8G14x15y6[];
extern void _ZN6E14x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv)();
extern void ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn24_N6E14x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x15y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x15y6[0]),
  (VTBL_ENTRY)&_ZN6E14x153fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G14x15y6[0]),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G14x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv),
};
extern VTBL_ENTRY _ZTV8G14x15y6[];
extern void _ZN6E14x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x15__8G14x15y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
  (VTBL_ENTRY)&_ZN6E14x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__6E14x15__8G14x15y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv)();
extern void ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn24_N6E14x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x15__8G14x15y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C14__8G14x15y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__8G14x15y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x15y6[] = {
  {&(_ZTV8G14x15y6[7]),  7,16},
  {&(_tg__ZTV6E14x15__8G14x15y6[6]),  6,7},
  {&(_tg__ZTV3C14__6E14x15__8G14x15y6[4]),  4,4},
  {&(_tg__ZTV2B1__6E14x15__8G14x15y6[3]),  3,4},
  {&(_ZTV8G14x15y6[12]),  12,16},
  {&(_ZTV8G14x15y6[15]),  15,16},
  {&(_tg__ZTV3C14__8G14x15y6[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__8G14x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x15y6[];
extern  VTBL_ENTRY _ZTV8G14x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x15y6[];
static VTBL_ENTRY alt_thunk_names609[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn24_N6E14x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn24_N6E14x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x15y6 = {  "G14x15y6", // class name
  bases_G14x15y6, 6,
  &(vtc_G14x15y6[0]), // expected_vtbl_contents
  &(vtt_G14x15y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G14x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x15y6),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x15y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names609,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x15y7  : virtual E14x15 , virtual F0 {
  int ff;
  ~G14x15y7(); // tgen
  G14x15y7(); // tgen
};
//SIG(1 G14x15y7) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G14x15y7 ::~G14x15y7(){ note_dtor("G14x15y7", this);} // tgen
G14x15y7 ::G14x15y7(){ note_ctor("G14x15y7", this);} // tgen

static void Test_G14x15y7()
{
  extern Class_Descriptor cd_G14x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G14x15y7, buf);
    G14x15y7 *dp, &lv = *(dp=new (buf) G14x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G14x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x15y7)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,24), "G14x15y7");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,28), "G14x15y7");
    check_base_class_offset(lv, (C14*)(E14x15*), ABISELECT(32,16), "G14x15y7");
    check_base_class_offset(lv, (D0*)(E14x15*), ABISELECT(60,36), "G14x15y7");
    check_base_class_offset(lv, (E14x15*), ABISELECT(16,8), "G14x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G14x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G14x15y7.ff");
    test_class_info(&lv, &cd_G14x15y7);
    dp->~G14x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x15y7(Test_G14x15y7, "G14x15y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G14x15y7C1Ev();
extern void _ZN8G14x15y7D1Ev();
Name_Map name_map_G14x15y7[] = {
  NSPAIR(_ZN8G14x15y7C1Ev),
  NSPAIR(_ZN8G14x15y7D1Ev),
  {0,0}
};
extern Class_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_E14x15;
extern VTBL_ENTRY _ZTI6E14x15[];
extern  VTBL_ENTRY _ZTV6E14x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E14x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x15y7[] = {
  // 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_C14,    ABISELECT(32,16), //bcp->offset
    16, //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_E14x15,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G14x15y7[];
extern void _ZN6E14x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv)();
extern void ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn20_N6E14x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G14x15y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G14x15y7[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G14x15y7[0]),
  (VTBL_ENTRY)&_ZN6E14x153fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G14x15y7[0]),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G14x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv),
};
extern VTBL_ENTRY _ZTV8G14x15y7[];
extern void _ZN6E14x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E14x15__8G14x15y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
  (VTBL_ENTRY)&_ZN6E14x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__6E14x15__8G14x15y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv)();
extern void ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn20_N6E14x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E14x15__8G14x15y7[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E14x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C14__8G14x15y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__8G14x15y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x15y7[] = {
  {&(_ZTV8G14x15y7[8]),  8,24},
  {&(_ZTV8G14x15y7[15]),  15,24},
  {&(_ZTV8G14x15y7[20]),  20,24},
  {&(_ZTV8G14x15y7[23]),  23,24},
  {&(_tg__ZTV6E14x15__8G14x15y7[6]),  6,7},
  {&(_tg__ZTV3C14__6E14x15__8G14x15y7[4]),  4,4},
  {&(_tg__ZTV2B1__6E14x15__8G14x15y7[3]),  3,4},
  {&(_tg__ZTV3C14__8G14x15y7[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__8G14x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G14x15y7[];
extern  VTBL_ENTRY _ZTV8G14x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G14x15y7[];
static VTBL_ENTRY alt_thunk_names610[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E14x153fooEv,_ZTv0_n12_N6E14x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn20_N6E14x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E14x153fooEv,_ZThn20_N6E14x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G14x15y7 = {  "G14x15y7", // class name
  bases_G14x15y7, 6,
  &(vtc_G14x15y7[0]), // expected_vtbl_contents
  &(vtt_G14x15y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G14x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G14x15y7),24, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G14x15y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names610,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E15x15  : virtual C15 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E15x153fooEv
  ~E15x15(); // tgen
  E15x15(); // tgen
};
//SIG(-1 E15x15) C1{ VBC2{ VBC3{ v1 Fi} VBC4{ v1 Fi} Fi} VBC5{ Fi} v1 Fi}


void  E15x15 ::foo(){vfunc_called(this, "_ZN6E15x153fooEv");}
E15x15 ::~E15x15(){ note_dtor("E15x15", this);} // tgen
E15x15 ::E15x15(){ note_ctor("E15x15", this);} // tgen

static void Test_E15x15()
{
  extern Class_Descriptor cd_E15x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_E15x15, buf);
    E15x15 *dp, &lv = *(dp=new (buf) E15x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(E15x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E15x15)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(32,16), "E15x15");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(48,24), "E15x15");
    check_base_class_offset(lv, (C15*), ABISELECT(16,8), "E15x15");
    check_base_class_offset(lv, (D0*), ABISELECT(60,32), "E15x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E15x15.fd");
    test_class_info(&lv, &cd_E15x15);
    dp->~E15x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE15x15(Test_E15x15, "E15x15", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN6E15x15C1Ev();
extern void _ZN6E15x15D1Ev();
Name_Map name_map_E15x15[] = {
  NSPAIR(_ZN6E15x15C1Ev),
  NSPAIR(_ZN6E15x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x15[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //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,24), //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,8), //bcp->offset
    7, //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 _ZTI6E15x15[];
extern void _ZN6E15x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn16_N6E15x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn24_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E15x15[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&_ZN6E15x153fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
extern VTBL_ENTRY _ZTV6E15x15[];
static  VTBL_ENTRY _tg__ZTV3C15__6E15x15[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__6E15x15[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__6E15x15[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E15x15[] = {
  {&(_ZTV6E15x15[6]),  6,19},
  {&(_ZTV6E15x15[11]),  11,19},
  {&(_ZTV6E15x15[14]),  14,19},
  {&(_ZTV6E15x15[18]),  18,19},
  {&(_tg__ZTV3C15__6E15x15[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__6E15x15[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__6E15x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E15x15[];
extern  VTBL_ENTRY _ZTV6E15x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x15[];
static VTBL_ENTRY alt_thunk_names611[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn24_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn16_N6E15x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E15x15 = {  "E15x15", // class name
  bases_E15x15, 4,
  &(vtc_E15x15[0]), // expected_vtbl_contents
  &(vtt_E15x15[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI6E15x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E15x15),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E15x15),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names611,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x15y0  : E15x15 , F1 {
  int ff;
  ~G15x15y0(); // tgen
  G15x15y0(); // tgen
};
//SIG(1 G15x15y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G15x15y0 ::~G15x15y0(){ note_dtor("G15x15y0", this);} // tgen
G15x15y0 ::G15x15y0(){ note_ctor("G15x15y0", this);} // tgen

static void Test_G15x15y0()
{
  extern Class_Descriptor cd_G15x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G15x15y0, buf);
    G15x15y0 *dp, &lv = *(dp=new (buf) G15x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G15x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x15y0)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,28), "G15x15y0");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,36), "G15x15y0");
    check_base_class_offset(lv, (C15*)(E15x15*), ABISELECT(32,20), "G15x15y0");
    check_base_class_offset(lv, (D0*)(E15x15*), ABISELECT(76,44), "G15x15y0");
    check_base_class_offset(lv, (E15x15*), 0, "G15x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G15x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G15x15y0.ff");
    test_class_info(&lv, &cd_G15x15y0);
    dp->~G15x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x15y0(Test_G15x15y0, "G15x15y0", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G15x15y0C1Ev();
extern void _ZN8G15x15y0D1Ev();
Name_Map name_map_G15x15y0[] = {
  NSPAIR(_ZN8G15x15y0C1Ev),
  NSPAIR(_ZN8G15x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x15;
extern VTBL_ENTRY _ZTI6E15x15[];
extern  VTBL_ENTRY _ZTV6E15x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x15y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //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,36), //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_C15,    ABISELECT(32,20), //bcp->offset
    10, //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_E15x15,    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
    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 _ZTI8G15x15y0[];
extern void _ZN6E15x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn28_N6E15x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn64_N6E15x153fooEv,_ZThn36_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x15y0[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x15y0[0]),
  (VTBL_ENTRY)&_ZN6E15x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G15x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G15x15y0[0]),
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G15x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
  ABISELECT(-64,-36),
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI8G15x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
extern VTBL_ENTRY _ZTV8G15x15y0[];
extern void _ZN6E15x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x15__8G15x15y0[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&_ZN6E15x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__6E15x15__8G15x15y0[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn28_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x15__8G15x15y0[] = {
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn64_N6E15x153fooEv,_ZThn36_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x15__8G15x15y0[] = {
  ABISELECT(-64,-36),
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C15__8G15x15y0[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__8G15x15y0[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__8G15x15y0[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x15y0[] = {
  {&(_ZTV8G15x15y0[6]),  6,22},
  {&(_tg__ZTV6E15x15__8G15x15y0[6]),  6,7},
  {&(_tg__ZTV3C15__6E15x15__8G15x15y0[4]),  4,4},
  {&(_tg__ZTV2A1__6E15x15__8G15x15y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x15__8G15x15y0[3]),  3,4},
  {&(_ZTV8G15x15y0[14]),  14,22},
  {&(_ZTV8G15x15y0[17]),  17,22},
  {&(_ZTV8G15x15y0[21]),  21,22},
  {&(_tg__ZTV3C15__8G15x15y0[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__8G15x15y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__8G15x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x15y0[];
extern  VTBL_ENTRY _ZTV8G15x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x15y0[];
static VTBL_ENTRY alt_thunk_names612[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn64_N6E15x153fooEv,_ZThn36_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn28_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn64_N6E15x153fooEv,_ZThn36_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn28_N6E15x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x15y0 = {  "G15x15y0", // class name
  bases_G15x15y0, 6,
  &(vtc_G15x15y0[0]), // expected_vtbl_contents
  &(vtt_G15x15y0[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G15x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x15y0),22, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x15y0),11, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names612,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x15y1  : virtual E15x15 , F1 {
  int ff;
  ~G15x15y1(); // tgen
  G15x15y1(); // tgen
};
//SIG(1 G15x15y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G15x15y1 ::~G15x15y1(){ note_dtor("G15x15y1", this);} // tgen
G15x15y1 ::G15x15y1(){ note_ctor("G15x15y1", this);} // tgen

static void Test_G15x15y1()
{
  extern Class_Descriptor cd_G15x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G15x15y1, buf);
    G15x15y1 *dp, &lv = *(dp=new (buf) G15x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G15x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x15y1)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,28), "G15x15y1");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,36), "G15x15y1");
    check_base_class_offset(lv, (C15*)(E15x15*), ABISELECT(32,20), "G15x15y1");
    check_base_class_offset(lv, (D0*)(E15x15*), ABISELECT(76,44), "G15x15y1");
    check_base_class_offset(lv, (E15x15*), ABISELECT(16,12), "G15x15y1");
    check_base_class_offset(lv, (F1*), 0, "G15x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x15y1.ff");
    test_class_info(&lv, &cd_G15x15y1);
    dp->~G15x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x15y1(Test_G15x15y1, "G15x15y1", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G15x15y1C1Ev();
extern void _ZN8G15x15y1D1Ev();
Name_Map name_map_G15x15y1[] = {
  NSPAIR(_ZN8G15x15y1C1Ev),
  NSPAIR(_ZN8G15x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x15;
extern VTBL_ENTRY _ZTI6E15x15[];
extern  VTBL_ENTRY _ZTV6E15x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x15y1[] = {
  // 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_C15,    ABISELECT(32,20), //bcp->offset
    16, //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_E15x15,    ABISELECT(16,12), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G15x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E15x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn16_N6E15x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn24_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x15y1[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G15x15y1[0]),
  (VTBL_ENTRY)&_ZN6E15x153fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G15x15y1[0]),
  ABISELECT(-32,-16),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G15x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI8G15x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
extern VTBL_ENTRY _ZTV8G15x15y1[];
extern void _ZN6E15x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x15__8G15x15y1[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&_ZN6E15x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__6E15x15__8G15x15y1[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn16_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x15__8G15x15y1[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn24_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x15__8G15x15y1[] = {
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C15__8G15x15y1[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__8G15x15y1[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__8G15x15y1[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x15y1[] = {
  {&(_ZTV8G15x15y1[7]),  7,28},
  {&(_ZTV8G15x15y1[15]),  15,28},
  {&(_ZTV8G15x15y1[20]),  20,28},
  {&(_ZTV8G15x15y1[23]),  23,28},
  {&(_ZTV8G15x15y1[27]),  27,28},
  {&(_tg__ZTV6E15x15__8G15x15y1[6]),  6,7},
  {&(_tg__ZTV3C15__6E15x15__8G15x15y1[4]),  4,4},
  {&(_tg__ZTV2A1__6E15x15__8G15x15y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x15__8G15x15y1[3]),  3,4},
  {&(_tg__ZTV3C15__8G15x15y1[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__8G15x15y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__8G15x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x15y1[];
extern  VTBL_ENTRY _ZTV8G15x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x15y1[];
static VTBL_ENTRY alt_thunk_names613[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn24_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn16_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn24_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn16_N6E15x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x15y1 = {  "G15x15y1", // class name
  bases_G15x15y1, 6,
  &(vtc_G15x15y1[0]), // expected_vtbl_contents
  &(vtt_G15x15y1[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G15x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x15y1),28, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x15y1),12, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names613,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x15y2  : E15x15 , virtual F1 {
  int ff;
  ~G15x15y2(); // tgen
  G15x15y2(); // tgen
};
//SIG(1 G15x15y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G15x15y2 ::~G15x15y2(){ note_dtor("G15x15y2", this);} // tgen
G15x15y2 ::G15x15y2(){ note_ctor("G15x15y2", this);} // tgen

static void Test_G15x15y2()
{
  extern Class_Descriptor cd_G15x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G15x15y2, buf);
    G15x15y2 *dp, &lv = *(dp=new (buf) G15x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G15x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x15y2)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(32,20), "G15x15y2");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(48,28), "G15x15y2");
    check_base_class_offset(lv, (C15*)(E15x15*), ABISELECT(16,12), "G15x15y2");
    check_base_class_offset(lv, (D0*)(E15x15*), ABISELECT(60,36), "G15x15y2");
    check_base_class_offset(lv, (E15x15*), 0, "G15x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G15x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x15y2.ff");
    test_class_info(&lv, &cd_G15x15y2);
    dp->~G15x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x15y2(Test_G15x15y2, "G15x15y2", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G15x15y2C1Ev();
extern void _ZN8G15x15y2D1Ev();
Name_Map name_map_G15x15y2[] = {
  NSPAIR(_ZN8G15x15y2C1Ev),
  NSPAIR(_ZN8G15x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x15;
extern VTBL_ENTRY _ZTI6E15x15[];
extern  VTBL_ENTRY _ZTV6E15x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x15y2[] = {
  // 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)
    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
    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(16,12), //bcp->offset
    8, //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_E15x15,    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
    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 _ZTI8G15x15y2[];
extern void _ZN6E15x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn20_N6E15x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn28_N6E15x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G15x15y2[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x15y2[0]),
  (VTBL_ENTRY)&_ZN6E15x153fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G15x15y2[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G15x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G15x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G15x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G15x15y2[];
extern void _ZN6E15x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x15__8G15x15y2[] = {
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&_ZN6E15x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__6E15x15__8G15x15y2[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn20_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x15__8G15x15y2[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn28_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x15__8G15x15y2[] = {
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C15__8G15x15y2[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__8G15x15y2[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__8G15x15y2[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x15y2[] = {
  {&(_ZTV8G15x15y2[7]),  7,24},
  {&(_tg__ZTV6E15x15__8G15x15y2[6]),  6,7},
  {&(_tg__ZTV3C15__6E15x15__8G15x15y2[4]),  4,4},
  {&(_tg__ZTV2A1__6E15x15__8G15x15y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x15__8G15x15y2[3]),  3,4},
  {&(_ZTV8G15x15y2[12]),  12,24},
  {&(_ZTV8G15x15y2[15]),  15,24},
  {&(_ZTV8G15x15y2[19]),  19,24},
  {&(_ZTV8G15x15y2[23]),  23,24},
  {&(_tg__ZTV3C15__8G15x15y2[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__8G15x15y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__8G15x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x15y2[];
extern  VTBL_ENTRY _ZTV8G15x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x15y2[];
static VTBL_ENTRY alt_thunk_names614[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn28_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn20_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn28_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn20_N6E15x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x15y2 = {  "G15x15y2", // class name
  bases_G15x15y2, 6,
  &(vtc_G15x15y2[0]), // expected_vtbl_contents
  &(vtt_G15x15y2[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G15x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x15y2),24, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x15y2),12, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names614,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x15y3  : virtual E15x15 , virtual F1 {
  int ff;
  ~G15x15y3(); // tgen
  G15x15y3(); // tgen
};
//SIG(1 G15x15y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G15x15y3 ::~G15x15y3(){ note_dtor("G15x15y3", this);} // tgen
G15x15y3 ::G15x15y3(){ note_ctor("G15x15y3", this);} // tgen

static void Test_G15x15y3()
{
  extern Class_Descriptor cd_G15x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(13,14)];
    init_test(&cd_G15x15y3, buf);
    G15x15y3 *dp, &lv = *(dp=new (buf) G15x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(96,52), "sizeof(G15x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x15y3)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,24), "G15x15y3");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,32), "G15x15y3");
    check_base_class_offset(lv, (C15*)(E15x15*), ABISELECT(32,16), "G15x15y3");
    check_base_class_offset(lv, (D0*)(E15x15*), ABISELECT(76,40), "G15x15y3");
    check_base_class_offset(lv, (E15x15*), ABISELECT(16,8), "G15x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(80,44), "G15x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G15x15y3.ff");
    test_class_info(&lv, &cd_G15x15y3);
    dp->~G15x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x15y3(Test_G15x15y3, "G15x15y3", ABISELECT(96,52));

#else // __cplusplus

extern void _ZN8G15x15y3C1Ev();
extern void _ZN8G15x15y3D1Ev();
Name_Map name_map_G15x15y3[] = {
  NSPAIR(_ZN8G15x15y3C1Ev),
  NSPAIR(_ZN8G15x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x15;
extern VTBL_ENTRY _ZTI6E15x15[];
extern  VTBL_ENTRY _ZTV6E15x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x15y3[] = {
  // 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_C15,    ABISELECT(32,16), //bcp->offset
    16, //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_E15x15,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G15x15y3[];
extern void _ZN6E15x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn16_N6E15x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn24_N6E15x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G15x15y3[] = {
  ABISELECT(80,44),
  ABISELECT(76,40),
  ABISELECT(64,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x15y3[0]),
  0,
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G15x15y3[0]),
  (VTBL_ENTRY)&_ZN6E15x153fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G15x15y3[0]),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI8G15x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-64,-32),
  (VTBL_ENTRY)&(_ZTI8G15x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
  0,
  ABISELECT(-80,-44),
  (VTBL_ENTRY)&(_ZTI8G15x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G15x15y3[];
extern void _ZN6E15x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x15__8G15x15y3[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&_ZN6E15x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__6E15x15__8G15x15y3[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn16_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x15__8G15x15y3[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn24_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x15__8G15x15y3[] = {
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C15__8G15x15y3[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__8G15x15y3[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__8G15x15y3[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x15y3[] = {
  {&(_ZTV8G15x15y3[8]),  8,32},
  {&(_ZTV8G15x15y3[15]),  15,32},
  {&(_ZTV8G15x15y3[20]),  20,32},
  {&(_ZTV8G15x15y3[23]),  23,32},
  {&(_ZTV8G15x15y3[27]),  27,32},
  {&(_ZTV8G15x15y3[31]),  31,32},
  {&(_tg__ZTV6E15x15__8G15x15y3[6]),  6,7},
  {&(_tg__ZTV3C15__6E15x15__8G15x15y3[4]),  4,4},
  {&(_tg__ZTV2A1__6E15x15__8G15x15y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x15__8G15x15y3[3]),  3,4},
  {&(_tg__ZTV3C15__8G15x15y3[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__8G15x15y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__8G15x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x15y3[];
extern  VTBL_ENTRY _ZTV8G15x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x15y3[];
static VTBL_ENTRY alt_thunk_names615[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn24_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn16_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn24_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn16_N6E15x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x15y3 = {  "G15x15y3", // class name
  bases_G15x15y3, 6,
  &(vtc_G15x15y3[0]), // expected_vtbl_contents
  &(vtt_G15x15y3[0]), // expected_vtt_contents
  ABISELECT(96,52), // object size
  NSPAIRA(_ZTI8G15x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x15y3),32, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x15y3),13, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names615,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x15y4  : E15x15 , F0 {
  int ff;
  ~G15x15y4(); // tgen
  G15x15y4(); // tgen
};
//SIG(1 G15x15y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G15x15y4 ::~G15x15y4(){ note_dtor("G15x15y4", this);} // tgen
G15x15y4 ::G15x15y4(){ note_ctor("G15x15y4", this);} // tgen

static void Test_G15x15y4()
{
  extern Class_Descriptor cd_G15x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x15y4, buf);
    G15x15y4 *dp, &lv = *(dp=new (buf) G15x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x15y4)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(40,24), "G15x15y4");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(56,32), "G15x15y4");
    check_base_class_offset(lv, (C15*)(E15x15*), ABISELECT(24,16), "G15x15y4");
    check_base_class_offset(lv, (D0*)(E15x15*), ABISELECT(68,40), "G15x15y4");
    check_base_class_offset(lv, (E15x15*), 0, "G15x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G15x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G15x15y4.ff");
    test_class_info(&lv, &cd_G15x15y4);
    dp->~G15x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x15y4(Test_G15x15y4, "G15x15y4", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G15x15y4C1Ev();
extern void _ZN8G15x15y4D1Ev();
Name_Map name_map_G15x15y4[] = {
  NSPAIR(_ZN8G15x15y4C1Ev),
  NSPAIR(_ZN8G15x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x15;
extern VTBL_ENTRY _ZTI6E15x15[];
extern  VTBL_ENTRY _ZTV6E15x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x15y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //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,32), //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(24,16), //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(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_E15x15,    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 _ZTI8G15x15y4[];
extern void _ZN6E15x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn40_N6E15x153fooEv,_ZThn24_N6E15x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn56_N6E15x153fooEv,_ZThn32_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x15y4[] = {
  ABISELECT(68,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x15y4[0]),
  (VTBL_ENTRY)&_ZN6E15x153fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G15x15y4[0]),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G15x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
  ABISELECT(-56,-32),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI8G15x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
extern VTBL_ENTRY _ZTV8G15x15y4[];
extern void _ZN6E15x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x15__8G15x15y4[] = {
  ABISELECT(68,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&_ZN6E15x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__6E15x15__8G15x15y4[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn40_N6E15x153fooEv,_ZThn24_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x15__8G15x15y4[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn56_N6E15x153fooEv,_ZThn32_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x15__8G15x15y4[] = {
  ABISELECT(-56,-32),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C15__8G15x15y4[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__8G15x15y4[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__8G15x15y4[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x15y4[] = {
  {&(_ZTV8G15x15y4[6]),  6,19},
  {&(_tg__ZTV6E15x15__8G15x15y4[6]),  6,7},
  {&(_tg__ZTV3C15__6E15x15__8G15x15y4[4]),  4,4},
  {&(_tg__ZTV2A1__6E15x15__8G15x15y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x15__8G15x15y4[3]),  3,4},
  {&(_ZTV8G15x15y4[11]),  11,19},
  {&(_ZTV8G15x15y4[14]),  14,19},
  {&(_ZTV8G15x15y4[18]),  18,19},
  {&(_tg__ZTV3C15__8G15x15y4[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__8G15x15y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__8G15x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x15y4[];
extern  VTBL_ENTRY _ZTV8G15x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x15y4[];
static VTBL_ENTRY alt_thunk_names616[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E15x153fooEv,_ZThn32_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x153fooEv,_ZThn24_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E15x153fooEv,_ZThn32_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E15x153fooEv,_ZThn24_N6E15x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x15y4 = {  "G15x15y4", // class name
  bases_G15x15y4, 6,
  &(vtc_G15x15y4[0]), // expected_vtbl_contents
  &(vtt_G15x15y4[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G15x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x15y4),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x15y4),11, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names616,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x15y5  : virtual E15x15 , F0 {
  int ff;
  ~G15x15y5(); // tgen
  G15x15y5(); // tgen
};
//SIG(1 G15x15y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G15x15y5 ::~G15x15y5(){ note_dtor("G15x15y5", this);} // tgen
G15x15y5 ::G15x15y5(){ note_ctor("G15x15y5", this);} // tgen

static void Test_G15x15y5()
{
  extern Class_Descriptor cd_G15x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G15x15y5, buf);
    G15x15y5 *dp, &lv = *(dp=new (buf) G15x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G15x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x15y5)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,28), "G15x15y5");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,36), "G15x15y5");
    check_base_class_offset(lv, (C15*)(E15x15*), ABISELECT(32,20), "G15x15y5");
    check_base_class_offset(lv, (D0*)(E15x15*), ABISELECT(76,44), "G15x15y5");
    check_base_class_offset(lv, (E15x15*), ABISELECT(16,12), "G15x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G15x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x15y5.ff");
    test_class_info(&lv, &cd_G15x15y5);
    dp->~G15x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x15y5(Test_G15x15y5, "G15x15y5", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G15x15y5C1Ev();
extern void _ZN8G15x15y5D1Ev();
Name_Map name_map_G15x15y5[] = {
  NSPAIR(_ZN8G15x15y5C1Ev),
  NSPAIR(_ZN8G15x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x15;
extern VTBL_ENTRY _ZTI6E15x15[];
extern  VTBL_ENTRY _ZTV6E15x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x15y5[] = {
  // 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_C15,    ABISELECT(32,20), //bcp->offset
    15, //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_E15x15,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G15x15y5[];
extern void _ZN6E15x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn16_N6E15x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn24_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x15y5[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x15y5[0]),
  0,
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G15x15y5[0]),
  (VTBL_ENTRY)&_ZN6E15x153fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G15x15y5[0]),
  ABISELECT(-32,-16),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G15x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI8G15x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
extern VTBL_ENTRY _ZTV8G15x15y5[];
extern void _ZN6E15x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x15__8G15x15y5[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&_ZN6E15x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__6E15x15__8G15x15y5[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn16_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x15__8G15x15y5[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn24_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x15__8G15x15y5[] = {
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C15__8G15x15y5[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__8G15x15y5[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__8G15x15y5[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x15y5[] = {
  {&(_ZTV8G15x15y5[7]),  7,27},
  {&(_ZTV8G15x15y5[14]),  14,27},
  {&(_ZTV8G15x15y5[19]),  19,27},
  {&(_ZTV8G15x15y5[22]),  22,27},
  {&(_ZTV8G15x15y5[26]),  26,27},
  {&(_tg__ZTV6E15x15__8G15x15y5[6]),  6,7},
  {&(_tg__ZTV3C15__6E15x15__8G15x15y5[4]),  4,4},
  {&(_tg__ZTV2A1__6E15x15__8G15x15y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x15__8G15x15y5[3]),  3,4},
  {&(_tg__ZTV3C15__8G15x15y5[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__8G15x15y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__8G15x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x15y5[];
extern  VTBL_ENTRY _ZTV8G15x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x15y5[];
static VTBL_ENTRY alt_thunk_names617[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn24_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn16_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn24_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn16_N6E15x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x15y5 = {  "G15x15y5", // class name
  bases_G15x15y5, 6,
  &(vtc_G15x15y5[0]), // expected_vtbl_contents
  &(vtt_G15x15y5[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G15x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x15y5),27, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x15y5),12, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names617,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x15y6  : E15x15 , virtual F0 {
  int ff;
  ~G15x15y6(); // tgen
  G15x15y6(); // tgen
};
//SIG(1 G15x15y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G15x15y6 ::~G15x15y6(){ note_dtor("G15x15y6", this);} // tgen
G15x15y6 ::G15x15y6(){ note_ctor("G15x15y6", this);} // tgen

static void Test_G15x15y6()
{
  extern Class_Descriptor cd_G15x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x15y6, buf);
    G15x15y6 *dp, &lv = *(dp=new (buf) G15x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x15y6)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(32,20), "G15x15y6");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(48,28), "G15x15y6");
    check_base_class_offset(lv, (C15*)(E15x15*), ABISELECT(16,12), "G15x15y6");
    check_base_class_offset(lv, (D0*)(E15x15*), ABISELECT(60,36), "G15x15y6");
    check_base_class_offset(lv, (E15x15*), 0, "G15x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G15x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x15y6.ff");
    test_class_info(&lv, &cd_G15x15y6);
    dp->~G15x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x15y6(Test_G15x15y6, "G15x15y6", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G15x15y6C1Ev();
extern void _ZN8G15x15y6D1Ev();
Name_Map name_map_G15x15y6[] = {
  NSPAIR(_ZN8G15x15y6C1Ev),
  NSPAIR(_ZN8G15x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x15;
extern VTBL_ENTRY _ZTI6E15x15[];
extern  VTBL_ENTRY _ZTV6E15x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x15y6[] = {
  // 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)
    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
    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(16,12), //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(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_E15x15,    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 _ZTI8G15x15y6[];
extern void _ZN6E15x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn20_N6E15x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn28_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x15y6[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x15y6[0]),
  (VTBL_ENTRY)&_ZN6E15x153fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G15x15y6[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G15x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G15x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
extern VTBL_ENTRY _ZTV8G15x15y6[];
extern void _ZN6E15x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x15__8G15x15y6[] = {
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&_ZN6E15x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__6E15x15__8G15x15y6[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn20_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x15__8G15x15y6[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn28_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x15__8G15x15y6[] = {
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C15__8G15x15y6[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__8G15x15y6[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__8G15x15y6[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x15y6[] = {
  {&(_ZTV8G15x15y6[7]),  7,20},
  {&(_tg__ZTV6E15x15__8G15x15y6[6]),  6,7},
  {&(_tg__ZTV3C15__6E15x15__8G15x15y6[4]),  4,4},
  {&(_tg__ZTV2A1__6E15x15__8G15x15y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x15__8G15x15y6[3]),  3,4},
  {&(_ZTV8G15x15y6[12]),  12,20},
  {&(_ZTV8G15x15y6[15]),  15,20},
  {&(_ZTV8G15x15y6[19]),  19,20},
  {&(_tg__ZTV3C15__8G15x15y6[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__8G15x15y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__8G15x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x15y6[];
extern  VTBL_ENTRY _ZTV8G15x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x15y6[];
static VTBL_ENTRY alt_thunk_names618[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn28_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn20_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn28_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn20_N6E15x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x15y6 = {  "G15x15y6", // class name
  bases_G15x15y6, 6,
  &(vtc_G15x15y6[0]), // expected_vtbl_contents
  &(vtt_G15x15y6[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G15x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x15y6),20, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x15y6),11, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names618,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x15y7  : virtual E15x15 , virtual F0 {
  int ff;
  ~G15x15y7(); // tgen
  G15x15y7(); // tgen
};
//SIG(1 G15x15y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G15x15y7 ::~G15x15y7(){ note_dtor("G15x15y7", this);} // tgen
G15x15y7 ::G15x15y7(){ note_ctor("G15x15y7", this);} // tgen

static void Test_G15x15y7()
{
  extern Class_Descriptor cd_G15x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G15x15y7, buf);
    G15x15y7 *dp, &lv = *(dp=new (buf) G15x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G15x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x15y7)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,24), "G15x15y7");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,32), "G15x15y7");
    check_base_class_offset(lv, (C15*)(E15x15*), ABISELECT(32,16), "G15x15y7");
    check_base_class_offset(lv, (D0*)(E15x15*), ABISELECT(76,40), "G15x15y7");
    check_base_class_offset(lv, (E15x15*), ABISELECT(16,8), "G15x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(80,44), "G15x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G15x15y7.ff");
    test_class_info(&lv, &cd_G15x15y7);
    dp->~G15x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x15y7(Test_G15x15y7, "G15x15y7", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN8G15x15y7C1Ev();
extern void _ZN8G15x15y7D1Ev();
Name_Map name_map_G15x15y7[] = {
  NSPAIR(_ZN8G15x15y7C1Ev),
  NSPAIR(_ZN8G15x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E15x15;
extern VTBL_ENTRY _ZTI6E15x15[];
extern  VTBL_ENTRY _ZTV6E15x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E15x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x15y7[] = {
  // 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_C15,    ABISELECT(32,16), //bcp->offset
    16, //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_E15x15,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G15x15y7[];
extern void _ZN6E15x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn16_N6E15x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn24_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G15x15y7[] = {
  ABISELECT(80,44),
  ABISELECT(76,40),
  ABISELECT(64,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G15x15y7[0]),
  0,
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G15x15y7[0]),
  (VTBL_ENTRY)&_ZN6E15x153fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G15x15y7[0]),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI8G15x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-64,-32),
  (VTBL_ENTRY)&(_ZTI8G15x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
extern VTBL_ENTRY _ZTV8G15x15y7[];
extern void _ZN6E15x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E15x15__8G15x15y7[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&_ZN6E15x153fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__6E15x15__8G15x15y7[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
};
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn16_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E15x15__8G15x15y7[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv)();
extern void ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn24_N6E15x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E15x15__8G15x15y7[] = {
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI6E15x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv),
};
static  VTBL_ENTRY _tg__ZTV3C15__8G15x15y7[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__8G15x15y7[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__8G15x15y7[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x15y7[] = {
  {&(_ZTV8G15x15y7[8]),  8,28},
  {&(_ZTV8G15x15y7[15]),  15,28},
  {&(_ZTV8G15x15y7[20]),  20,28},
  {&(_ZTV8G15x15y7[23]),  23,28},
  {&(_ZTV8G15x15y7[27]),  27,28},
  {&(_tg__ZTV6E15x15__8G15x15y7[6]),  6,7},
  {&(_tg__ZTV3C15__6E15x15__8G15x15y7[4]),  4,4},
  {&(_tg__ZTV2A1__6E15x15__8G15x15y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E15x15__8G15x15y7[3]),  3,4},
  {&(_tg__ZTV3C15__8G15x15y7[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__8G15x15y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__8G15x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G15x15y7[];
extern  VTBL_ENTRY _ZTV8G15x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G15x15y7[];
static VTBL_ENTRY alt_thunk_names619[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E15x153fooEv,_ZTv0_n12_N6E15x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn24_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn16_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E15x153fooEv,_ZThn24_N6E15x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E15x153fooEv,_ZThn16_N6E15x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G15x15y7 = {  "G15x15y7", // class name
  bases_G15x15y7, 6,
  &(vtc_G15x15y7[0]), // expected_vtbl_contents
  &(vtt_G15x15y7[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI8G15x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G15x15y7),28, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G15x15y7),12, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names619,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E16x15  : virtual C16 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E16x153fooEv
  ~E16x15(); // tgen
  E16x15(); // tgen
};
//SIG(-1 E16x15) C1{ VBC2{ BC3{ Fi} BC4{ Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E16x15 ::foo(){vfunc_called(this, "_ZN6E16x153fooEv");}
E16x15 ::~E16x15(){ note_dtor("E16x15", this);} // tgen
E16x15 ::E16x15(){ note_ctor("E16x15", this);} // tgen

static void Test_E16x15()
{
  extern Class_Descriptor cd_E16x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E16x15, buf);
    E16x15 *dp, &lv = *(dp=new (buf) E16x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E16x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E16x15)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(24,12), "E16x15");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(28,16), "E16x15");
    check_base_class_offset(lv, (C16*), ABISELECT(16,8), "E16x15");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E16x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E16x15.fd");
    test_class_info(&lv, &cd_E16x15);
    dp->~E16x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE16x15(Test_E16x15, "E16x15", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E16x15C1Ev();
extern void _ZN6E16x15D1Ev();
Name_Map name_map_E16x15[] = {
  NSPAIR(_ZN6E16x15C1Ev),
  NSPAIR(_ZN6E16x15D1Ev),
  {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_E16x15[] = {
  // 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
    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_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 _ZTI6E16x15[];
extern void _ZN6E16x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv)();
extern void ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn8_N6E16x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E16x15[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x15[0]),
  (VTBL_ENTRY)&_ZN6E16x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E16x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv),
};
extern VTBL_ENTRY _ZTV6E16x15[];
static  VTT_ENTRY vtt_E16x15[] = {
  {&(_ZTV6E16x15[4]),  4,9},
  {&(_ZTV6E16x15[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6E16x15[];
extern  VTBL_ENTRY _ZTV6E16x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x15[];
static VTBL_ENTRY alt_thunk_names620[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn8_N6E16x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E16x15 = {  "E16x15", // class name
  bases_E16x15, 4,
  &(vtc_E16x15[0]), // expected_vtbl_contents
  &(vtt_E16x15[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E16x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E16x15),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E16x15),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names620,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x15y0  : E16x15 , F1 {
  int ff;
  ~G16x15y0(); // tgen
  G16x15y0(); // tgen
};
//SIG(1 G16x15y0) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G16x15y0 ::~G16x15y0(){ note_dtor("G16x15y0", this);} // tgen
G16x15y0 ::G16x15y0(){ note_ctor("G16x15y0", this);} // tgen

static void Test_G16x15y0()
{
  extern Class_Descriptor cd_G16x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G16x15y0, buf);
    G16x15y0 *dp, &lv = *(dp=new (buf) G16x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G16x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x15y0)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,24), "G16x15y0");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,28), "G16x15y0");
    check_base_class_offset(lv, (C16*)(E16x15*), ABISELECT(32,20), "G16x15y0");
    check_base_class_offset(lv, (D0*)(E16x15*), ABISELECT(52,36), "G16x15y0");
    check_base_class_offset(lv, (E16x15*), 0, "G16x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G16x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G16x15y0.ff");
    test_class_info(&lv, &cd_G16x15y0);
    dp->~G16x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x15y0(Test_G16x15y0, "G16x15y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G16x15y0C1Ev();
extern void _ZN8G16x15y0D1Ev();
Name_Map name_map_G16x15y0[] = {
  NSPAIR(_ZN8G16x15y0C1Ev),
  NSPAIR(_ZN8G16x15y0D1Ev),
  {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_E16x15;
extern VTBL_ENTRY _ZTI6E16x15[];
extern  VTBL_ENTRY _ZTV6E16x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x15y0[] = {
  // 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)
    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_E16x15,    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
    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 _ZTI8G16x15y0[];
extern void _ZN6E16x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv)();
extern void ABISELECT(_ZThn32_N6E16x153fooEv,_ZThn20_N6E16x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G16x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x15y0[0]),
  (VTBL_ENTRY)&_ZN6E16x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G16x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G16x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv),
};
extern VTBL_ENTRY _ZTV8G16x15y0[];
extern void _ZN6E16x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x15__8G16x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x15[0]),
  (VTBL_ENTRY)&_ZN6E16x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv)();
extern void ABISELECT(_ZThn32_N6E16x153fooEv,_ZThn20_N6E16x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C16__6E16x15__8G16x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E16x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv),
};
static  VTT_ENTRY vtt_G16x15y0[] = {
  {&(_ZTV8G16x15y0[4]),  4,12},
  {&(_tg__ZTV6E16x15__8G16x15y0[4]),  4,5},
  {&(_tg__ZTV3C16__6E16x15__8G16x15y0[3]),  3,4},
  {&(_ZTV8G16x15y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI8G16x15y0[];
extern  VTBL_ENTRY _ZTV8G16x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x15y0[];
static VTBL_ENTRY alt_thunk_names621[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E16x153fooEv,_ZThn20_N6E16x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E16x153fooEv,_ZThn20_N6E16x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G16x15y0 = {  "G16x15y0", // class name
  bases_G16x15y0, 6,
  &(vtc_G16x15y0[0]), // expected_vtbl_contents
  &(vtt_G16x15y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G16x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x15y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x15y0),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names621,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x15y1  : virtual E16x15 , F1 {
  int ff;
  ~G16x15y1(); // tgen
  G16x15y1(); // tgen
};
//SIG(1 G16x15y1) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G16x15y1 ::~G16x15y1(){ note_dtor("G16x15y1", this);} // tgen
G16x15y1 ::G16x15y1(){ note_ctor("G16x15y1", this);} // tgen

static void Test_G16x15y1()
{
  extern Class_Descriptor cd_G16x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G16x15y1, buf);
    G16x15y1 *dp, &lv = *(dp=new (buf) G16x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G16x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x15y1)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,24), "G16x15y1");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,28), "G16x15y1");
    check_base_class_offset(lv, (C16*)(E16x15*), ABISELECT(32,20), "G16x15y1");
    check_base_class_offset(lv, (D0*)(E16x15*), ABISELECT(52,36), "G16x15y1");
    check_base_class_offset(lv, (E16x15*), ABISELECT(16,12), "G16x15y1");
    check_base_class_offset(lv, (F1*), 0, "G16x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x15y1.ff");
    test_class_info(&lv, &cd_G16x15y1);
    dp->~G16x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x15y1(Test_G16x15y1, "G16x15y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G16x15y1C1Ev();
extern void _ZN8G16x15y1D1Ev();
Name_Map name_map_G16x15y1[] = {
  NSPAIR(_ZN8G16x15y1C1Ev),
  NSPAIR(_ZN8G16x15y1D1Ev),
  {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_E16x15;
extern VTBL_ENTRY _ZTI6E16x15[];
extern  VTBL_ENTRY _ZTV6E16x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x15y1[] = {
  // 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
    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
    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_E16x15,    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_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 _ZTI8G16x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E16x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv)();
extern void ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn8_N6E16x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G16x15y1[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G16x15y1[0]),
  (VTBL_ENTRY)&_ZN6E16x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G16x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv),
};
extern VTBL_ENTRY _ZTV8G16x15y1[];
extern void _ZN6E16x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x15__8G16x15y1[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x15[0]),
  (VTBL_ENTRY)&_ZN6E16x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv)();
extern void ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn8_N6E16x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C16__6E16x15__8G16x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E16x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv),
};
static  VTT_ENTRY vtt_G16x15y1[] = {
  {&(_ZTV8G16x15y1[5]),  5,16},
  {&(_ZTV8G16x15y1[11]),  11,16},
  {&(_ZTV8G16x15y1[15]),  15,16},
  {&(_tg__ZTV6E16x15__8G16x15y1[4]),  4,5},
  {&(_tg__ZTV3C16__6E16x15__8G16x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G16x15y1[];
extern  VTBL_ENTRY _ZTV8G16x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x15y1[];
static VTBL_ENTRY alt_thunk_names622[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn8_N6E16x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn8_N6E16x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G16x15y1 = {  "G16x15y1", // class name
  bases_G16x15y1, 6,
  &(vtc_G16x15y1[0]), // expected_vtbl_contents
  &(vtt_G16x15y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G16x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x15y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x15y1),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names622,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x15y2  : E16x15 , virtual F1 {
  int ff;
  ~G16x15y2(); // tgen
  G16x15y2(); // tgen
};
//SIG(1 G16x15y2) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G16x15y2 ::~G16x15y2(){ note_dtor("G16x15y2", this);} // tgen
G16x15y2 ::G16x15y2(){ note_ctor("G16x15y2", this);} // tgen

static void Test_G16x15y2()
{
  extern Class_Descriptor cd_G16x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G16x15y2, buf);
    G16x15y2 *dp, &lv = *(dp=new (buf) G16x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G16x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x15y2)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(24,16), "G16x15y2");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(28,20), "G16x15y2");
    check_base_class_offset(lv, (C16*)(E16x15*), ABISELECT(16,12), "G16x15y2");
    check_base_class_offset(lv, (D0*)(E16x15*), ABISELECT(36,28), "G16x15y2");
    check_base_class_offset(lv, (E16x15*), 0, "G16x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G16x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x15y2.ff");
    test_class_info(&lv, &cd_G16x15y2);
    dp->~G16x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x15y2(Test_G16x15y2, "G16x15y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G16x15y2C1Ev();
extern void _ZN8G16x15y2D1Ev();
Name_Map name_map_G16x15y2[] = {
  NSPAIR(_ZN8G16x15y2C1Ev),
  NSPAIR(_ZN8G16x15y2D1Ev),
  {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_E16x15;
extern VTBL_ENTRY _ZTI6E16x15[];
extern  VTBL_ENTRY _ZTV6E16x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x15y2[] = {
  // 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
    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(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_E16x15,    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
    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 _ZTI8G16x15y2[];
extern void _ZN6E16x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv)();
extern void ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn12_N6E16x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x15y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x15y2[0]),
  (VTBL_ENTRY)&_ZN6E16x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G16x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G16x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G16x15y2[];
extern void _ZN6E16x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x15__8G16x15y2[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x15[0]),
  (VTBL_ENTRY)&_ZN6E16x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv)();
extern void ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn12_N6E16x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C16__6E16x15__8G16x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E16x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv),
};
static  VTT_ENTRY vtt_G16x15y2[] = {
  {&(_ZTV8G16x15y2[5]),  5,14},
  {&(_tg__ZTV6E16x15__8G16x15y2[4]),  4,5},
  {&(_tg__ZTV3C16__6E16x15__8G16x15y2[3]),  3,4},
  {&(_ZTV8G16x15y2[9]),  9,14},
  {&(_ZTV8G16x15y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI8G16x15y2[];
extern  VTBL_ENTRY _ZTV8G16x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x15y2[];
static VTBL_ENTRY alt_thunk_names623[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn12_N6E16x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn12_N6E16x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G16x15y2 = {  "G16x15y2", // class name
  bases_G16x15y2, 6,
  &(vtc_G16x15y2[0]), // expected_vtbl_contents
  &(vtt_G16x15y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G16x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x15y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x15y2),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names623,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x15y3  : virtual E16x15 , virtual F1 {
  int ff;
  ~G16x15y3(); // tgen
  G16x15y3(); // tgen
};
//SIG(1 G16x15y3) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G16x15y3 ::~G16x15y3(){ note_dtor("G16x15y3", this);} // tgen
G16x15y3 ::G16x15y3(){ note_ctor("G16x15y3", this);} // tgen

static void Test_G16x15y3()
{
  extern Class_Descriptor cd_G16x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G16x15y3, buf);
    G16x15y3 *dp, &lv = *(dp=new (buf) G16x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G16x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x15y3)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,20), "G16x15y3");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,24), "G16x15y3");
    check_base_class_offset(lv, (C16*)(E16x15*), ABISELECT(32,16), "G16x15y3");
    check_base_class_offset(lv, (D0*)(E16x15*), ABISELECT(52,32), "G16x15y3");
    check_base_class_offset(lv, (E16x15*), ABISELECT(16,8), "G16x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G16x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G16x15y3.ff");
    test_class_info(&lv, &cd_G16x15y3);
    dp->~G16x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x15y3(Test_G16x15y3, "G16x15y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G16x15y3C1Ev();
extern void _ZN8G16x15y3D1Ev();
Name_Map name_map_G16x15y3[] = {
  NSPAIR(_ZN8G16x15y3C1Ev),
  NSPAIR(_ZN8G16x15y3D1Ev),
  {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_E16x15;
extern VTBL_ENTRY _ZTI6E16x15[];
extern  VTBL_ENTRY _ZTV6E16x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x15y3[] = {
  // 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
    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
    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_E16x15,    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
    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 _ZTI8G16x15y3[];
extern void _ZN6E16x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv)();
extern void ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn8_N6E16x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x15y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x15y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G16x15y3[0]),
  (VTBL_ENTRY)&_ZN6E16x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G16x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G16x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G16x15y3[];
extern void _ZN6E16x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x15__8G16x15y3[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x15[0]),
  (VTBL_ENTRY)&_ZN6E16x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv)();
extern void ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn8_N6E16x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C16__6E16x15__8G16x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E16x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv),
};
static  VTT_ENTRY vtt_G16x15y3[] = {
  {&(_ZTV8G16x15y3[6]),  6,20},
  {&(_ZTV8G16x15y3[11]),  11,20},
  {&(_ZTV8G16x15y3[15]),  15,20},
  {&(_ZTV8G16x15y3[19]),  19,20},
  {&(_tg__ZTV6E16x15__8G16x15y3[4]),  4,5},
  {&(_tg__ZTV3C16__6E16x15__8G16x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G16x15y3[];
extern  VTBL_ENTRY _ZTV8G16x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x15y3[];
static VTBL_ENTRY alt_thunk_names624[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn8_N6E16x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn8_N6E16x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G16x15y3 = {  "G16x15y3", // class name
  bases_G16x15y3, 6,
  &(vtc_G16x15y3[0]), // expected_vtbl_contents
  &(vtt_G16x15y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G16x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x15y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x15y3),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names624,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x15y4  : E16x15 , F0 {
  int ff;
  ~G16x15y4(); // tgen
  G16x15y4(); // tgen
};
//SIG(1 G16x15y4) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G16x15y4 ::~G16x15y4(){ note_dtor("G16x15y4", this);} // tgen
G16x15y4 ::G16x15y4(){ note_ctor("G16x15y4", this);} // tgen

static void Test_G16x15y4()
{
  extern Class_Descriptor cd_G16x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x15y4, buf);
    G16x15y4 *dp, &lv = *(dp=new (buf) G16x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x15y4)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(32,20), "G16x15y4");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(36,24), "G16x15y4");
    check_base_class_offset(lv, (C16*)(E16x15*), ABISELECT(24,16), "G16x15y4");
    check_base_class_offset(lv, (D0*)(E16x15*), ABISELECT(44,32), "G16x15y4");
    check_base_class_offset(lv, (E16x15*), 0, "G16x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G16x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G16x15y4.ff");
    test_class_info(&lv, &cd_G16x15y4);
    dp->~G16x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x15y4(Test_G16x15y4, "G16x15y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G16x15y4C1Ev();
extern void _ZN8G16x15y4D1Ev();
Name_Map name_map_G16x15y4[] = {
  NSPAIR(_ZN8G16x15y4C1Ev),
  NSPAIR(_ZN8G16x15y4D1Ev),
  {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_E16x15;
extern VTBL_ENTRY _ZTI6E16x15[];
extern  VTBL_ENTRY _ZTV6E16x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x15y4[] = {
  // 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
    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(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_E16x15,    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 _ZTI8G16x15y4[];
extern void _ZN6E16x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv)();
extern void ABISELECT(_ZThn24_N6E16x153fooEv,_ZThn16_N6E16x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G16x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x15y4[0]),
  (VTBL_ENTRY)&_ZN6E16x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G16x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv),
};
extern VTBL_ENTRY _ZTV8G16x15y4[];
extern void _ZN6E16x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x15__8G16x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x15[0]),
  (VTBL_ENTRY)&_ZN6E16x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv)();
extern void ABISELECT(_ZThn24_N6E16x153fooEv,_ZThn16_N6E16x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C16__6E16x15__8G16x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E16x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv),
};
static  VTT_ENTRY vtt_G16x15y4[] = {
  {&(_ZTV8G16x15y4[4]),  4,9},
  {&(_tg__ZTV6E16x15__8G16x15y4[4]),  4,5},
  {&(_tg__ZTV3C16__6E16x15__8G16x15y4[3]),  3,4},
  {&(_ZTV8G16x15y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G16x15y4[];
extern  VTBL_ENTRY _ZTV8G16x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x15y4[];
static VTBL_ENTRY alt_thunk_names625[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E16x153fooEv,_ZThn16_N6E16x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E16x153fooEv,_ZThn16_N6E16x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G16x15y4 = {  "G16x15y4", // class name
  bases_G16x15y4, 6,
  &(vtc_G16x15y4[0]), // expected_vtbl_contents
  &(vtt_G16x15y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G16x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x15y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x15y4),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names625,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x15y5  : virtual E16x15 , F0 {
  int ff;
  ~G16x15y5(); // tgen
  G16x15y5(); // tgen
};
//SIG(1 G16x15y5) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G16x15y5 ::~G16x15y5(){ note_dtor("G16x15y5", this);} // tgen
G16x15y5 ::G16x15y5(){ note_ctor("G16x15y5", this);} // tgen

static void Test_G16x15y5()
{
  extern Class_Descriptor cd_G16x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G16x15y5, buf);
    G16x15y5 *dp, &lv = *(dp=new (buf) G16x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G16x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x15y5)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,24), "G16x15y5");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,28), "G16x15y5");
    check_base_class_offset(lv, (C16*)(E16x15*), ABISELECT(32,20), "G16x15y5");
    check_base_class_offset(lv, (D0*)(E16x15*), ABISELECT(52,36), "G16x15y5");
    check_base_class_offset(lv, (E16x15*), ABISELECT(16,12), "G16x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G16x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x15y5.ff");
    test_class_info(&lv, &cd_G16x15y5);
    dp->~G16x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x15y5(Test_G16x15y5, "G16x15y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G16x15y5C1Ev();
extern void _ZN8G16x15y5D1Ev();
Name_Map name_map_G16x15y5[] = {
  NSPAIR(_ZN8G16x15y5C1Ev),
  NSPAIR(_ZN8G16x15y5D1Ev),
  {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_E16x15;
extern VTBL_ENTRY _ZTI6E16x15[];
extern  VTBL_ENTRY _ZTV6E16x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x15y5[] = {
  // 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
    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
    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_E16x15,    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_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 _ZTI8G16x15y5[];
extern void _ZN6E16x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv)();
extern void ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn8_N6E16x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G16x15y5[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x15y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G16x15y5[0]),
  (VTBL_ENTRY)&_ZN6E16x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G16x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv),
};
extern VTBL_ENTRY _ZTV8G16x15y5[];
extern void _ZN6E16x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x15__8G16x15y5[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x15[0]),
  (VTBL_ENTRY)&_ZN6E16x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv)();
extern void ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn8_N6E16x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C16__6E16x15__8G16x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E16x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv),
};
static  VTT_ENTRY vtt_G16x15y5[] = {
  {&(_ZTV8G16x15y5[5]),  5,15},
  {&(_ZTV8G16x15y5[10]),  10,15},
  {&(_ZTV8G16x15y5[14]),  14,15},
  {&(_tg__ZTV6E16x15__8G16x15y5[4]),  4,5},
  {&(_tg__ZTV3C16__6E16x15__8G16x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G16x15y5[];
extern  VTBL_ENTRY _ZTV8G16x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x15y5[];
static VTBL_ENTRY alt_thunk_names626[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn8_N6E16x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn8_N6E16x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G16x15y5 = {  "G16x15y5", // class name
  bases_G16x15y5, 6,
  &(vtc_G16x15y5[0]), // expected_vtbl_contents
  &(vtt_G16x15y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G16x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x15y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x15y5),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names626,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x15y6  : E16x15 , virtual F0 {
  int ff;
  ~G16x15y6(); // tgen
  G16x15y6(); // tgen
};
//SIG(1 G16x15y6) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G16x15y6 ::~G16x15y6(){ note_dtor("G16x15y6", this);} // tgen
G16x15y6 ::G16x15y6(){ note_ctor("G16x15y6", this);} // tgen

static void Test_G16x15y6()
{
  extern Class_Descriptor cd_G16x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x15y6, buf);
    G16x15y6 *dp, &lv = *(dp=new (buf) G16x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x15y6)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(24,16), "G16x15y6");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(28,20), "G16x15y6");
    check_base_class_offset(lv, (C16*)(E16x15*), ABISELECT(16,12), "G16x15y6");
    check_base_class_offset(lv, (D0*)(E16x15*), ABISELECT(36,28), "G16x15y6");
    check_base_class_offset(lv, (E16x15*), 0, "G16x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G16x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x15y6.ff");
    test_class_info(&lv, &cd_G16x15y6);
    dp->~G16x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x15y6(Test_G16x15y6, "G16x15y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G16x15y6C1Ev();
extern void _ZN8G16x15y6D1Ev();
Name_Map name_map_G16x15y6[] = {
  NSPAIR(_ZN8G16x15y6C1Ev),
  NSPAIR(_ZN8G16x15y6D1Ev),
  {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_E16x15;
extern VTBL_ENTRY _ZTI6E16x15[];
extern  VTBL_ENTRY _ZTV6E16x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x15y6[] = {
  // 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
    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(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_E16x15,    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 _ZTI8G16x15y6[];
extern void _ZN6E16x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv)();
extern void ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn12_N6E16x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G16x15y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x15y6[0]),
  (VTBL_ENTRY)&_ZN6E16x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G16x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv),
};
extern VTBL_ENTRY _ZTV8G16x15y6[];
extern void _ZN6E16x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x15__8G16x15y6[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x15[0]),
  (VTBL_ENTRY)&_ZN6E16x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv)();
extern void ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn12_N6E16x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C16__6E16x15__8G16x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E16x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv),
};
static  VTT_ENTRY vtt_G16x15y6[] = {
  {&(_ZTV8G16x15y6[5]),  5,10},
  {&(_tg__ZTV6E16x15__8G16x15y6[4]),  4,5},
  {&(_tg__ZTV3C16__6E16x15__8G16x15y6[3]),  3,4},
  {&(_ZTV8G16x15y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G16x15y6[];
extern  VTBL_ENTRY _ZTV8G16x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x15y6[];
static VTBL_ENTRY alt_thunk_names627[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn12_N6E16x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn12_N6E16x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G16x15y6 = {  "G16x15y6", // class name
  bases_G16x15y6, 6,
  &(vtc_G16x15y6[0]), // expected_vtbl_contents
  &(vtt_G16x15y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G16x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x15y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x15y6),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names627,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x15y7  : virtual E16x15 , virtual F0 {
  int ff;
  ~G16x15y7(); // tgen
  G16x15y7(); // tgen
};
//SIG(1 G16x15y7) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G16x15y7 ::~G16x15y7(){ note_dtor("G16x15y7", this);} // tgen
G16x15y7 ::G16x15y7(){ note_ctor("G16x15y7", this);} // tgen

static void Test_G16x15y7()
{
  extern Class_Descriptor cd_G16x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G16x15y7, buf);
    G16x15y7 *dp, &lv = *(dp=new (buf) G16x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G16x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x15y7)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,20), "G16x15y7");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,24), "G16x15y7");
    check_base_class_offset(lv, (C16*)(E16x15*), ABISELECT(32,16), "G16x15y7");
    check_base_class_offset(lv, (D0*)(E16x15*), ABISELECT(52,32), "G16x15y7");
    check_base_class_offset(lv, (E16x15*), ABISELECT(16,8), "G16x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G16x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G16x15y7.ff");
    test_class_info(&lv, &cd_G16x15y7);
    dp->~G16x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x15y7(Test_G16x15y7, "G16x15y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G16x15y7C1Ev();
extern void _ZN8G16x15y7D1Ev();
Name_Map name_map_G16x15y7[] = {
  NSPAIR(_ZN8G16x15y7C1Ev),
  NSPAIR(_ZN8G16x15y7D1Ev),
  {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_E16x15;
extern VTBL_ENTRY _ZTI6E16x15[];
extern  VTBL_ENTRY _ZTV6E16x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E16x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x15y7[] = {
  // 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
    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
    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_E16x15,    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_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 _ZTI8G16x15y7[];
extern void _ZN6E16x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv)();
extern void ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn8_N6E16x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G16x15y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G16x15y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G16x15y7[0]),
  (VTBL_ENTRY)&_ZN6E16x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G16x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv),
};
extern VTBL_ENTRY _ZTV8G16x15y7[];
extern void _ZN6E16x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E16x15__8G16x15y7[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E16x15[0]),
  (VTBL_ENTRY)&_ZN6E16x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv)();
extern void ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn8_N6E16x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C16__6E16x15__8G16x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E16x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv),
};
static  VTT_ENTRY vtt_G16x15y7[] = {
  {&(_ZTV8G16x15y7[6]),  6,16},
  {&(_ZTV8G16x15y7[11]),  11,16},
  {&(_ZTV8G16x15y7[15]),  15,16},
  {&(_tg__ZTV6E16x15__8G16x15y7[4]),  4,5},
  {&(_tg__ZTV3C16__6E16x15__8G16x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G16x15y7[];
extern  VTBL_ENTRY _ZTV8G16x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G16x15y7[];
static VTBL_ENTRY alt_thunk_names628[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E16x153fooEv,_ZTv0_n12_N6E16x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn8_N6E16x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E16x153fooEv,_ZThn8_N6E16x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G16x15y7 = {  "G16x15y7", // class name
  bases_G16x15y7, 6,
  &(vtc_G16x15y7[0]), // expected_vtbl_contents
  &(vtt_G16x15y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G16x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G16x15y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G16x15y7),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names628,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E17x15  : virtual C17 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E17x153fooEv
  ~E17x15(); // tgen
  E17x15(); // tgen
};
//SIG(-1 E17x15) C1{ VBC2{ BC3{ v1 Fi} BC4{ Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E17x15 ::foo(){vfunc_called(this, "_ZN6E17x153fooEv");}
E17x15 ::~E17x15(){ note_dtor("E17x15", this);} // tgen
E17x15 ::E17x15(){ note_ctor("E17x15", this);} // tgen

static void Test_E17x15()
{
  extern Class_Descriptor cd_E17x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E17x15, buf);
    E17x15 *dp, &lv = *(dp=new (buf) E17x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E17x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E17x15)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(16,8), "E17x15");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(28,16), "E17x15");
    check_base_class_offset(lv, (C17*), ABISELECT(16,8), "E17x15");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E17x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E17x15.fd");
    test_class_info(&lv, &cd_E17x15);
    dp->~E17x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE17x15(Test_E17x15, "E17x15", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E17x15C1Ev();
extern void _ZN6E17x15D1Ev();
Name_Map name_map_E17x15[] = {
  NSPAIR(_ZN6E17x15C1Ev),
  NSPAIR(_ZN6E17x15D1Ev),
  {0,0}
};
extern Class_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_E17x15[] = {
  // 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
    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
    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 _ZTI6E17x15[];
extern void _ZN6E17x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv)();
extern void ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn8_N6E17x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E17x15[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x15[0]),
  (VTBL_ENTRY)&_ZN6E17x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E17x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv),
};
extern VTBL_ENTRY _ZTV6E17x15[];
static  VTT_ENTRY vtt_E17x15[] = {
  {&(_ZTV6E17x15[4]),  4,9},
  {&(_ZTV6E17x15[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6E17x15[];
extern  VTBL_ENTRY _ZTV6E17x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x15[];
static VTBL_ENTRY alt_thunk_names629[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn8_N6E17x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E17x15 = {  "E17x15", // class name
  bases_E17x15, 4,
  &(vtc_E17x15[0]), // expected_vtbl_contents
  &(vtt_E17x15[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E17x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E17x15),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E17x15),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names629,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x15y0  : E17x15 , F1 {
  int ff;
  ~G17x15y0(); // tgen
  G17x15y0(); // tgen
};
//SIG(1 G17x15y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G17x15y0 ::~G17x15y0(){ note_dtor("G17x15y0", this);} // tgen
G17x15y0 ::G17x15y0(){ note_ctor("G17x15y0", this);} // tgen

static void Test_G17x15y0()
{
  extern Class_Descriptor cd_G17x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G17x15y0, buf);
    G17x15y0 *dp, &lv = *(dp=new (buf) G17x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G17x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x15y0)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,20), "G17x15y0");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,28), "G17x15y0");
    check_base_class_offset(lv, (C17*)(E17x15*), ABISELECT(32,20), "G17x15y0");
    check_base_class_offset(lv, (D0*)(E17x15*), ABISELECT(52,36), "G17x15y0");
    check_base_class_offset(lv, (E17x15*), 0, "G17x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G17x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G17x15y0.ff");
    test_class_info(&lv, &cd_G17x15y0);
    dp->~G17x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x15y0(Test_G17x15y0, "G17x15y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G17x15y0C1Ev();
extern void _ZN8G17x15y0D1Ev();
Name_Map name_map_G17x15y0[] = {
  NSPAIR(_ZN8G17x15y0C1Ev),
  NSPAIR(_ZN8G17x15y0D1Ev),
  {0,0}
};
extern Class_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_E17x15;
extern VTBL_ENTRY _ZTI6E17x15[];
extern  VTBL_ENTRY _ZTV6E17x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x15y0[] = {
  // 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)
    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_E17x15,    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
    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 _ZTI8G17x15y0[];
extern void _ZN6E17x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv)();
extern void ABISELECT(_ZThn32_N6E17x153fooEv,_ZThn20_N6E17x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G17x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x15y0[0]),
  (VTBL_ENTRY)&_ZN6E17x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G17x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G17x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv),
};
extern VTBL_ENTRY _ZTV8G17x15y0[];
extern void _ZN6E17x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x15__8G17x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x15[0]),
  (VTBL_ENTRY)&_ZN6E17x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv)();
extern void ABISELECT(_ZThn32_N6E17x153fooEv,_ZThn20_N6E17x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C17__6E17x15__8G17x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E17x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv),
};
static  VTT_ENTRY vtt_G17x15y0[] = {
  {&(_ZTV8G17x15y0[4]),  4,12},
  {&(_tg__ZTV6E17x15__8G17x15y0[4]),  4,5},
  {&(_tg__ZTV3C17__6E17x15__8G17x15y0[3]),  3,4},
  {&(_ZTV8G17x15y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI8G17x15y0[];
extern  VTBL_ENTRY _ZTV8G17x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x15y0[];
static VTBL_ENTRY alt_thunk_names630[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E17x153fooEv,_ZThn20_N6E17x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E17x153fooEv,_ZThn20_N6E17x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G17x15y0 = {  "G17x15y0", // class name
  bases_G17x15y0, 6,
  &(vtc_G17x15y0[0]), // expected_vtbl_contents
  &(vtt_G17x15y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G17x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x15y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x15y0),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names630,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x15y1  : virtual E17x15 , F1 {
  int ff;
  ~G17x15y1(); // tgen
  G17x15y1(); // tgen
};
//SIG(1 G17x15y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G17x15y1 ::~G17x15y1(){ note_dtor("G17x15y1", this);} // tgen
G17x15y1 ::G17x15y1(){ note_ctor("G17x15y1", this);} // tgen

static void Test_G17x15y1()
{
  extern Class_Descriptor cd_G17x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G17x15y1, buf);
    G17x15y1 *dp, &lv = *(dp=new (buf) G17x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G17x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x15y1)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,20), "G17x15y1");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,28), "G17x15y1");
    check_base_class_offset(lv, (C17*)(E17x15*), ABISELECT(32,20), "G17x15y1");
    check_base_class_offset(lv, (D0*)(E17x15*), ABISELECT(52,36), "G17x15y1");
    check_base_class_offset(lv, (E17x15*), ABISELECT(16,12), "G17x15y1");
    check_base_class_offset(lv, (F1*), 0, "G17x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x15y1.ff");
    test_class_info(&lv, &cd_G17x15y1);
    dp->~G17x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x15y1(Test_G17x15y1, "G17x15y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G17x15y1C1Ev();
extern void _ZN8G17x15y1D1Ev();
Name_Map name_map_G17x15y1[] = {
  NSPAIR(_ZN8G17x15y1C1Ev),
  NSPAIR(_ZN8G17x15y1D1Ev),
  {0,0}
};
extern Class_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_E17x15;
extern VTBL_ENTRY _ZTI6E17x15[];
extern  VTBL_ENTRY _ZTV6E17x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x15y1[] = {
  // 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
    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
    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_E17x15,    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 _ZTI8G17x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E17x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv)();
extern void ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn8_N6E17x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G17x15y1[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G17x15y1[0]),
  (VTBL_ENTRY)&_ZN6E17x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G17x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv),
};
extern VTBL_ENTRY _ZTV8G17x15y1[];
extern void _ZN6E17x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x15__8G17x15y1[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x15[0]),
  (VTBL_ENTRY)&_ZN6E17x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv)();
extern void ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn8_N6E17x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C17__6E17x15__8G17x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E17x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv),
};
static  VTT_ENTRY vtt_G17x15y1[] = {
  {&(_ZTV8G17x15y1[5]),  5,16},
  {&(_ZTV8G17x15y1[11]),  11,16},
  {&(_ZTV8G17x15y1[15]),  15,16},
  {&(_tg__ZTV6E17x15__8G17x15y1[4]),  4,5},
  {&(_tg__ZTV3C17__6E17x15__8G17x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G17x15y1[];
extern  VTBL_ENTRY _ZTV8G17x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x15y1[];
static VTBL_ENTRY alt_thunk_names631[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn8_N6E17x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn8_N6E17x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G17x15y1 = {  "G17x15y1", // class name
  bases_G17x15y1, 6,
  &(vtc_G17x15y1[0]), // expected_vtbl_contents
  &(vtt_G17x15y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G17x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x15y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x15y1),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names631,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x15y2  : E17x15 , virtual F1 {
  int ff;
  ~G17x15y2(); // tgen
  G17x15y2(); // tgen
};
//SIG(1 G17x15y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G17x15y2 ::~G17x15y2(){ note_dtor("G17x15y2", this);} // tgen
G17x15y2 ::G17x15y2(){ note_ctor("G17x15y2", this);} // tgen

static void Test_G17x15y2()
{
  extern Class_Descriptor cd_G17x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G17x15y2, buf);
    G17x15y2 *dp, &lv = *(dp=new (buf) G17x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G17x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x15y2)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(16,12), "G17x15y2");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(28,20), "G17x15y2");
    check_base_class_offset(lv, (C17*)(E17x15*), ABISELECT(16,12), "G17x15y2");
    check_base_class_offset(lv, (D0*)(E17x15*), ABISELECT(36,28), "G17x15y2");
    check_base_class_offset(lv, (E17x15*), 0, "G17x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G17x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x15y2.ff");
    test_class_info(&lv, &cd_G17x15y2);
    dp->~G17x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x15y2(Test_G17x15y2, "G17x15y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G17x15y2C1Ev();
extern void _ZN8G17x15y2D1Ev();
Name_Map name_map_G17x15y2[] = {
  NSPAIR(_ZN8G17x15y2C1Ev),
  NSPAIR(_ZN8G17x15y2D1Ev),
  {0,0}
};
extern Class_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_E17x15;
extern VTBL_ENTRY _ZTI6E17x15[];
extern  VTBL_ENTRY _ZTV6E17x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x15y2[] = {
  // 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
    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(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_E17x15,    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)
    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 _ZTI8G17x15y2[];
extern void _ZN6E17x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv)();
extern void ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn12_N6E17x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x15y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x15y2[0]),
  (VTBL_ENTRY)&_ZN6E17x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G17x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G17x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G17x15y2[];
extern void _ZN6E17x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x15__8G17x15y2[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x15[0]),
  (VTBL_ENTRY)&_ZN6E17x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv)();
extern void ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn12_N6E17x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C17__6E17x15__8G17x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E17x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv),
};
static  VTT_ENTRY vtt_G17x15y2[] = {
  {&(_ZTV8G17x15y2[5]),  5,14},
  {&(_tg__ZTV6E17x15__8G17x15y2[4]),  4,5},
  {&(_tg__ZTV3C17__6E17x15__8G17x15y2[3]),  3,4},
  {&(_ZTV8G17x15y2[9]),  9,14},
  {&(_ZTV8G17x15y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI8G17x15y2[];
extern  VTBL_ENTRY _ZTV8G17x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x15y2[];
static VTBL_ENTRY alt_thunk_names632[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn12_N6E17x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn12_N6E17x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G17x15y2 = {  "G17x15y2", // class name
  bases_G17x15y2, 6,
  &(vtc_G17x15y2[0]), // expected_vtbl_contents
  &(vtt_G17x15y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G17x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x15y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x15y2),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names632,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x15y3  : virtual E17x15 , virtual F1 {
  int ff;
  ~G17x15y3(); // tgen
  G17x15y3(); // tgen
};
//SIG(1 G17x15y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G17x15y3 ::~G17x15y3(){ note_dtor("G17x15y3", this);} // tgen
G17x15y3 ::G17x15y3(){ note_ctor("G17x15y3", this);} // tgen

static void Test_G17x15y3()
{
  extern Class_Descriptor cd_G17x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G17x15y3, buf);
    G17x15y3 *dp, &lv = *(dp=new (buf) G17x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G17x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x15y3)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,16), "G17x15y3");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,24), "G17x15y3");
    check_base_class_offset(lv, (C17*)(E17x15*), ABISELECT(32,16), "G17x15y3");
    check_base_class_offset(lv, (D0*)(E17x15*), ABISELECT(52,32), "G17x15y3");
    check_base_class_offset(lv, (E17x15*), ABISELECT(16,8), "G17x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G17x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G17x15y3.ff");
    test_class_info(&lv, &cd_G17x15y3);
    dp->~G17x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x15y3(Test_G17x15y3, "G17x15y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G17x15y3C1Ev();
extern void _ZN8G17x15y3D1Ev();
Name_Map name_map_G17x15y3[] = {
  NSPAIR(_ZN8G17x15y3C1Ev),
  NSPAIR(_ZN8G17x15y3D1Ev),
  {0,0}
};
extern Class_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_E17x15;
extern VTBL_ENTRY _ZTI6E17x15[];
extern  VTBL_ENTRY _ZTV6E17x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x15y3[] = {
  // 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
    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
    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_E17x15,    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 _ZTI8G17x15y3[];
extern void _ZN6E17x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv)();
extern void ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn8_N6E17x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x15y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x15y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G17x15y3[0]),
  (VTBL_ENTRY)&_ZN6E17x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G17x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G17x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G17x15y3[];
extern void _ZN6E17x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x15__8G17x15y3[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x15[0]),
  (VTBL_ENTRY)&_ZN6E17x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv)();
extern void ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn8_N6E17x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C17__6E17x15__8G17x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E17x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv),
};
static  VTT_ENTRY vtt_G17x15y3[] = {
  {&(_ZTV8G17x15y3[6]),  6,20},
  {&(_ZTV8G17x15y3[11]),  11,20},
  {&(_ZTV8G17x15y3[15]),  15,20},
  {&(_ZTV8G17x15y3[19]),  19,20},
  {&(_tg__ZTV6E17x15__8G17x15y3[4]),  4,5},
  {&(_tg__ZTV3C17__6E17x15__8G17x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G17x15y3[];
extern  VTBL_ENTRY _ZTV8G17x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x15y3[];
static VTBL_ENTRY alt_thunk_names633[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn8_N6E17x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn8_N6E17x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G17x15y3 = {  "G17x15y3", // class name
  bases_G17x15y3, 6,
  &(vtc_G17x15y3[0]), // expected_vtbl_contents
  &(vtt_G17x15y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G17x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x15y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x15y3),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names633,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x15y4  : E17x15 , F0 {
  int ff;
  ~G17x15y4(); // tgen
  G17x15y4(); // tgen
};
//SIG(1 G17x15y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G17x15y4 ::~G17x15y4(){ note_dtor("G17x15y4", this);} // tgen
G17x15y4 ::G17x15y4(){ note_ctor("G17x15y4", this);} // tgen

static void Test_G17x15y4()
{
  extern Class_Descriptor cd_G17x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x15y4, buf);
    G17x15y4 *dp, &lv = *(dp=new (buf) G17x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x15y4)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(24,16), "G17x15y4");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(36,24), "G17x15y4");
    check_base_class_offset(lv, (C17*)(E17x15*), ABISELECT(24,16), "G17x15y4");
    check_base_class_offset(lv, (D0*)(E17x15*), ABISELECT(44,32), "G17x15y4");
    check_base_class_offset(lv, (E17x15*), 0, "G17x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G17x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G17x15y4.ff");
    test_class_info(&lv, &cd_G17x15y4);
    dp->~G17x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x15y4(Test_G17x15y4, "G17x15y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G17x15y4C1Ev();
extern void _ZN8G17x15y4D1Ev();
Name_Map name_map_G17x15y4[] = {
  NSPAIR(_ZN8G17x15y4C1Ev),
  NSPAIR(_ZN8G17x15y4D1Ev),
  {0,0}
};
extern Class_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_E17x15;
extern VTBL_ENTRY _ZTI6E17x15[];
extern  VTBL_ENTRY _ZTV6E17x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x15y4[] = {
  // 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
    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(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_E17x15,    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 _ZTI8G17x15y4[];
extern void _ZN6E17x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv)();
extern void ABISELECT(_ZThn24_N6E17x153fooEv,_ZThn16_N6E17x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G17x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x15y4[0]),
  (VTBL_ENTRY)&_ZN6E17x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G17x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv),
};
extern VTBL_ENTRY _ZTV8G17x15y4[];
extern void _ZN6E17x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x15__8G17x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x15[0]),
  (VTBL_ENTRY)&_ZN6E17x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv)();
extern void ABISELECT(_ZThn24_N6E17x153fooEv,_ZThn16_N6E17x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C17__6E17x15__8G17x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E17x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv),
};
static  VTT_ENTRY vtt_G17x15y4[] = {
  {&(_ZTV8G17x15y4[4]),  4,9},
  {&(_tg__ZTV6E17x15__8G17x15y4[4]),  4,5},
  {&(_tg__ZTV3C17__6E17x15__8G17x15y4[3]),  3,4},
  {&(_ZTV8G17x15y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G17x15y4[];
extern  VTBL_ENTRY _ZTV8G17x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x15y4[];
static VTBL_ENTRY alt_thunk_names634[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E17x153fooEv,_ZThn16_N6E17x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E17x153fooEv,_ZThn16_N6E17x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G17x15y4 = {  "G17x15y4", // class name
  bases_G17x15y4, 6,
  &(vtc_G17x15y4[0]), // expected_vtbl_contents
  &(vtt_G17x15y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G17x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x15y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x15y4),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names634,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x15y5  : virtual E17x15 , F0 {
  int ff;
  ~G17x15y5(); // tgen
  G17x15y5(); // tgen
};
//SIG(1 G17x15y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G17x15y5 ::~G17x15y5(){ note_dtor("G17x15y5", this);} // tgen
G17x15y5 ::G17x15y5(){ note_ctor("G17x15y5", this);} // tgen

static void Test_G17x15y5()
{
  extern Class_Descriptor cd_G17x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G17x15y5, buf);
    G17x15y5 *dp, &lv = *(dp=new (buf) G17x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G17x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x15y5)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,20), "G17x15y5");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,28), "G17x15y5");
    check_base_class_offset(lv, (C17*)(E17x15*), ABISELECT(32,20), "G17x15y5");
    check_base_class_offset(lv, (D0*)(E17x15*), ABISELECT(52,36), "G17x15y5");
    check_base_class_offset(lv, (E17x15*), ABISELECT(16,12), "G17x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G17x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x15y5.ff");
    test_class_info(&lv, &cd_G17x15y5);
    dp->~G17x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x15y5(Test_G17x15y5, "G17x15y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G17x15y5C1Ev();
extern void _ZN8G17x15y5D1Ev();
Name_Map name_map_G17x15y5[] = {
  NSPAIR(_ZN8G17x15y5C1Ev),
  NSPAIR(_ZN8G17x15y5D1Ev),
  {0,0}
};
extern Class_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_E17x15;
extern VTBL_ENTRY _ZTI6E17x15[];
extern  VTBL_ENTRY _ZTV6E17x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x15y5[] = {
  // 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
    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
    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_E17x15,    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 _ZTI8G17x15y5[];
extern void _ZN6E17x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv)();
extern void ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn8_N6E17x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G17x15y5[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x15y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G17x15y5[0]),
  (VTBL_ENTRY)&_ZN6E17x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G17x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv),
};
extern VTBL_ENTRY _ZTV8G17x15y5[];
extern void _ZN6E17x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x15__8G17x15y5[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x15[0]),
  (VTBL_ENTRY)&_ZN6E17x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv)();
extern void ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn8_N6E17x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C17__6E17x15__8G17x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E17x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv),
};
static  VTT_ENTRY vtt_G17x15y5[] = {
  {&(_ZTV8G17x15y5[5]),  5,15},
  {&(_ZTV8G17x15y5[10]),  10,15},
  {&(_ZTV8G17x15y5[14]),  14,15},
  {&(_tg__ZTV6E17x15__8G17x15y5[4]),  4,5},
  {&(_tg__ZTV3C17__6E17x15__8G17x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G17x15y5[];
extern  VTBL_ENTRY _ZTV8G17x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x15y5[];
static VTBL_ENTRY alt_thunk_names635[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn8_N6E17x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn8_N6E17x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G17x15y5 = {  "G17x15y5", // class name
  bases_G17x15y5, 6,
  &(vtc_G17x15y5[0]), // expected_vtbl_contents
  &(vtt_G17x15y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G17x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x15y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x15y5),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names635,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x15y6  : E17x15 , virtual F0 {
  int ff;
  ~G17x15y6(); // tgen
  G17x15y6(); // tgen
};
//SIG(1 G17x15y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G17x15y6 ::~G17x15y6(){ note_dtor("G17x15y6", this);} // tgen
G17x15y6 ::G17x15y6(){ note_ctor("G17x15y6", this);} // tgen

static void Test_G17x15y6()
{
  extern Class_Descriptor cd_G17x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x15y6, buf);
    G17x15y6 *dp, &lv = *(dp=new (buf) G17x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x15y6)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(16,12), "G17x15y6");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(28,20), "G17x15y6");
    check_base_class_offset(lv, (C17*)(E17x15*), ABISELECT(16,12), "G17x15y6");
    check_base_class_offset(lv, (D0*)(E17x15*), ABISELECT(36,28), "G17x15y6");
    check_base_class_offset(lv, (E17x15*), 0, "G17x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G17x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x15y6.ff");
    test_class_info(&lv, &cd_G17x15y6);
    dp->~G17x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x15y6(Test_G17x15y6, "G17x15y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G17x15y6C1Ev();
extern void _ZN8G17x15y6D1Ev();
Name_Map name_map_G17x15y6[] = {
  NSPAIR(_ZN8G17x15y6C1Ev),
  NSPAIR(_ZN8G17x15y6D1Ev),
  {0,0}
};
extern Class_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_E17x15;
extern VTBL_ENTRY _ZTI6E17x15[];
extern  VTBL_ENTRY _ZTV6E17x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x15y6[] = {
  // 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
    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(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_E17x15,    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 _ZTI8G17x15y6[];
extern void _ZN6E17x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv)();
extern void ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn12_N6E17x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G17x15y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x15y6[0]),
  (VTBL_ENTRY)&_ZN6E17x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G17x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv),
};
extern VTBL_ENTRY _ZTV8G17x15y6[];
extern void _ZN6E17x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x15__8G17x15y6[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x15[0]),
  (VTBL_ENTRY)&_ZN6E17x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv)();
extern void ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn12_N6E17x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C17__6E17x15__8G17x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E17x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv),
};
static  VTT_ENTRY vtt_G17x15y6[] = {
  {&(_ZTV8G17x15y6[5]),  5,10},
  {&(_tg__ZTV6E17x15__8G17x15y6[4]),  4,5},
  {&(_tg__ZTV3C17__6E17x15__8G17x15y6[3]),  3,4},
  {&(_ZTV8G17x15y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G17x15y6[];
extern  VTBL_ENTRY _ZTV8G17x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x15y6[];
static VTBL_ENTRY alt_thunk_names636[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn12_N6E17x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn12_N6E17x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G17x15y6 = {  "G17x15y6", // class name
  bases_G17x15y6, 6,
  &(vtc_G17x15y6[0]), // expected_vtbl_contents
  &(vtt_G17x15y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G17x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x15y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x15y6),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names636,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x15y7  : virtual E17x15 , virtual F0 {
  int ff;
  ~G17x15y7(); // tgen
  G17x15y7(); // tgen
};
//SIG(1 G17x15y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G17x15y7 ::~G17x15y7(){ note_dtor("G17x15y7", this);} // tgen
G17x15y7 ::G17x15y7(){ note_ctor("G17x15y7", this);} // tgen

static void Test_G17x15y7()
{
  extern Class_Descriptor cd_G17x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G17x15y7, buf);
    G17x15y7 *dp, &lv = *(dp=new (buf) G17x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G17x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x15y7)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,16), "G17x15y7");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,24), "G17x15y7");
    check_base_class_offset(lv, (C17*)(E17x15*), ABISELECT(32,16), "G17x15y7");
    check_base_class_offset(lv, (D0*)(E17x15*), ABISELECT(52,32), "G17x15y7");
    check_base_class_offset(lv, (E17x15*), ABISELECT(16,8), "G17x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G17x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G17x15y7.ff");
    test_class_info(&lv, &cd_G17x15y7);
    dp->~G17x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x15y7(Test_G17x15y7, "G17x15y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G17x15y7C1Ev();
extern void _ZN8G17x15y7D1Ev();
Name_Map name_map_G17x15y7[] = {
  NSPAIR(_ZN8G17x15y7C1Ev),
  NSPAIR(_ZN8G17x15y7D1Ev),
  {0,0}
};
extern Class_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_E17x15;
extern VTBL_ENTRY _ZTI6E17x15[];
extern  VTBL_ENTRY _ZTV6E17x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E17x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x15y7[] = {
  // 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
    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
    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_E17x15,    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 _ZTI8G17x15y7[];
extern void _ZN6E17x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv)();
extern void ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn8_N6E17x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G17x15y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G17x15y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G17x15y7[0]),
  (VTBL_ENTRY)&_ZN6E17x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G17x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv),
};
extern VTBL_ENTRY _ZTV8G17x15y7[];
extern void _ZN6E17x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E17x15__8G17x15y7[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E17x15[0]),
  (VTBL_ENTRY)&_ZN6E17x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv)();
extern void ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn8_N6E17x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C17__6E17x15__8G17x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E17x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv),
};
static  VTT_ENTRY vtt_G17x15y7[] = {
  {&(_ZTV8G17x15y7[6]),  6,16},
  {&(_ZTV8G17x15y7[11]),  11,16},
  {&(_ZTV8G17x15y7[15]),  15,16},
  {&(_tg__ZTV6E17x15__8G17x15y7[4]),  4,5},
  {&(_tg__ZTV3C17__6E17x15__8G17x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G17x15y7[];
extern  VTBL_ENTRY _ZTV8G17x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G17x15y7[];
static VTBL_ENTRY alt_thunk_names637[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E17x153fooEv,_ZTv0_n12_N6E17x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn8_N6E17x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E17x153fooEv,_ZThn8_N6E17x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G17x15y7 = {  "G17x15y7", // class name
  bases_G17x15y7, 6,
  &(vtc_G17x15y7[0]), // expected_vtbl_contents
  &(vtt_G17x15y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G17x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G17x15y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G17x15y7),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names637,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E18x15  : virtual C18 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E18x153fooEv
  ~E18x15(); // tgen
  E18x15(); // tgen
};
//SIG(-1 E18x15) C1{ VBC2{ VBC3{ Fi} BC4{ Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E18x15 ::foo(){vfunc_called(this, "_ZN6E18x153fooEv");}
E18x15 ::~E18x15(){ note_dtor("E18x15", this);} // tgen
E18x15 ::E18x15(){ note_ctor("E18x15", this);} // tgen

static void Test_E18x15()
{
  extern Class_Descriptor cd_E18x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E18x15, buf);
    E18x15 *dp, &lv = *(dp=new (buf) E18x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E18x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E18x15)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(32,20), "E18x15");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(24,12), "E18x15");
    check_base_class_offset(lv, (C18*), ABISELECT(16,8), "E18x15");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E18x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E18x15.fd");
    test_class_info(&lv, &cd_E18x15);
    dp->~E18x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE18x15(Test_E18x15, "E18x15", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E18x15C1Ev();
extern void _ZN6E18x15D1Ev();
Name_Map name_map_E18x15[] = {
  NSPAIR(_ZN6E18x15C1Ev),
  NSPAIR(_ZN6E18x15D1Ev),
  {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_E18x15[] = {
  // 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
    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 _ZTI6E18x15[];
extern void _ZN6E18x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv)();
extern void ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn8_N6E18x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E18x15[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x15[0]),
  (VTBL_ENTRY)&_ZN6E18x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E18x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv),
};
extern VTBL_ENTRY _ZTV6E18x15[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__6E18x15[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_E18x15[] = {
  {&(_ZTV6E18x15[5]),  5,11},
  {&(_ZTV6E18x15[10]),  10,11},
  {&(_tg__ZTV3C18__6E18x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E18x15[];
extern  VTBL_ENTRY _ZTV6E18x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x15[];
static VTBL_ENTRY alt_thunk_names638[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn8_N6E18x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E18x15 = {  "E18x15", // class name
  bases_E18x15, 4,
  &(vtc_E18x15[0]), // expected_vtbl_contents
  &(vtt_E18x15[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E18x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E18x15),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E18x15),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names638,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x15y0  : E18x15 , F1 {
  int ff;
  ~G18x15y0(); // tgen
  G18x15y0(); // tgen
};
//SIG(1 G18x15y0) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G18x15y0 ::~G18x15y0(){ note_dtor("G18x15y0", this);} // tgen
G18x15y0 ::G18x15y0(){ note_ctor("G18x15y0", this);} // tgen

static void Test_G18x15y0()
{
  extern Class_Descriptor cd_G18x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G18x15y0, buf);
    G18x15y0 *dp, &lv = *(dp=new (buf) G18x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G18x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x15y0)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,32), "G18x15y0");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,24), "G18x15y0");
    check_base_class_offset(lv, (C18*)(E18x15*), ABISELECT(32,20), "G18x15y0");
    check_base_class_offset(lv, (D0*)(E18x15*), ABISELECT(52,36), "G18x15y0");
    check_base_class_offset(lv, (E18x15*), 0, "G18x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G18x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G18x15y0.ff");
    test_class_info(&lv, &cd_G18x15y0);
    dp->~G18x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x15y0(Test_G18x15y0, "G18x15y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G18x15y0C1Ev();
extern void _ZN8G18x15y0D1Ev();
Name_Map name_map_G18x15y0[] = {
  NSPAIR(_ZN8G18x15y0C1Ev),
  NSPAIR(_ZN8G18x15y0D1Ev),
  {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_E18x15;
extern VTBL_ENTRY _ZTI6E18x15[];
extern  VTBL_ENTRY _ZTV6E18x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x15y0[] = {
  // 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
    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_E18x15,    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
    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 _ZTI8G18x15y0[];
extern void _ZN6E18x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv)();
extern void ABISELECT(_ZThn32_N6E18x153fooEv,_ZThn20_N6E18x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G18x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x15y0[0]),
  (VTBL_ENTRY)&_ZN6E18x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G18x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G18x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv),
};
extern VTBL_ENTRY _ZTV8G18x15y0[];
extern void _ZN6E18x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x15__8G18x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x15[0]),
  (VTBL_ENTRY)&_ZN6E18x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv)();
extern void ABISELECT(_ZThn32_N6E18x153fooEv,_ZThn20_N6E18x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C18__6E18x15__8G18x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E18x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__8G18x15y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x15y0[] = {
  {&(_ZTV8G18x15y0[5]),  5,14},
  {&(_tg__ZTV6E18x15__8G18x15y0[5]),  5,6},
  {&(_tg__ZTV3C18__6E18x15__8G18x15y0[4]),  4,5},
  {&(_ZTV8G18x15y0[13]),  13,14},
  {&(_tg__ZTV3C18__8G18x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x15y0[];
extern  VTBL_ENTRY _ZTV8G18x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x15y0[];
static VTBL_ENTRY alt_thunk_names639[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E18x153fooEv,_ZThn20_N6E18x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E18x153fooEv,_ZThn20_N6E18x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G18x15y0 = {  "G18x15y0", // class name
  bases_G18x15y0, 6,
  &(vtc_G18x15y0[0]), // expected_vtbl_contents
  &(vtt_G18x15y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G18x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x15y0),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x15y0),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names639,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x15y1  : virtual E18x15 , F1 {
  int ff;
  ~G18x15y1(); // tgen
  G18x15y1(); // tgen
};
//SIG(1 G18x15y1) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G18x15y1 ::~G18x15y1(){ note_dtor("G18x15y1", this);} // tgen
G18x15y1 ::G18x15y1(){ note_ctor("G18x15y1", this);} // tgen

static void Test_G18x15y1()
{
  extern Class_Descriptor cd_G18x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G18x15y1, buf);
    G18x15y1 *dp, &lv = *(dp=new (buf) G18x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G18x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x15y1)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,32), "G18x15y1");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,24), "G18x15y1");
    check_base_class_offset(lv, (C18*)(E18x15*), ABISELECT(32,20), "G18x15y1");
    check_base_class_offset(lv, (D0*)(E18x15*), ABISELECT(52,36), "G18x15y1");
    check_base_class_offset(lv, (E18x15*), ABISELECT(16,12), "G18x15y1");
    check_base_class_offset(lv, (F1*), 0, "G18x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x15y1.ff");
    test_class_info(&lv, &cd_G18x15y1);
    dp->~G18x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x15y1(Test_G18x15y1, "G18x15y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G18x15y1C1Ev();
extern void _ZN8G18x15y1D1Ev();
Name_Map name_map_G18x15y1[] = {
  NSPAIR(_ZN8G18x15y1C1Ev),
  NSPAIR(_ZN8G18x15y1D1Ev),
  {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_E18x15;
extern VTBL_ENTRY _ZTI6E18x15[];
extern  VTBL_ENTRY _ZTV6E18x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x15y1[] = {
  // 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
    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_E18x15,    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_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 _ZTI8G18x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E18x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv)();
extern void ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn8_N6E18x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G18x15y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G18x15y1[0]),
  (VTBL_ENTRY)&_ZN6E18x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G18x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv),
};
extern VTBL_ENTRY _ZTV8G18x15y1[];
extern void _ZN6E18x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x15__8G18x15y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x15[0]),
  (VTBL_ENTRY)&_ZN6E18x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv)();
extern void ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn8_N6E18x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C18__6E18x15__8G18x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E18x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__8G18x15y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x15y1[] = {
  {&(_ZTV8G18x15y1[6]),  6,19},
  {&(_ZTV8G18x15y1[13]),  13,19},
  {&(_ZTV8G18x15y1[18]),  18,19},
  {&(_tg__ZTV6E18x15__8G18x15y1[5]),  5,6},
  {&(_tg__ZTV3C18__6E18x15__8G18x15y1[4]),  4,5},
  {&(_tg__ZTV3C18__8G18x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x15y1[];
extern  VTBL_ENTRY _ZTV8G18x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x15y1[];
static VTBL_ENTRY alt_thunk_names640[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn8_N6E18x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn8_N6E18x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G18x15y1 = {  "G18x15y1", // class name
  bases_G18x15y1, 6,
  &(vtc_G18x15y1[0]), // expected_vtbl_contents
  &(vtt_G18x15y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G18x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x15y1),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x15y1),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names640,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x15y2  : E18x15 , virtual F1 {
  int ff;
  ~G18x15y2(); // tgen
  G18x15y2(); // tgen
};
//SIG(1 G18x15y2) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G18x15y2 ::~G18x15y2(){ note_dtor("G18x15y2", this);} // tgen
G18x15y2 ::G18x15y2(){ note_ctor("G18x15y2", this);} // tgen

static void Test_G18x15y2()
{
  extern Class_Descriptor cd_G18x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G18x15y2, buf);
    G18x15y2 *dp, &lv = *(dp=new (buf) G18x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G18x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x15y2)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(32,24), "G18x15y2");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(24,16), "G18x15y2");
    check_base_class_offset(lv, (C18*)(E18x15*), ABISELECT(16,12), "G18x15y2");
    check_base_class_offset(lv, (D0*)(E18x15*), ABISELECT(36,28), "G18x15y2");
    check_base_class_offset(lv, (E18x15*), 0, "G18x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G18x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x15y2.ff");
    test_class_info(&lv, &cd_G18x15y2);
    dp->~G18x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x15y2(Test_G18x15y2, "G18x15y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G18x15y2C1Ev();
extern void _ZN8G18x15y2D1Ev();
Name_Map name_map_G18x15y2[] = {
  NSPAIR(_ZN8G18x15y2C1Ev),
  NSPAIR(_ZN8G18x15y2D1Ev),
  {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_E18x15;
extern VTBL_ENTRY _ZTI6E18x15[];
extern  VTBL_ENTRY _ZTV6E18x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x15y2[] = {
  // 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
    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_E18x15,    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
    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 _ZTI8G18x15y2[];
extern void _ZN6E18x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv)();
extern void ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn12_N6E18x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x15y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x15y2[0]),
  (VTBL_ENTRY)&_ZN6E18x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G18x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G18x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G18x15y2[];
extern void _ZN6E18x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x15__8G18x15y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x15[0]),
  (VTBL_ENTRY)&_ZN6E18x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv)();
extern void ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn12_N6E18x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C18__6E18x15__8G18x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E18x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__8G18x15y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x15y2[] = {
  {&(_ZTV8G18x15y2[6]),  6,16},
  {&(_tg__ZTV6E18x15__8G18x15y2[5]),  5,6},
  {&(_tg__ZTV3C18__6E18x15__8G18x15y2[4]),  4,5},
  {&(_ZTV8G18x15y2[11]),  11,16},
  {&(_ZTV8G18x15y2[15]),  15,16},
  {&(_tg__ZTV3C18__8G18x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x15y2[];
extern  VTBL_ENTRY _ZTV8G18x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x15y2[];
static VTBL_ENTRY alt_thunk_names641[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn12_N6E18x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn12_N6E18x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G18x15y2 = {  "G18x15y2", // class name
  bases_G18x15y2, 6,
  &(vtc_G18x15y2[0]), // expected_vtbl_contents
  &(vtt_G18x15y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G18x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x15y2),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x15y2),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names641,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x15y3  : virtual E18x15 , virtual F1 {
  int ff;
  ~G18x15y3(); // tgen
  G18x15y3(); // tgen
};
//SIG(1 G18x15y3) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G18x15y3 ::~G18x15y3(){ note_dtor("G18x15y3", this);} // tgen
G18x15y3 ::G18x15y3(){ note_ctor("G18x15y3", this);} // tgen

static void Test_G18x15y3()
{
  extern Class_Descriptor cd_G18x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G18x15y3, buf);
    G18x15y3 *dp, &lv = *(dp=new (buf) G18x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G18x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x15y3)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,28), "G18x15y3");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,20), "G18x15y3");
    check_base_class_offset(lv, (C18*)(E18x15*), ABISELECT(32,16), "G18x15y3");
    check_base_class_offset(lv, (D0*)(E18x15*), ABISELECT(52,32), "G18x15y3");
    check_base_class_offset(lv, (E18x15*), ABISELECT(16,8), "G18x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G18x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G18x15y3.ff");
    test_class_info(&lv, &cd_G18x15y3);
    dp->~G18x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x15y3(Test_G18x15y3, "G18x15y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G18x15y3C1Ev();
extern void _ZN8G18x15y3D1Ev();
Name_Map name_map_G18x15y3[] = {
  NSPAIR(_ZN8G18x15y3C1Ev),
  NSPAIR(_ZN8G18x15y3D1Ev),
  {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_E18x15;
extern VTBL_ENTRY _ZTI6E18x15[];
extern  VTBL_ENTRY _ZTV6E18x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x15y3[] = {
  // 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
    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_E18x15,    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
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //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
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI8G18x15y3[];
extern void _ZN6E18x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv)();
extern void ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn8_N6E18x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x15y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x15y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G18x15y3[0]),
  (VTBL_ENTRY)&_ZN6E18x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G18x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G18x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G18x15y3[];
extern void _ZN6E18x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x15__8G18x15y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x15[0]),
  (VTBL_ENTRY)&_ZN6E18x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv)();
extern void ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn8_N6E18x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C18__6E18x15__8G18x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E18x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__8G18x15y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x15y3[] = {
  {&(_ZTV8G18x15y3[7]),  7,23},
  {&(_ZTV8G18x15y3[13]),  13,23},
  {&(_ZTV8G18x15y3[18]),  18,23},
  {&(_ZTV8G18x15y3[22]),  22,23},
  {&(_tg__ZTV6E18x15__8G18x15y3[5]),  5,6},
  {&(_tg__ZTV3C18__6E18x15__8G18x15y3[4]),  4,5},
  {&(_tg__ZTV3C18__8G18x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x15y3[];
extern  VTBL_ENTRY _ZTV8G18x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x15y3[];
static VTBL_ENTRY alt_thunk_names642[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn8_N6E18x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn8_N6E18x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G18x15y3 = {  "G18x15y3", // class name
  bases_G18x15y3, 6,
  &(vtc_G18x15y3[0]), // expected_vtbl_contents
  &(vtt_G18x15y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G18x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x15y3),23, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x15y3),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names642,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x15y4  : E18x15 , F0 {
  int ff;
  ~G18x15y4(); // tgen
  G18x15y4(); // tgen
};
//SIG(1 G18x15y4) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G18x15y4 ::~G18x15y4(){ note_dtor("G18x15y4", this);} // tgen
G18x15y4 ::G18x15y4(){ note_ctor("G18x15y4", this);} // tgen

static void Test_G18x15y4()
{
  extern Class_Descriptor cd_G18x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x15y4, buf);
    G18x15y4 *dp, &lv = *(dp=new (buf) G18x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x15y4)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(40,28), "G18x15y4");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(32,20), "G18x15y4");
    check_base_class_offset(lv, (C18*)(E18x15*), ABISELECT(24,16), "G18x15y4");
    check_base_class_offset(lv, (D0*)(E18x15*), ABISELECT(44,32), "G18x15y4");
    check_base_class_offset(lv, (E18x15*), 0, "G18x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G18x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G18x15y4.ff");
    test_class_info(&lv, &cd_G18x15y4);
    dp->~G18x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x15y4(Test_G18x15y4, "G18x15y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G18x15y4C1Ev();
extern void _ZN8G18x15y4D1Ev();
Name_Map name_map_G18x15y4[] = {
  NSPAIR(_ZN8G18x15y4C1Ev),
  NSPAIR(_ZN8G18x15y4D1Ev),
  {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_E18x15;
extern VTBL_ENTRY _ZTI6E18x15[];
extern  VTBL_ENTRY _ZTV6E18x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x15y4[] = {
  // 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
    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_E18x15,    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 _ZTI8G18x15y4[];
extern void _ZN6E18x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv)();
extern void ABISELECT(_ZThn24_N6E18x153fooEv,_ZThn16_N6E18x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G18x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x15y4[0]),
  (VTBL_ENTRY)&_ZN6E18x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G18x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv),
};
extern VTBL_ENTRY _ZTV8G18x15y4[];
extern void _ZN6E18x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x15__8G18x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x15[0]),
  (VTBL_ENTRY)&_ZN6E18x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv)();
extern void ABISELECT(_ZThn24_N6E18x153fooEv,_ZThn16_N6E18x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C18__6E18x15__8G18x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E18x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__8G18x15y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x15y4[] = {
  {&(_ZTV8G18x15y4[5]),  5,11},
  {&(_tg__ZTV6E18x15__8G18x15y4[5]),  5,6},
  {&(_tg__ZTV3C18__6E18x15__8G18x15y4[4]),  4,5},
  {&(_ZTV8G18x15y4[10]),  10,11},
  {&(_tg__ZTV3C18__8G18x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x15y4[];
extern  VTBL_ENTRY _ZTV8G18x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x15y4[];
static VTBL_ENTRY alt_thunk_names643[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E18x153fooEv,_ZThn16_N6E18x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E18x153fooEv,_ZThn16_N6E18x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G18x15y4 = {  "G18x15y4", // class name
  bases_G18x15y4, 6,
  &(vtc_G18x15y4[0]), // expected_vtbl_contents
  &(vtt_G18x15y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G18x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x15y4),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x15y4),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names643,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x15y5  : virtual E18x15 , F0 {
  int ff;
  ~G18x15y5(); // tgen
  G18x15y5(); // tgen
};
//SIG(1 G18x15y5) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G18x15y5 ::~G18x15y5(){ note_dtor("G18x15y5", this);} // tgen
G18x15y5 ::G18x15y5(){ note_ctor("G18x15y5", this);} // tgen

static void Test_G18x15y5()
{
  extern Class_Descriptor cd_G18x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G18x15y5, buf);
    G18x15y5 *dp, &lv = *(dp=new (buf) G18x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G18x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x15y5)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,32), "G18x15y5");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,24), "G18x15y5");
    check_base_class_offset(lv, (C18*)(E18x15*), ABISELECT(32,20), "G18x15y5");
    check_base_class_offset(lv, (D0*)(E18x15*), ABISELECT(52,36), "G18x15y5");
    check_base_class_offset(lv, (E18x15*), ABISELECT(16,12), "G18x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G18x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x15y5.ff");
    test_class_info(&lv, &cd_G18x15y5);
    dp->~G18x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x15y5(Test_G18x15y5, "G18x15y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G18x15y5C1Ev();
extern void _ZN8G18x15y5D1Ev();
Name_Map name_map_G18x15y5[] = {
  NSPAIR(_ZN8G18x15y5C1Ev),
  NSPAIR(_ZN8G18x15y5D1Ev),
  {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_E18x15;
extern VTBL_ENTRY _ZTI6E18x15[];
extern  VTBL_ENTRY _ZTV6E18x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x15y5[] = {
  // 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
    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_E18x15,    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
    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 _ZTI8G18x15y5[];
extern void _ZN6E18x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv)();
extern void ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn8_N6E18x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G18x15y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x15y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G18x15y5[0]),
  (VTBL_ENTRY)&_ZN6E18x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G18x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv),
};
extern VTBL_ENTRY _ZTV8G18x15y5[];
extern void _ZN6E18x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x15__8G18x15y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x15[0]),
  (VTBL_ENTRY)&_ZN6E18x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv)();
extern void ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn8_N6E18x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C18__6E18x15__8G18x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E18x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__8G18x15y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x15y5[] = {
  {&(_ZTV8G18x15y5[6]),  6,18},
  {&(_ZTV8G18x15y5[12]),  12,18},
  {&(_ZTV8G18x15y5[17]),  17,18},
  {&(_tg__ZTV6E18x15__8G18x15y5[5]),  5,6},
  {&(_tg__ZTV3C18__6E18x15__8G18x15y5[4]),  4,5},
  {&(_tg__ZTV3C18__8G18x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x15y5[];
extern  VTBL_ENTRY _ZTV8G18x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x15y5[];
static VTBL_ENTRY alt_thunk_names644[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn8_N6E18x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn8_N6E18x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G18x15y5 = {  "G18x15y5", // class name
  bases_G18x15y5, 6,
  &(vtc_G18x15y5[0]), // expected_vtbl_contents
  &(vtt_G18x15y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G18x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x15y5),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x15y5),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names644,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x15y6  : E18x15 , virtual F0 {
  int ff;
  ~G18x15y6(); // tgen
  G18x15y6(); // tgen
};
//SIG(1 G18x15y6) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G18x15y6 ::~G18x15y6(){ note_dtor("G18x15y6", this);} // tgen
G18x15y6 ::G18x15y6(){ note_ctor("G18x15y6", this);} // tgen

static void Test_G18x15y6()
{
  extern Class_Descriptor cd_G18x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x15y6, buf);
    G18x15y6 *dp, &lv = *(dp=new (buf) G18x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x15y6)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(32,24), "G18x15y6");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(24,16), "G18x15y6");
    check_base_class_offset(lv, (C18*)(E18x15*), ABISELECT(16,12), "G18x15y6");
    check_base_class_offset(lv, (D0*)(E18x15*), ABISELECT(36,28), "G18x15y6");
    check_base_class_offset(lv, (E18x15*), 0, "G18x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G18x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x15y6.ff");
    test_class_info(&lv, &cd_G18x15y6);
    dp->~G18x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x15y6(Test_G18x15y6, "G18x15y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G18x15y6C1Ev();
extern void _ZN8G18x15y6D1Ev();
Name_Map name_map_G18x15y6[] = {
  NSPAIR(_ZN8G18x15y6C1Ev),
  NSPAIR(_ZN8G18x15y6D1Ev),
  {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_E18x15;
extern VTBL_ENTRY _ZTI6E18x15[];
extern  VTBL_ENTRY _ZTV6E18x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x15y6[] = {
  // 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
    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_E18x15,    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 _ZTI8G18x15y6[];
extern void _ZN6E18x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv)();
extern void ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn12_N6E18x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G18x15y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x15y6[0]),
  (VTBL_ENTRY)&_ZN6E18x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G18x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv),
};
extern VTBL_ENTRY _ZTV8G18x15y6[];
extern void _ZN6E18x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x15__8G18x15y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x15[0]),
  (VTBL_ENTRY)&_ZN6E18x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv)();
extern void ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn12_N6E18x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C18__6E18x15__8G18x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E18x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__8G18x15y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x15y6[] = {
  {&(_ZTV8G18x15y6[6]),  6,12},
  {&(_tg__ZTV6E18x15__8G18x15y6[5]),  5,6},
  {&(_tg__ZTV3C18__6E18x15__8G18x15y6[4]),  4,5},
  {&(_ZTV8G18x15y6[11]),  11,12},
  {&(_tg__ZTV3C18__8G18x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x15y6[];
extern  VTBL_ENTRY _ZTV8G18x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x15y6[];
static VTBL_ENTRY alt_thunk_names645[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn12_N6E18x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn12_N6E18x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G18x15y6 = {  "G18x15y6", // class name
  bases_G18x15y6, 6,
  &(vtc_G18x15y6[0]), // expected_vtbl_contents
  &(vtt_G18x15y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G18x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x15y6),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x15y6),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names645,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x15y7  : virtual E18x15 , virtual F0 {
  int ff;
  ~G18x15y7(); // tgen
  G18x15y7(); // tgen
};
//SIG(1 G18x15y7) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G18x15y7 ::~G18x15y7(){ note_dtor("G18x15y7", this);} // tgen
G18x15y7 ::G18x15y7(){ note_ctor("G18x15y7", this);} // tgen

static void Test_G18x15y7()
{
  extern Class_Descriptor cd_G18x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G18x15y7, buf);
    G18x15y7 *dp, &lv = *(dp=new (buf) G18x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G18x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x15y7)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,28), "G18x15y7");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,20), "G18x15y7");
    check_base_class_offset(lv, (C18*)(E18x15*), ABISELECT(32,16), "G18x15y7");
    check_base_class_offset(lv, (D0*)(E18x15*), ABISELECT(52,32), "G18x15y7");
    check_base_class_offset(lv, (E18x15*), ABISELECT(16,8), "G18x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G18x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G18x15y7.ff");
    test_class_info(&lv, &cd_G18x15y7);
    dp->~G18x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x15y7(Test_G18x15y7, "G18x15y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G18x15y7C1Ev();
extern void _ZN8G18x15y7D1Ev();
Name_Map name_map_G18x15y7[] = {
  NSPAIR(_ZN8G18x15y7C1Ev),
  NSPAIR(_ZN8G18x15y7D1Ev),
  {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_E18x15;
extern VTBL_ENTRY _ZTI6E18x15[];
extern  VTBL_ENTRY _ZTV6E18x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E18x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x15y7[] = {
  // 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
    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_E18x15,    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_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 _ZTI8G18x15y7[];
extern void _ZN6E18x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv)();
extern void ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn8_N6E18x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G18x15y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G18x15y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G18x15y7[0]),
  (VTBL_ENTRY)&_ZN6E18x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G18x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv),
};
extern VTBL_ENTRY _ZTV8G18x15y7[];
extern void _ZN6E18x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E18x15__8G18x15y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E18x15[0]),
  (VTBL_ENTRY)&_ZN6E18x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv)();
extern void ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn8_N6E18x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C18__6E18x15__8G18x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E18x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__8G18x15y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x15y7[] = {
  {&(_ZTV8G18x15y7[7]),  7,19},
  {&(_ZTV8G18x15y7[13]),  13,19},
  {&(_ZTV8G18x15y7[18]),  18,19},
  {&(_tg__ZTV6E18x15__8G18x15y7[5]),  5,6},
  {&(_tg__ZTV3C18__6E18x15__8G18x15y7[4]),  4,5},
  {&(_tg__ZTV3C18__8G18x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G18x15y7[];
extern  VTBL_ENTRY _ZTV8G18x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G18x15y7[];
static VTBL_ENTRY alt_thunk_names646[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E18x153fooEv,_ZTv0_n16_N6E18x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn8_N6E18x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E18x153fooEv,_ZThn8_N6E18x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G18x15y7 = {  "G18x15y7", // class name
  bases_G18x15y7, 6,
  &(vtc_G18x15y7[0]), // expected_vtbl_contents
  &(vtt_G18x15y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G18x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G18x15y7),19, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G18x15y7),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names646,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E19x15  : virtual C19 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E19x153fooEv
  ~E19x15(); // tgen
  E19x15(); // tgen
};
//SIG(-1 E19x15) C1{ VBC2{ VBC3{ v1 Fi} BC4{ Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E19x15 ::foo(){vfunc_called(this, "_ZN6E19x153fooEv");}
E19x15 ::~E19x15(){ note_dtor("E19x15", this);} // tgen
E19x15 ::E19x15(){ note_ctor("E19x15", this);} // tgen

static void Test_E19x15()
{
  extern Class_Descriptor cd_E19x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E19x15, buf);
    E19x15 *dp, &lv = *(dp=new (buf) E19x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E19x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E19x15)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(32,20), "E19x15");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(24,12), "E19x15");
    check_base_class_offset(lv, (C19*), ABISELECT(16,8), "E19x15");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E19x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E19x15.fd");
    test_class_info(&lv, &cd_E19x15);
    dp->~E19x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE19x15(Test_E19x15, "E19x15", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E19x15C1Ev();
extern void _ZN6E19x15D1Ev();
Name_Map name_map_E19x15[] = {
  NSPAIR(_ZN6E19x15C1Ev),
  NSPAIR(_ZN6E19x15D1Ev),
  {0,0}
};
extern Class_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_E19x15[] = {
  // 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(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
    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 _ZTI6E19x15[];
extern void _ZN6E19x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv)();
extern void ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn8_N6E19x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv)();
extern void ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E19x15[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&_ZN6E19x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv),
};
extern VTBL_ENTRY _ZTV6E19x15[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__6E19x15[] = {
  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__6E19x15[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_E19x15[] = {
  {&(_ZTV6E19x15[5]),  5,15},
  {&(_ZTV6E19x15[10]),  10,15},
  {&(_ZTV6E19x15[14]),  14,15},
  {&(_tg__ZTV3C19__6E19x15[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__6E19x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E19x15[];
extern  VTBL_ENTRY _ZTV6E19x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x15[];
static VTBL_ENTRY alt_thunk_names647[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn8_N6E19x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E19x15 = {  "E19x15", // class name
  bases_E19x15, 4,
  &(vtc_E19x15[0]), // expected_vtbl_contents
  &(vtt_E19x15[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E19x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E19x15),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E19x15),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names647,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x15y0  : E19x15 , F1 {
  int ff;
  ~G19x15y0(); // tgen
  G19x15y0(); // tgen
};
//SIG(1 G19x15y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G19x15y0 ::~G19x15y0(){ note_dtor("G19x15y0", this);} // tgen
G19x15y0 ::G19x15y0(){ note_ctor("G19x15y0", this);} // tgen

static void Test_G19x15y0()
{
  extern Class_Descriptor cd_G19x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G19x15y0, buf);
    G19x15y0 *dp, &lv = *(dp=new (buf) G19x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G19x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x15y0)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,32), "G19x15y0");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,24), "G19x15y0");
    check_base_class_offset(lv, (C19*)(E19x15*), ABISELECT(32,20), "G19x15y0");
    check_base_class_offset(lv, (D0*)(E19x15*), ABISELECT(60,40), "G19x15y0");
    check_base_class_offset(lv, (E19x15*), 0, "G19x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G19x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G19x15y0.ff");
    test_class_info(&lv, &cd_G19x15y0);
    dp->~G19x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x15y0(Test_G19x15y0, "G19x15y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G19x15y0C1Ev();
extern void _ZN8G19x15y0D1Ev();
Name_Map name_map_G19x15y0[] = {
  NSPAIR(_ZN8G19x15y0C1Ev),
  NSPAIR(_ZN8G19x15y0D1Ev),
  {0,0}
};
extern Class_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_E19x15;
extern VTBL_ENTRY _ZTI6E19x15[];
extern  VTBL_ENTRY _ZTV6E19x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x15y0[] = {
  // 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(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
    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_E19x15,    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
    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 _ZTI8G19x15y0[];
extern void _ZN6E19x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv)();
extern void ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv)();
extern void ABISELECT(_ZThn48_N6E19x153fooEv,_ZThn32_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x15y0[0]),
  (VTBL_ENTRY)&_ZN6E19x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G19x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G19x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G19x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv),
};
extern VTBL_ENTRY _ZTV8G19x15y0[];
extern void _ZN6E19x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x15__8G19x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&_ZN6E19x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv)();
extern void ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C19__6E19x15__8G19x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv)();
extern void ABISELECT(_ZThn48_N6E19x153fooEv,_ZThn32_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x15__8G19x15y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__8G19x15y0[] = {
  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__8G19x15y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x15y0[] = {
  {&(_ZTV8G19x15y0[5]),  5,18},
  {&(_tg__ZTV6E19x15__8G19x15y0[5]),  5,6},
  {&(_tg__ZTV3C19__6E19x15__8G19x15y0[4]),  4,5},
  {&(_tg__ZTV2A1__6E19x15__8G19x15y0[3]),  3,4},
  {&(_ZTV8G19x15y0[13]),  13,18},
  {&(_ZTV8G19x15y0[17]),  17,18},
  {&(_tg__ZTV3C19__8G19x15y0[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__8G19x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x15y0[];
extern  VTBL_ENTRY _ZTV8G19x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x15y0[];
static VTBL_ENTRY alt_thunk_names648[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E19x153fooEv,_ZThn32_N6E19x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E19x153fooEv,_ZThn32_N6E19x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x15y0 = {  "G19x15y0", // class name
  bases_G19x15y0, 6,
  &(vtc_G19x15y0[0]), // expected_vtbl_contents
  &(vtt_G19x15y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G19x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x15y0),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x15y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names648,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x15y1  : virtual E19x15 , F1 {
  int ff;
  ~G19x15y1(); // tgen
  G19x15y1(); // tgen
};
//SIG(1 G19x15y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G19x15y1 ::~G19x15y1(){ note_dtor("G19x15y1", this);} // tgen
G19x15y1 ::G19x15y1(){ note_ctor("G19x15y1", this);} // tgen

static void Test_G19x15y1()
{
  extern Class_Descriptor cd_G19x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G19x15y1, buf);
    G19x15y1 *dp, &lv = *(dp=new (buf) G19x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G19x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x15y1)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,32), "G19x15y1");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,24), "G19x15y1");
    check_base_class_offset(lv, (C19*)(E19x15*), ABISELECT(32,20), "G19x15y1");
    check_base_class_offset(lv, (D0*)(E19x15*), ABISELECT(60,40), "G19x15y1");
    check_base_class_offset(lv, (E19x15*), ABISELECT(16,12), "G19x15y1");
    check_base_class_offset(lv, (F1*), 0, "G19x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x15y1.ff");
    test_class_info(&lv, &cd_G19x15y1);
    dp->~G19x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x15y1(Test_G19x15y1, "G19x15y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G19x15y1C1Ev();
extern void _ZN8G19x15y1D1Ev();
Name_Map name_map_G19x15y1[] = {
  NSPAIR(_ZN8G19x15y1C1Ev),
  NSPAIR(_ZN8G19x15y1D1Ev),
  {0,0}
};
extern Class_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_E19x15;
extern VTBL_ENTRY _ZTI6E19x15[];
extern  VTBL_ENTRY _ZTV6E19x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x15y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    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_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
    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_E19x15,    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_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 _ZTI8G19x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E19x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv)();
extern void ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn8_N6E19x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv)();
extern void ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x15y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G19x15y1[0]),
  (VTBL_ENTRY)&_ZN6E19x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G19x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G19x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv),
};
extern VTBL_ENTRY _ZTV8G19x15y1[];
extern void _ZN6E19x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x15__8G19x15y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&_ZN6E19x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv)();
extern void ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn8_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C19__6E19x15__8G19x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv)();
extern void ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x15__8G19x15y1[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__8G19x15y1[] = {
  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__8G19x15y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x15y1[] = {
  {&(_ZTV8G19x15y1[6]),  6,23},
  {&(_ZTV8G19x15y1[13]),  13,23},
  {&(_ZTV8G19x15y1[18]),  18,23},
  {&(_ZTV8G19x15y1[22]),  22,23},
  {&(_tg__ZTV6E19x15__8G19x15y1[5]),  5,6},
  {&(_tg__ZTV3C19__6E19x15__8G19x15y1[4]),  4,5},
  {&(_tg__ZTV2A1__6E19x15__8G19x15y1[3]),  3,4},
  {&(_tg__ZTV3C19__8G19x15y1[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__8G19x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x15y1[];
extern  VTBL_ENTRY _ZTV8G19x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x15y1[];
static VTBL_ENTRY alt_thunk_names649[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn8_N6E19x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn8_N6E19x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x15y1 = {  "G19x15y1", // class name
  bases_G19x15y1, 6,
  &(vtc_G19x15y1[0]), // expected_vtbl_contents
  &(vtt_G19x15y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G19x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x15y1),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x15y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names649,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x15y2  : E19x15 , virtual F1 {
  int ff;
  ~G19x15y2(); // tgen
  G19x15y2(); // tgen
};
//SIG(1 G19x15y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G19x15y2 ::~G19x15y2(){ note_dtor("G19x15y2", this);} // tgen
G19x15y2 ::G19x15y2(){ note_ctor("G19x15y2", this);} // tgen

static void Test_G19x15y2()
{
  extern Class_Descriptor cd_G19x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G19x15y2, buf);
    G19x15y2 *dp, &lv = *(dp=new (buf) G19x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G19x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x15y2)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(32,24), "G19x15y2");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(24,16), "G19x15y2");
    check_base_class_offset(lv, (C19*)(E19x15*), ABISELECT(16,12), "G19x15y2");
    check_base_class_offset(lv, (D0*)(E19x15*), ABISELECT(44,32), "G19x15y2");
    check_base_class_offset(lv, (E19x15*), 0, "G19x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G19x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x15y2.ff");
    test_class_info(&lv, &cd_G19x15y2);
    dp->~G19x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x15y2(Test_G19x15y2, "G19x15y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G19x15y2C1Ev();
extern void _ZN8G19x15y2D1Ev();
Name_Map name_map_G19x15y2[] = {
  NSPAIR(_ZN8G19x15y2C1Ev),
  NSPAIR(_ZN8G19x15y2D1Ev),
  {0,0}
};
extern Class_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_E19x15;
extern VTBL_ENTRY _ZTI6E19x15[];
extern  VTBL_ENTRY _ZTV6E19x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x15y2[] = {
  // 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)
    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
    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_E19x15,    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
    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 _ZTI8G19x15y2[];
extern void _ZN6E19x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv)();
extern void ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn12_N6E19x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv)();
extern void ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn24_N6E19x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G19x15y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x15y2[0]),
  (VTBL_ENTRY)&_ZN6E19x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G19x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G19x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G19x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G19x15y2[];
extern void _ZN6E19x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x15__8G19x15y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&_ZN6E19x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv)();
extern void ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn12_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C19__6E19x15__8G19x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv)();
extern void ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn24_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x15__8G19x15y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__8G19x15y2[] = {
  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__8G19x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x15y2[] = {
  {&(_ZTV8G19x15y2[6]),  6,20},
  {&(_tg__ZTV6E19x15__8G19x15y2[5]),  5,6},
  {&(_tg__ZTV3C19__6E19x15__8G19x15y2[4]),  4,5},
  {&(_tg__ZTV2A1__6E19x15__8G19x15y2[3]),  3,4},
  {&(_ZTV8G19x15y2[11]),  11,20},
  {&(_ZTV8G19x15y2[15]),  15,20},
  {&(_ZTV8G19x15y2[19]),  19,20},
  {&(_tg__ZTV3C19__8G19x15y2[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__8G19x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x15y2[];
extern  VTBL_ENTRY _ZTV8G19x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x15y2[];
static VTBL_ENTRY alt_thunk_names650[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn24_N6E19x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn24_N6E19x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn12_N6E19x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn12_N6E19x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x15y2 = {  "G19x15y2", // class name
  bases_G19x15y2, 6,
  &(vtc_G19x15y2[0]), // expected_vtbl_contents
  &(vtt_G19x15y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G19x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x15y2),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x15y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names650,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x15y3  : virtual E19x15 , virtual F1 {
  int ff;
  ~G19x15y3(); // tgen
  G19x15y3(); // tgen
};
//SIG(1 G19x15y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G19x15y3 ::~G19x15y3(){ note_dtor("G19x15y3", this);} // tgen
G19x15y3 ::G19x15y3(){ note_ctor("G19x15y3", this);} // tgen

static void Test_G19x15y3()
{
  extern Class_Descriptor cd_G19x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G19x15y3, buf);
    G19x15y3 *dp, &lv = *(dp=new (buf) G19x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G19x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x15y3)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,28), "G19x15y3");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,20), "G19x15y3");
    check_base_class_offset(lv, (C19*)(E19x15*), ABISELECT(32,16), "G19x15y3");
    check_base_class_offset(lv, (D0*)(E19x15*), ABISELECT(60,36), "G19x15y3");
    check_base_class_offset(lv, (E19x15*), ABISELECT(16,8), "G19x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G19x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G19x15y3.ff");
    test_class_info(&lv, &cd_G19x15y3);
    dp->~G19x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x15y3(Test_G19x15y3, "G19x15y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G19x15y3C1Ev();
extern void _ZN8G19x15y3D1Ev();
Name_Map name_map_G19x15y3[] = {
  NSPAIR(_ZN8G19x15y3C1Ev),
  NSPAIR(_ZN8G19x15y3D1Ev),
  {0,0}
};
extern Class_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_E19x15;
extern VTBL_ENTRY _ZTI6E19x15[];
extern  VTBL_ENTRY _ZTV6E19x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x15y3[] = {
  // 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(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
    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_E19x15,    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
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI8G19x15y3[];
extern void _ZN6E19x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv)();
extern void ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn8_N6E19x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv)();
extern void ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G19x15y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x15y3[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G19x15y3[0]),
  (VTBL_ENTRY)&_ZN6E19x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G19x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G19x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G19x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G19x15y3[];
extern void _ZN6E19x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x15__8G19x15y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&_ZN6E19x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv)();
extern void ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn8_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C19__6E19x15__8G19x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv)();
extern void ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x15__8G19x15y3[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__8G19x15y3[] = {
  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__8G19x15y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x15y3[] = {
  {&(_ZTV8G19x15y3[7]),  7,27},
  {&(_ZTV8G19x15y3[13]),  13,27},
  {&(_ZTV8G19x15y3[18]),  18,27},
  {&(_ZTV8G19x15y3[22]),  22,27},
  {&(_ZTV8G19x15y3[26]),  26,27},
  {&(_tg__ZTV6E19x15__8G19x15y3[5]),  5,6},
  {&(_tg__ZTV3C19__6E19x15__8G19x15y3[4]),  4,5},
  {&(_tg__ZTV2A1__6E19x15__8G19x15y3[3]),  3,4},
  {&(_tg__ZTV3C19__8G19x15y3[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__8G19x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x15y3[];
extern  VTBL_ENTRY _ZTV8G19x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x15y3[];
static VTBL_ENTRY alt_thunk_names651[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn8_N6E19x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn8_N6E19x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x15y3 = {  "G19x15y3", // class name
  bases_G19x15y3, 6,
  &(vtc_G19x15y3[0]), // expected_vtbl_contents
  &(vtt_G19x15y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G19x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x15y3),27, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x15y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names651,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x15y4  : E19x15 , F0 {
  int ff;
  ~G19x15y4(); // tgen
  G19x15y4(); // tgen
};
//SIG(1 G19x15y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G19x15y4 ::~G19x15y4(){ note_dtor("G19x15y4", this);} // tgen
G19x15y4 ::G19x15y4(){ note_ctor("G19x15y4", this);} // tgen

static void Test_G19x15y4()
{
  extern Class_Descriptor cd_G19x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x15y4, buf);
    G19x15y4 *dp, &lv = *(dp=new (buf) G19x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x15y4)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(40,28), "G19x15y4");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(32,20), "G19x15y4");
    check_base_class_offset(lv, (C19*)(E19x15*), ABISELECT(24,16), "G19x15y4");
    check_base_class_offset(lv, (D0*)(E19x15*), ABISELECT(52,36), "G19x15y4");
    check_base_class_offset(lv, (E19x15*), 0, "G19x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G19x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G19x15y4.ff");
    test_class_info(&lv, &cd_G19x15y4);
    dp->~G19x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x15y4(Test_G19x15y4, "G19x15y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G19x15y4C1Ev();
extern void _ZN8G19x15y4D1Ev();
Name_Map name_map_G19x15y4[] = {
  NSPAIR(_ZN8G19x15y4C1Ev),
  NSPAIR(_ZN8G19x15y4D1Ev),
  {0,0}
};
extern Class_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_E19x15;
extern VTBL_ENTRY _ZTI6E19x15[];
extern  VTBL_ENTRY _ZTV6E19x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x15y4[] = {
  // 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(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
    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_E19x15,    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 _ZTI8G19x15y4[];
extern void _ZN6E19x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv)();
extern void ABISELECT(_ZThn24_N6E19x153fooEv,_ZThn16_N6E19x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv)();
extern void ABISELECT(_ZThn40_N6E19x153fooEv,_ZThn28_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x15y4[0]),
  (VTBL_ENTRY)&_ZN6E19x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G19x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G19x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv),
};
extern VTBL_ENTRY _ZTV8G19x15y4[];
extern void _ZN6E19x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x15__8G19x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&_ZN6E19x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv)();
extern void ABISELECT(_ZThn24_N6E19x153fooEv,_ZThn16_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C19__6E19x15__8G19x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv)();
extern void ABISELECT(_ZThn40_N6E19x153fooEv,_ZThn28_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x15__8G19x15y4[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__8G19x15y4[] = {
  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__8G19x15y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x15y4[] = {
  {&(_ZTV8G19x15y4[5]),  5,15},
  {&(_tg__ZTV6E19x15__8G19x15y4[5]),  5,6},
  {&(_tg__ZTV3C19__6E19x15__8G19x15y4[4]),  4,5},
  {&(_tg__ZTV2A1__6E19x15__8G19x15y4[3]),  3,4},
  {&(_ZTV8G19x15y4[10]),  10,15},
  {&(_ZTV8G19x15y4[14]),  14,15},
  {&(_tg__ZTV3C19__8G19x15y4[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__8G19x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x15y4[];
extern  VTBL_ENTRY _ZTV8G19x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x15y4[];
static VTBL_ENTRY alt_thunk_names652[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E19x153fooEv,_ZThn28_N6E19x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E19x153fooEv,_ZThn28_N6E19x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x153fooEv,_ZThn16_N6E19x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E19x153fooEv,_ZThn16_N6E19x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x15y4 = {  "G19x15y4", // class name
  bases_G19x15y4, 6,
  &(vtc_G19x15y4[0]), // expected_vtbl_contents
  &(vtt_G19x15y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G19x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x15y4),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x15y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names652,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x15y5  : virtual E19x15 , F0 {
  int ff;
  ~G19x15y5(); // tgen
  G19x15y5(); // tgen
};
//SIG(1 G19x15y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G19x15y5 ::~G19x15y5(){ note_dtor("G19x15y5", this);} // tgen
G19x15y5 ::G19x15y5(){ note_ctor("G19x15y5", this);} // tgen

static void Test_G19x15y5()
{
  extern Class_Descriptor cd_G19x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G19x15y5, buf);
    G19x15y5 *dp, &lv = *(dp=new (buf) G19x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G19x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x15y5)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,32), "G19x15y5");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,24), "G19x15y5");
    check_base_class_offset(lv, (C19*)(E19x15*), ABISELECT(32,20), "G19x15y5");
    check_base_class_offset(lv, (D0*)(E19x15*), ABISELECT(60,40), "G19x15y5");
    check_base_class_offset(lv, (E19x15*), ABISELECT(16,12), "G19x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G19x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x15y5.ff");
    test_class_info(&lv, &cd_G19x15y5);
    dp->~G19x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x15y5(Test_G19x15y5, "G19x15y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G19x15y5C1Ev();
extern void _ZN8G19x15y5D1Ev();
Name_Map name_map_G19x15y5[] = {
  NSPAIR(_ZN8G19x15y5C1Ev),
  NSPAIR(_ZN8G19x15y5D1Ev),
  {0,0}
};
extern Class_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_E19x15;
extern VTBL_ENTRY _ZTI6E19x15[];
extern  VTBL_ENTRY _ZTV6E19x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x15y5[] = {
  // 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(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
    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_E19x15,    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
    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 _ZTI8G19x15y5[];
extern void _ZN6E19x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv)();
extern void ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn8_N6E19x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv)();
extern void ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x15y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x15y5[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G19x15y5[0]),
  (VTBL_ENTRY)&_ZN6E19x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G19x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G19x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv),
};
extern VTBL_ENTRY _ZTV8G19x15y5[];
extern void _ZN6E19x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x15__8G19x15y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&_ZN6E19x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv)();
extern void ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn8_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C19__6E19x15__8G19x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv)();
extern void ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x15__8G19x15y5[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__8G19x15y5[] = {
  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__8G19x15y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x15y5[] = {
  {&(_ZTV8G19x15y5[6]),  6,22},
  {&(_ZTV8G19x15y5[12]),  12,22},
  {&(_ZTV8G19x15y5[17]),  17,22},
  {&(_ZTV8G19x15y5[21]),  21,22},
  {&(_tg__ZTV6E19x15__8G19x15y5[5]),  5,6},
  {&(_tg__ZTV3C19__6E19x15__8G19x15y5[4]),  4,5},
  {&(_tg__ZTV2A1__6E19x15__8G19x15y5[3]),  3,4},
  {&(_tg__ZTV3C19__8G19x15y5[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__8G19x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x15y5[];
extern  VTBL_ENTRY _ZTV8G19x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x15y5[];
static VTBL_ENTRY alt_thunk_names653[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn8_N6E19x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn8_N6E19x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x15y5 = {  "G19x15y5", // class name
  bases_G19x15y5, 6,
  &(vtc_G19x15y5[0]), // expected_vtbl_contents
  &(vtt_G19x15y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G19x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x15y5),22, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x15y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names653,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x15y6  : E19x15 , virtual F0 {
  int ff;
  ~G19x15y6(); // tgen
  G19x15y6(); // tgen
};
//SIG(1 G19x15y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G19x15y6 ::~G19x15y6(){ note_dtor("G19x15y6", this);} // tgen
G19x15y6 ::G19x15y6(){ note_ctor("G19x15y6", this);} // tgen

static void Test_G19x15y6()
{
  extern Class_Descriptor cd_G19x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x15y6, buf);
    G19x15y6 *dp, &lv = *(dp=new (buf) G19x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x15y6)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(32,24), "G19x15y6");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(24,16), "G19x15y6");
    check_base_class_offset(lv, (C19*)(E19x15*), ABISELECT(16,12), "G19x15y6");
    check_base_class_offset(lv, (D0*)(E19x15*), ABISELECT(44,32), "G19x15y6");
    check_base_class_offset(lv, (E19x15*), 0, "G19x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G19x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x15y6.ff");
    test_class_info(&lv, &cd_G19x15y6);
    dp->~G19x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x15y6(Test_G19x15y6, "G19x15y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G19x15y6C1Ev();
extern void _ZN8G19x15y6D1Ev();
Name_Map name_map_G19x15y6[] = {
  NSPAIR(_ZN8G19x15y6C1Ev),
  NSPAIR(_ZN8G19x15y6D1Ev),
  {0,0}
};
extern Class_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_E19x15;
extern VTBL_ENTRY _ZTI6E19x15[];
extern  VTBL_ENTRY _ZTV6E19x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x15y6[] = {
  // 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)
    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
    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_E19x15,    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 _ZTI8G19x15y6[];
extern void _ZN6E19x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv)();
extern void ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn12_N6E19x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv)();
extern void ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn24_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x15y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x15y6[0]),
  (VTBL_ENTRY)&_ZN6E19x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G19x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G19x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv),
};
extern VTBL_ENTRY _ZTV8G19x15y6[];
extern void _ZN6E19x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x15__8G19x15y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&_ZN6E19x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv)();
extern void ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn12_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C19__6E19x15__8G19x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv)();
extern void ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn24_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x15__8G19x15y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__8G19x15y6[] = {
  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__8G19x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x15y6[] = {
  {&(_ZTV8G19x15y6[6]),  6,16},
  {&(_tg__ZTV6E19x15__8G19x15y6[5]),  5,6},
  {&(_tg__ZTV3C19__6E19x15__8G19x15y6[4]),  4,5},
  {&(_tg__ZTV2A1__6E19x15__8G19x15y6[3]),  3,4},
  {&(_ZTV8G19x15y6[11]),  11,16},
  {&(_ZTV8G19x15y6[15]),  15,16},
  {&(_tg__ZTV3C19__8G19x15y6[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__8G19x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x15y6[];
extern  VTBL_ENTRY _ZTV8G19x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x15y6[];
static VTBL_ENTRY alt_thunk_names654[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn24_N6E19x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn24_N6E19x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn12_N6E19x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn12_N6E19x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x15y6 = {  "G19x15y6", // class name
  bases_G19x15y6, 6,
  &(vtc_G19x15y6[0]), // expected_vtbl_contents
  &(vtt_G19x15y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G19x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x15y6),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x15y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names654,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x15y7  : virtual E19x15 , virtual F0 {
  int ff;
  ~G19x15y7(); // tgen
  G19x15y7(); // tgen
};
//SIG(1 G19x15y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G19x15y7 ::~G19x15y7(){ note_dtor("G19x15y7", this);} // tgen
G19x15y7 ::G19x15y7(){ note_ctor("G19x15y7", this);} // tgen

static void Test_G19x15y7()
{
  extern Class_Descriptor cd_G19x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G19x15y7, buf);
    G19x15y7 *dp, &lv = *(dp=new (buf) G19x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G19x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x15y7)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,28), "G19x15y7");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,20), "G19x15y7");
    check_base_class_offset(lv, (C19*)(E19x15*), ABISELECT(32,16), "G19x15y7");
    check_base_class_offset(lv, (D0*)(E19x15*), ABISELECT(60,36), "G19x15y7");
    check_base_class_offset(lv, (E19x15*), ABISELECT(16,8), "G19x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G19x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G19x15y7.ff");
    test_class_info(&lv, &cd_G19x15y7);
    dp->~G19x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x15y7(Test_G19x15y7, "G19x15y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G19x15y7C1Ev();
extern void _ZN8G19x15y7D1Ev();
Name_Map name_map_G19x15y7[] = {
  NSPAIR(_ZN8G19x15y7C1Ev),
  NSPAIR(_ZN8G19x15y7D1Ev),
  {0,0}
};
extern Class_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_E19x15;
extern VTBL_ENTRY _ZTI6E19x15[];
extern  VTBL_ENTRY _ZTV6E19x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E19x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x15y7[] = {
  // 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(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
    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_E19x15,    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_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 _ZTI8G19x15y7[];
extern void _ZN6E19x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv)();
extern void ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn8_N6E19x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv)();
extern void ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x15y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G19x15y7[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G19x15y7[0]),
  (VTBL_ENTRY)&_ZN6E19x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G19x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G19x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv),
};
extern VTBL_ENTRY _ZTV8G19x15y7[];
extern void _ZN6E19x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E19x15__8G19x15y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&_ZN6E19x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv)();
extern void ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn8_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C19__6E19x15__8G19x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv)();
extern void ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E19x15__8G19x15y7[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E19x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__8G19x15y7[] = {
  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__8G19x15y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x15y7[] = {
  {&(_ZTV8G19x15y7[7]),  7,23},
  {&(_ZTV8G19x15y7[13]),  13,23},
  {&(_ZTV8G19x15y7[18]),  18,23},
  {&(_ZTV8G19x15y7[22]),  22,23},
  {&(_tg__ZTV6E19x15__8G19x15y7[5]),  5,6},
  {&(_tg__ZTV3C19__6E19x15__8G19x15y7[4]),  4,5},
  {&(_tg__ZTV2A1__6E19x15__8G19x15y7[3]),  3,4},
  {&(_tg__ZTV3C19__8G19x15y7[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__8G19x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G19x15y7[];
extern  VTBL_ENTRY _ZTV8G19x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G19x15y7[];
static VTBL_ENTRY alt_thunk_names655[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E19x153fooEv,_ZTv0_n12_N6E19x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E19x153fooEv,_ZThn20_N6E19x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E19x153fooEv,_ZTv0_n16_N6E19x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn8_N6E19x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E19x153fooEv,_ZThn8_N6E19x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x15y7 = {  "G19x15y7", // class name
  bases_G19x15y7, 6,
  &(vtc_G19x15y7[0]), // expected_vtbl_contents
  &(vtt_G19x15y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G19x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G19x15y7),23, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G19x15y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names655,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E20x15  : virtual C20 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E20x153fooEv
  ~E20x15(); // tgen
  E20x15(); // tgen
};
//SIG(-1 E20x15) C1{ VBC2{ BC3{ Fi} BC4{ v1 Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E20x15 ::foo(){vfunc_called(this, "_ZN6E20x153fooEv");}
E20x15 ::~E20x15(){ note_dtor("E20x15", this);} // tgen
E20x15 ::E20x15(){ note_ctor("E20x15", this);} // tgen

static void Test_E20x15()
{
  extern Class_Descriptor cd_E20x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E20x15, buf);
    E20x15 *dp, &lv = *(dp=new (buf) E20x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E20x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E20x15)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(28,16), "E20x15");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(16,8), "E20x15");
    check_base_class_offset(lv, (C20*), ABISELECT(16,8), "E20x15");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E20x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E20x15.fd");
    test_class_info(&lv, &cd_E20x15);
    dp->~E20x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE20x15(Test_E20x15, "E20x15", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E20x15C1Ev();
extern void _ZN6E20x15D1Ev();
Name_Map name_map_E20x15[] = {
  NSPAIR(_ZN6E20x15C1Ev),
  NSPAIR(_ZN6E20x15D1Ev),
  {0,0}
};
extern Class_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_E20x15[] = {
  // 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
    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
    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 _ZTI6E20x15[];
extern void _ZN6E20x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv)();
extern void ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn8_N6E20x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E20x15[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x15[0]),
  (VTBL_ENTRY)&_ZN6E20x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E20x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv),
};
extern VTBL_ENTRY _ZTV6E20x15[];
static  VTT_ENTRY vtt_E20x15[] = {
  {&(_ZTV6E20x15[4]),  4,9},
  {&(_ZTV6E20x15[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6E20x15[];
extern  VTBL_ENTRY _ZTV6E20x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x15[];
static VTBL_ENTRY alt_thunk_names656[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn8_N6E20x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E20x15 = {  "E20x15", // class name
  bases_E20x15, 4,
  &(vtc_E20x15[0]), // expected_vtbl_contents
  &(vtt_E20x15[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E20x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E20x15),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E20x15),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names656,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x15y0  : E20x15 , F1 {
  int ff;
  ~G20x15y0(); // tgen
  G20x15y0(); // tgen
};
//SIG(1 G20x15y0) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G20x15y0 ::~G20x15y0(){ note_dtor("G20x15y0", this);} // tgen
G20x15y0 ::G20x15y0(){ note_ctor("G20x15y0", this);} // tgen

static void Test_G20x15y0()
{
  extern Class_Descriptor cd_G20x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G20x15y0, buf);
    G20x15y0 *dp, &lv = *(dp=new (buf) G20x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G20x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x15y0)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,28), "G20x15y0");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,20), "G20x15y0");
    check_base_class_offset(lv, (C20*)(E20x15*), ABISELECT(32,20), "G20x15y0");
    check_base_class_offset(lv, (D0*)(E20x15*), ABISELECT(52,36), "G20x15y0");
    check_base_class_offset(lv, (E20x15*), 0, "G20x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G20x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G20x15y0.ff");
    test_class_info(&lv, &cd_G20x15y0);
    dp->~G20x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x15y0(Test_G20x15y0, "G20x15y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G20x15y0C1Ev();
extern void _ZN8G20x15y0D1Ev();
Name_Map name_map_G20x15y0[] = {
  NSPAIR(_ZN8G20x15y0C1Ev),
  NSPAIR(_ZN8G20x15y0D1Ev),
  {0,0}
};
extern Class_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_E20x15;
extern VTBL_ENTRY _ZTI6E20x15[];
extern  VTBL_ENTRY _ZTV6E20x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x15y0[] = {
  // 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)
    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_E20x15,    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
    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 _ZTI8G20x15y0[];
extern void _ZN6E20x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv)();
extern void ABISELECT(_ZThn32_N6E20x153fooEv,_ZThn20_N6E20x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G20x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x15y0[0]),
  (VTBL_ENTRY)&_ZN6E20x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G20x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G20x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv),
};
extern VTBL_ENTRY _ZTV8G20x15y0[];
extern void _ZN6E20x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x15__8G20x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x15[0]),
  (VTBL_ENTRY)&_ZN6E20x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv)();
extern void ABISELECT(_ZThn32_N6E20x153fooEv,_ZThn20_N6E20x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C20__6E20x15__8G20x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E20x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv),
};
static  VTT_ENTRY vtt_G20x15y0[] = {
  {&(_ZTV8G20x15y0[4]),  4,12},
  {&(_tg__ZTV6E20x15__8G20x15y0[4]),  4,5},
  {&(_tg__ZTV3C20__6E20x15__8G20x15y0[3]),  3,4},
  {&(_ZTV8G20x15y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI8G20x15y0[];
extern  VTBL_ENTRY _ZTV8G20x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x15y0[];
static VTBL_ENTRY alt_thunk_names657[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E20x153fooEv,_ZThn20_N6E20x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E20x153fooEv,_ZThn20_N6E20x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G20x15y0 = {  "G20x15y0", // class name
  bases_G20x15y0, 6,
  &(vtc_G20x15y0[0]), // expected_vtbl_contents
  &(vtt_G20x15y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G20x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x15y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x15y0),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names657,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x15y1  : virtual E20x15 , F1 {
  int ff;
  ~G20x15y1(); // tgen
  G20x15y1(); // tgen
};
//SIG(1 G20x15y1) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G20x15y1 ::~G20x15y1(){ note_dtor("G20x15y1", this);} // tgen
G20x15y1 ::G20x15y1(){ note_ctor("G20x15y1", this);} // tgen

static void Test_G20x15y1()
{
  extern Class_Descriptor cd_G20x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G20x15y1, buf);
    G20x15y1 *dp, &lv = *(dp=new (buf) G20x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G20x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x15y1)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,28), "G20x15y1");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,20), "G20x15y1");
    check_base_class_offset(lv, (C20*)(E20x15*), ABISELECT(32,20), "G20x15y1");
    check_base_class_offset(lv, (D0*)(E20x15*), ABISELECT(52,36), "G20x15y1");
    check_base_class_offset(lv, (E20x15*), ABISELECT(16,12), "G20x15y1");
    check_base_class_offset(lv, (F1*), 0, "G20x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x15y1.ff");
    test_class_info(&lv, &cd_G20x15y1);
    dp->~G20x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x15y1(Test_G20x15y1, "G20x15y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G20x15y1C1Ev();
extern void _ZN8G20x15y1D1Ev();
Name_Map name_map_G20x15y1[] = {
  NSPAIR(_ZN8G20x15y1C1Ev),
  NSPAIR(_ZN8G20x15y1D1Ev),
  {0,0}
};
extern Class_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_E20x15;
extern VTBL_ENTRY _ZTI6E20x15[];
extern  VTBL_ENTRY _ZTV6E20x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x15y1[] = {
  // 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
    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
    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_E20x15,    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 _ZTI8G20x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E20x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv)();
extern void ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn8_N6E20x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G20x15y1[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G20x15y1[0]),
  (VTBL_ENTRY)&_ZN6E20x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G20x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv),
};
extern VTBL_ENTRY _ZTV8G20x15y1[];
extern void _ZN6E20x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x15__8G20x15y1[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x15[0]),
  (VTBL_ENTRY)&_ZN6E20x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv)();
extern void ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn8_N6E20x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C20__6E20x15__8G20x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E20x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv),
};
static  VTT_ENTRY vtt_G20x15y1[] = {
  {&(_ZTV8G20x15y1[5]),  5,16},
  {&(_ZTV8G20x15y1[11]),  11,16},
  {&(_ZTV8G20x15y1[15]),  15,16},
  {&(_tg__ZTV6E20x15__8G20x15y1[4]),  4,5},
  {&(_tg__ZTV3C20__6E20x15__8G20x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G20x15y1[];
extern  VTBL_ENTRY _ZTV8G20x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x15y1[];
static VTBL_ENTRY alt_thunk_names658[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn8_N6E20x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn8_N6E20x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G20x15y1 = {  "G20x15y1", // class name
  bases_G20x15y1, 6,
  &(vtc_G20x15y1[0]), // expected_vtbl_contents
  &(vtt_G20x15y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G20x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x15y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x15y1),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names658,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x15y2  : E20x15 , virtual F1 {
  int ff;
  ~G20x15y2(); // tgen
  G20x15y2(); // tgen
};
//SIG(1 G20x15y2) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G20x15y2 ::~G20x15y2(){ note_dtor("G20x15y2", this);} // tgen
G20x15y2 ::G20x15y2(){ note_ctor("G20x15y2", this);} // tgen

static void Test_G20x15y2()
{
  extern Class_Descriptor cd_G20x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G20x15y2, buf);
    G20x15y2 *dp, &lv = *(dp=new (buf) G20x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G20x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x15y2)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(28,20), "G20x15y2");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(16,12), "G20x15y2");
    check_base_class_offset(lv, (C20*)(E20x15*), ABISELECT(16,12), "G20x15y2");
    check_base_class_offset(lv, (D0*)(E20x15*), ABISELECT(36,28), "G20x15y2");
    check_base_class_offset(lv, (E20x15*), 0, "G20x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G20x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x15y2.ff");
    test_class_info(&lv, &cd_G20x15y2);
    dp->~G20x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x15y2(Test_G20x15y2, "G20x15y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G20x15y2C1Ev();
extern void _ZN8G20x15y2D1Ev();
Name_Map name_map_G20x15y2[] = {
  NSPAIR(_ZN8G20x15y2C1Ev),
  NSPAIR(_ZN8G20x15y2D1Ev),
  {0,0}
};
extern Class_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_E20x15;
extern VTBL_ENTRY _ZTI6E20x15[];
extern  VTBL_ENTRY _ZTV6E20x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x15y2[] = {
  // 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
    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(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_E20x15,    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)
    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 _ZTI8G20x15y2[];
extern void _ZN6E20x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv)();
extern void ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn12_N6E20x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x15y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x15y2[0]),
  (VTBL_ENTRY)&_ZN6E20x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G20x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G20x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G20x15y2[];
extern void _ZN6E20x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x15__8G20x15y2[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x15[0]),
  (VTBL_ENTRY)&_ZN6E20x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv)();
extern void ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn12_N6E20x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C20__6E20x15__8G20x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E20x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv),
};
static  VTT_ENTRY vtt_G20x15y2[] = {
  {&(_ZTV8G20x15y2[5]),  5,14},
  {&(_tg__ZTV6E20x15__8G20x15y2[4]),  4,5},
  {&(_tg__ZTV3C20__6E20x15__8G20x15y2[3]),  3,4},
  {&(_ZTV8G20x15y2[9]),  9,14},
  {&(_ZTV8G20x15y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI8G20x15y2[];
extern  VTBL_ENTRY _ZTV8G20x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x15y2[];
static VTBL_ENTRY alt_thunk_names659[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn12_N6E20x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn12_N6E20x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G20x15y2 = {  "G20x15y2", // class name
  bases_G20x15y2, 6,
  &(vtc_G20x15y2[0]), // expected_vtbl_contents
  &(vtt_G20x15y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G20x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x15y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x15y2),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names659,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x15y3  : virtual E20x15 , virtual F1 {
  int ff;
  ~G20x15y3(); // tgen
  G20x15y3(); // tgen
};
//SIG(1 G20x15y3) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G20x15y3 ::~G20x15y3(){ note_dtor("G20x15y3", this);} // tgen
G20x15y3 ::G20x15y3(){ note_ctor("G20x15y3", this);} // tgen

static void Test_G20x15y3()
{
  extern Class_Descriptor cd_G20x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G20x15y3, buf);
    G20x15y3 *dp, &lv = *(dp=new (buf) G20x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G20x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x15y3)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,24), "G20x15y3");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,16), "G20x15y3");
    check_base_class_offset(lv, (C20*)(E20x15*), ABISELECT(32,16), "G20x15y3");
    check_base_class_offset(lv, (D0*)(E20x15*), ABISELECT(52,32), "G20x15y3");
    check_base_class_offset(lv, (E20x15*), ABISELECT(16,8), "G20x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G20x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G20x15y3.ff");
    test_class_info(&lv, &cd_G20x15y3);
    dp->~G20x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x15y3(Test_G20x15y3, "G20x15y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G20x15y3C1Ev();
extern void _ZN8G20x15y3D1Ev();
Name_Map name_map_G20x15y3[] = {
  NSPAIR(_ZN8G20x15y3C1Ev),
  NSPAIR(_ZN8G20x15y3D1Ev),
  {0,0}
};
extern Class_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_E20x15;
extern VTBL_ENTRY _ZTI6E20x15[];
extern  VTBL_ENTRY _ZTV6E20x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x15y3[] = {
  // 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
    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
    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_E20x15,    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 _ZTI8G20x15y3[];
extern void _ZN6E20x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv)();
extern void ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn8_N6E20x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x15y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x15y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G20x15y3[0]),
  (VTBL_ENTRY)&_ZN6E20x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G20x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G20x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G20x15y3[];
extern void _ZN6E20x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x15__8G20x15y3[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x15[0]),
  (VTBL_ENTRY)&_ZN6E20x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv)();
extern void ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn8_N6E20x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C20__6E20x15__8G20x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E20x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv),
};
static  VTT_ENTRY vtt_G20x15y3[] = {
  {&(_ZTV8G20x15y3[6]),  6,20},
  {&(_ZTV8G20x15y3[11]),  11,20},
  {&(_ZTV8G20x15y3[15]),  15,20},
  {&(_ZTV8G20x15y3[19]),  19,20},
  {&(_tg__ZTV6E20x15__8G20x15y3[4]),  4,5},
  {&(_tg__ZTV3C20__6E20x15__8G20x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G20x15y3[];
extern  VTBL_ENTRY _ZTV8G20x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x15y3[];
static VTBL_ENTRY alt_thunk_names660[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn8_N6E20x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn8_N6E20x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G20x15y3 = {  "G20x15y3", // class name
  bases_G20x15y3, 6,
  &(vtc_G20x15y3[0]), // expected_vtbl_contents
  &(vtt_G20x15y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G20x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x15y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x15y3),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names660,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x15y4  : E20x15 , F0 {
  int ff;
  ~G20x15y4(); // tgen
  G20x15y4(); // tgen
};
//SIG(1 G20x15y4) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G20x15y4 ::~G20x15y4(){ note_dtor("G20x15y4", this);} // tgen
G20x15y4 ::G20x15y4(){ note_ctor("G20x15y4", this);} // tgen

static void Test_G20x15y4()
{
  extern Class_Descriptor cd_G20x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x15y4, buf);
    G20x15y4 *dp, &lv = *(dp=new (buf) G20x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x15y4)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(36,24), "G20x15y4");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(24,16), "G20x15y4");
    check_base_class_offset(lv, (C20*)(E20x15*), ABISELECT(24,16), "G20x15y4");
    check_base_class_offset(lv, (D0*)(E20x15*), ABISELECT(44,32), "G20x15y4");
    check_base_class_offset(lv, (E20x15*), 0, "G20x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G20x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G20x15y4.ff");
    test_class_info(&lv, &cd_G20x15y4);
    dp->~G20x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x15y4(Test_G20x15y4, "G20x15y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G20x15y4C1Ev();
extern void _ZN8G20x15y4D1Ev();
Name_Map name_map_G20x15y4[] = {
  NSPAIR(_ZN8G20x15y4C1Ev),
  NSPAIR(_ZN8G20x15y4D1Ev),
  {0,0}
};
extern Class_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_E20x15;
extern VTBL_ENTRY _ZTI6E20x15[];
extern  VTBL_ENTRY _ZTV6E20x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x15y4[] = {
  // 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
    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(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_E20x15,    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 _ZTI8G20x15y4[];
extern void _ZN6E20x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv)();
extern void ABISELECT(_ZThn24_N6E20x153fooEv,_ZThn16_N6E20x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G20x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x15y4[0]),
  (VTBL_ENTRY)&_ZN6E20x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G20x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv),
};
extern VTBL_ENTRY _ZTV8G20x15y4[];
extern void _ZN6E20x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x15__8G20x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x15[0]),
  (VTBL_ENTRY)&_ZN6E20x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv)();
extern void ABISELECT(_ZThn24_N6E20x153fooEv,_ZThn16_N6E20x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C20__6E20x15__8G20x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E20x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv),
};
static  VTT_ENTRY vtt_G20x15y4[] = {
  {&(_ZTV8G20x15y4[4]),  4,9},
  {&(_tg__ZTV6E20x15__8G20x15y4[4]),  4,5},
  {&(_tg__ZTV3C20__6E20x15__8G20x15y4[3]),  3,4},
  {&(_ZTV8G20x15y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI8G20x15y4[];
extern  VTBL_ENTRY _ZTV8G20x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x15y4[];
static VTBL_ENTRY alt_thunk_names661[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E20x153fooEv,_ZThn16_N6E20x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E20x153fooEv,_ZThn16_N6E20x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G20x15y4 = {  "G20x15y4", // class name
  bases_G20x15y4, 6,
  &(vtc_G20x15y4[0]), // expected_vtbl_contents
  &(vtt_G20x15y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G20x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x15y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x15y4),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names661,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x15y5  : virtual E20x15 , F0 {
  int ff;
  ~G20x15y5(); // tgen
  G20x15y5(); // tgen
};
//SIG(1 G20x15y5) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G20x15y5 ::~G20x15y5(){ note_dtor("G20x15y5", this);} // tgen
G20x15y5 ::G20x15y5(){ note_ctor("G20x15y5", this);} // tgen

static void Test_G20x15y5()
{
  extern Class_Descriptor cd_G20x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G20x15y5, buf);
    G20x15y5 *dp, &lv = *(dp=new (buf) G20x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G20x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x15y5)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,28), "G20x15y5");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,20), "G20x15y5");
    check_base_class_offset(lv, (C20*)(E20x15*), ABISELECT(32,20), "G20x15y5");
    check_base_class_offset(lv, (D0*)(E20x15*), ABISELECT(52,36), "G20x15y5");
    check_base_class_offset(lv, (E20x15*), ABISELECT(16,12), "G20x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G20x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x15y5.ff");
    test_class_info(&lv, &cd_G20x15y5);
    dp->~G20x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x15y5(Test_G20x15y5, "G20x15y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G20x15y5C1Ev();
extern void _ZN8G20x15y5D1Ev();
Name_Map name_map_G20x15y5[] = {
  NSPAIR(_ZN8G20x15y5C1Ev),
  NSPAIR(_ZN8G20x15y5D1Ev),
  {0,0}
};
extern Class_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_E20x15;
extern VTBL_ENTRY _ZTI6E20x15[];
extern  VTBL_ENTRY _ZTV6E20x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x15y5[] = {
  // 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
    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
    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_E20x15,    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 _ZTI8G20x15y5[];
extern void _ZN6E20x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv)();
extern void ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn8_N6E20x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G20x15y5[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x15y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G20x15y5[0]),
  (VTBL_ENTRY)&_ZN6E20x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G20x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv),
};
extern VTBL_ENTRY _ZTV8G20x15y5[];
extern void _ZN6E20x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x15__8G20x15y5[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x15[0]),
  (VTBL_ENTRY)&_ZN6E20x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv)();
extern void ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn8_N6E20x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C20__6E20x15__8G20x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E20x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv),
};
static  VTT_ENTRY vtt_G20x15y5[] = {
  {&(_ZTV8G20x15y5[5]),  5,15},
  {&(_ZTV8G20x15y5[10]),  10,15},
  {&(_ZTV8G20x15y5[14]),  14,15},
  {&(_tg__ZTV6E20x15__8G20x15y5[4]),  4,5},
  {&(_tg__ZTV3C20__6E20x15__8G20x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G20x15y5[];
extern  VTBL_ENTRY _ZTV8G20x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x15y5[];
static VTBL_ENTRY alt_thunk_names662[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn8_N6E20x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn8_N6E20x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G20x15y5 = {  "G20x15y5", // class name
  bases_G20x15y5, 6,
  &(vtc_G20x15y5[0]), // expected_vtbl_contents
  &(vtt_G20x15y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G20x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x15y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x15y5),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names662,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x15y6  : E20x15 , virtual F0 {
  int ff;
  ~G20x15y6(); // tgen
  G20x15y6(); // tgen
};
//SIG(1 G20x15y6) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G20x15y6 ::~G20x15y6(){ note_dtor("G20x15y6", this);} // tgen
G20x15y6 ::G20x15y6(){ note_ctor("G20x15y6", this);} // tgen

static void Test_G20x15y6()
{
  extern Class_Descriptor cd_G20x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x15y6, buf);
    G20x15y6 *dp, &lv = *(dp=new (buf) G20x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x15y6)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(28,20), "G20x15y6");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(16,12), "G20x15y6");
    check_base_class_offset(lv, (C20*)(E20x15*), ABISELECT(16,12), "G20x15y6");
    check_base_class_offset(lv, (D0*)(E20x15*), ABISELECT(36,28), "G20x15y6");
    check_base_class_offset(lv, (E20x15*), 0, "G20x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G20x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x15y6.ff");
    test_class_info(&lv, &cd_G20x15y6);
    dp->~G20x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x15y6(Test_G20x15y6, "G20x15y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G20x15y6C1Ev();
extern void _ZN8G20x15y6D1Ev();
Name_Map name_map_G20x15y6[] = {
  NSPAIR(_ZN8G20x15y6C1Ev),
  NSPAIR(_ZN8G20x15y6D1Ev),
  {0,0}
};
extern Class_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_E20x15;
extern VTBL_ENTRY _ZTI6E20x15[];
extern  VTBL_ENTRY _ZTV6E20x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x15y6[] = {
  // 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
    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(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_E20x15,    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 _ZTI8G20x15y6[];
extern void _ZN6E20x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv)();
extern void ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn12_N6E20x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G20x15y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x15y6[0]),
  (VTBL_ENTRY)&_ZN6E20x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G20x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv),
};
extern VTBL_ENTRY _ZTV8G20x15y6[];
extern void _ZN6E20x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x15__8G20x15y6[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x15[0]),
  (VTBL_ENTRY)&_ZN6E20x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv)();
extern void ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn12_N6E20x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C20__6E20x15__8G20x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E20x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv),
};
static  VTT_ENTRY vtt_G20x15y6[] = {
  {&(_ZTV8G20x15y6[5]),  5,10},
  {&(_tg__ZTV6E20x15__8G20x15y6[4]),  4,5},
  {&(_tg__ZTV3C20__6E20x15__8G20x15y6[3]),  3,4},
  {&(_ZTV8G20x15y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI8G20x15y6[];
extern  VTBL_ENTRY _ZTV8G20x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x15y6[];
static VTBL_ENTRY alt_thunk_names663[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn12_N6E20x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn12_N6E20x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G20x15y6 = {  "G20x15y6", // class name
  bases_G20x15y6, 6,
  &(vtc_G20x15y6[0]), // expected_vtbl_contents
  &(vtt_G20x15y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G20x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x15y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x15y6),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names663,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x15y7  : virtual E20x15 , virtual F0 {
  int ff;
  ~G20x15y7(); // tgen
  G20x15y7(); // tgen
};
//SIG(1 G20x15y7) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G20x15y7 ::~G20x15y7(){ note_dtor("G20x15y7", this);} // tgen
G20x15y7 ::G20x15y7(){ note_ctor("G20x15y7", this);} // tgen

static void Test_G20x15y7()
{
  extern Class_Descriptor cd_G20x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G20x15y7, buf);
    G20x15y7 *dp, &lv = *(dp=new (buf) G20x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G20x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x15y7)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,24), "G20x15y7");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,16), "G20x15y7");
    check_base_class_offset(lv, (C20*)(E20x15*), ABISELECT(32,16), "G20x15y7");
    check_base_class_offset(lv, (D0*)(E20x15*), ABISELECT(52,32), "G20x15y7");
    check_base_class_offset(lv, (E20x15*), ABISELECT(16,8), "G20x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G20x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G20x15y7.ff");
    test_class_info(&lv, &cd_G20x15y7);
    dp->~G20x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x15y7(Test_G20x15y7, "G20x15y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G20x15y7C1Ev();
extern void _ZN8G20x15y7D1Ev();
Name_Map name_map_G20x15y7[] = {
  NSPAIR(_ZN8G20x15y7C1Ev),
  NSPAIR(_ZN8G20x15y7D1Ev),
  {0,0}
};
extern Class_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_E20x15;
extern VTBL_ENTRY _ZTI6E20x15[];
extern  VTBL_ENTRY _ZTV6E20x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E20x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x15y7[] = {
  // 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
    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
    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_E20x15,    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 _ZTI8G20x15y7[];
extern void _ZN6E20x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv)();
extern void ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn8_N6E20x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G20x15y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G20x15y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G20x15y7[0]),
  (VTBL_ENTRY)&_ZN6E20x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G20x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv),
};
extern VTBL_ENTRY _ZTV8G20x15y7[];
extern void _ZN6E20x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E20x15__8G20x15y7[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E20x15[0]),
  (VTBL_ENTRY)&_ZN6E20x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv)();
extern void ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn8_N6E20x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C20__6E20x15__8G20x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E20x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv),
};
static  VTT_ENTRY vtt_G20x15y7[] = {
  {&(_ZTV8G20x15y7[6]),  6,16},
  {&(_ZTV8G20x15y7[11]),  11,16},
  {&(_ZTV8G20x15y7[15]),  15,16},
  {&(_tg__ZTV6E20x15__8G20x15y7[4]),  4,5},
  {&(_tg__ZTV3C20__6E20x15__8G20x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G20x15y7[];
extern  VTBL_ENTRY _ZTV8G20x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G20x15y7[];
static VTBL_ENTRY alt_thunk_names664[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E20x153fooEv,_ZTv0_n12_N6E20x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn8_N6E20x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E20x153fooEv,_ZThn8_N6E20x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G20x15y7 = {  "G20x15y7", // class name
  bases_G20x15y7, 6,
  &(vtc_G20x15y7[0]), // expected_vtbl_contents
  &(vtt_G20x15y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G20x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G20x15y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G20x15y7),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names664,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E21x15  : virtual C21 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E21x153fooEv
  ~E21x15(); // tgen
  E21x15(); // tgen
};
//SIG(-1 E21x15) C1{ VBC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E21x15 ::foo(){vfunc_called(this, "_ZN6E21x153fooEv");}
E21x15 ::~E21x15(){ note_dtor("E21x15", this);} // tgen
E21x15 ::E21x15(){ note_ctor("E21x15", this);} // tgen

static void Test_E21x15()
{
  extern Class_Descriptor cd_E21x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_E21x15, buf);
    E21x15 *dp, &lv = *(dp=new (buf) E21x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(E21x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E21x15)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(16,8), "E21x15");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(32,16), "E21x15");
    check_base_class_offset(lv, (C21*), ABISELECT(16,8), "E21x15");
    check_base_class_offset(lv, (D0*), ABISELECT(48,28), "E21x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E21x15.fd");
    test_class_info(&lv, &cd_E21x15);
    dp->~E21x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE21x15(Test_E21x15, "E21x15", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN6E21x15C1Ev();
extern void _ZN6E21x15D1Ev();
Name_Map name_map_E21x15[] = {
  NSPAIR(_ZN6E21x15C1Ev),
  NSPAIR(_ZN6E21x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x15[] = {
  // 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
    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,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
    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 _ZTI6E21x15[];
extern void _ZN6E21x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv)();
extern void ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn8_N6E21x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv)();
static  VTBL_ENTRY vtc_E21x15[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&_ZN6E21x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv),
};
extern VTBL_ENTRY _ZTV6E21x15[];
static  VTT_ENTRY vtt_E21x15[] = {
  {&(_ZTV6E21x15[4]),  4,12},
  {&(_ZTV6E21x15[8]),  8,12},
  {&(_ZTV6E21x15[11]),  11,12},
};
extern VTBL_ENTRY _ZTI6E21x15[];
extern  VTBL_ENTRY _ZTV6E21x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x15[];
static VTBL_ENTRY alt_thunk_names665[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn8_N6E21x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E21x15 = {  "E21x15", // class name
  bases_E21x15, 4,
  &(vtc_E21x15[0]), // expected_vtbl_contents
  &(vtt_E21x15[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI6E21x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E21x15),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E21x15),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names665,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x15y0  : E21x15 , F1 {
  int ff;
  ~G21x15y0(); // tgen
  G21x15y0(); // tgen
};
//SIG(1 G21x15y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G21x15y0 ::~G21x15y0(){ note_dtor("G21x15y0", this);} // tgen
G21x15y0 ::G21x15y0(){ note_ctor("G21x15y0", this);} // tgen

static void Test_G21x15y0()
{
  extern Class_Descriptor cd_G21x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G21x15y0, buf);
    G21x15y0 *dp, &lv = *(dp=new (buf) G21x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G21x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x15y0)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,20), "G21x15y0");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,28), "G21x15y0");
    check_base_class_offset(lv, (C21*)(E21x15*), ABISELECT(32,20), "G21x15y0");
    check_base_class_offset(lv, (D0*)(E21x15*), ABISELECT(64,40), "G21x15y0");
    check_base_class_offset(lv, (E21x15*), 0, "G21x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G21x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G21x15y0.ff");
    test_class_info(&lv, &cd_G21x15y0);
    dp->~G21x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x15y0(Test_G21x15y0, "G21x15y0", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G21x15y0C1Ev();
extern void _ZN8G21x15y0D1Ev();
Name_Map name_map_G21x15y0[] = {
  NSPAIR(_ZN8G21x15y0C1Ev),
  NSPAIR(_ZN8G21x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x15;
extern VTBL_ENTRY _ZTI6E21x15[];
extern  VTBL_ENTRY _ZTV6E21x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x15y0[] = {
  // 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)
    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
    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
    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_E21x15,    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
    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 _ZTI8G21x15y0[];
extern void _ZN6E21x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv)();
extern void ABISELECT(_ZThn32_N6E21x153fooEv,_ZThn20_N6E21x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv)();
static  VTBL_ENTRY vtc_G21x15y0[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x15y0[0]),
  (VTBL_ENTRY)&_ZN6E21x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G21x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G21x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G21x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv),
};
extern VTBL_ENTRY _ZTV8G21x15y0[];
extern void _ZN6E21x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x15__8G21x15y0[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&_ZN6E21x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv)();
extern void ABISELECT(_ZThn32_N6E21x153fooEv,_ZThn20_N6E21x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C21__6E21x15__8G21x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__6E21x15__8G21x15y0[] = {
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv),
};
static  VTT_ENTRY vtt_G21x15y0[] = {
  {&(_ZTV8G21x15y0[4]),  4,15},
  {&(_tg__ZTV6E21x15__8G21x15y0[4]),  4,5},
  {&(_tg__ZTV3C21__6E21x15__8G21x15y0[3]),  3,4},
  {&(_tg__ZTV2B13C21__6E21x15__8G21x15y0[2]),  2,3},
  {&(_ZTV8G21x15y0[11]),  11,15},
  {&(_ZTV8G21x15y0[14]),  14,15},
};
extern VTBL_ENTRY _ZTI8G21x15y0[];
extern  VTBL_ENTRY _ZTV8G21x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x15y0[];
static VTBL_ENTRY alt_thunk_names666[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E21x153fooEv,_ZThn20_N6E21x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E21x153fooEv,_ZThn20_N6E21x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G21x15y0 = {  "G21x15y0", // class name
  bases_G21x15y0, 6,
  &(vtc_G21x15y0[0]), // expected_vtbl_contents
  &(vtt_G21x15y0[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G21x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x15y0),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x15y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names666,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x15y1  : virtual E21x15 , F1 {
  int ff;
  ~G21x15y1(); // tgen
  G21x15y1(); // tgen
};
//SIG(1 G21x15y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G21x15y1 ::~G21x15y1(){ note_dtor("G21x15y1", this);} // tgen
G21x15y1 ::G21x15y1(){ note_ctor("G21x15y1", this);} // tgen

static void Test_G21x15y1()
{
  extern Class_Descriptor cd_G21x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G21x15y1, buf);
    G21x15y1 *dp, &lv = *(dp=new (buf) G21x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G21x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x15y1)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,20), "G21x15y1");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,28), "G21x15y1");
    check_base_class_offset(lv, (C21*)(E21x15*), ABISELECT(32,20), "G21x15y1");
    check_base_class_offset(lv, (D0*)(E21x15*), ABISELECT(64,40), "G21x15y1");
    check_base_class_offset(lv, (E21x15*), ABISELECT(16,12), "G21x15y1");
    check_base_class_offset(lv, (F1*), 0, "G21x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x15y1.ff");
    test_class_info(&lv, &cd_G21x15y1);
    dp->~G21x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x15y1(Test_G21x15y1, "G21x15y1", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G21x15y1C1Ev();
extern void _ZN8G21x15y1D1Ev();
Name_Map name_map_G21x15y1[] = {
  NSPAIR(_ZN8G21x15y1C1Ev),
  NSPAIR(_ZN8G21x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x15;
extern VTBL_ENTRY _ZTI6E21x15[];
extern  VTBL_ENTRY _ZTV6E21x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x15y1[] = {
  // 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
    16, //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
    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
    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_E21x15,    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 _ZTI8G21x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E21x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv)();
extern void ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn8_N6E21x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv)();
static  VTBL_ENTRY vtc_G21x15y1[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(48,28),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G21x15y1[0]),
  (VTBL_ENTRY)&_ZN6E21x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G21x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G21x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv),
};
extern VTBL_ENTRY _ZTV8G21x15y1[];
extern void _ZN6E21x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x15__8G21x15y1[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&_ZN6E21x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv)();
extern void ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn8_N6E21x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C21__6E21x15__8G21x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__6E21x15__8G21x15y1[] = {
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv),
};
static  VTT_ENTRY vtt_G21x15y1[] = {
  {&(_ZTV8G21x15y1[5]),  5,19},
  {&(_ZTV8G21x15y1[11]),  11,19},
  {&(_ZTV8G21x15y1[15]),  15,19},
  {&(_ZTV8G21x15y1[18]),  18,19},
  {&(_tg__ZTV6E21x15__8G21x15y1[4]),  4,5},
  {&(_tg__ZTV3C21__6E21x15__8G21x15y1[3]),  3,4},
  {&(_tg__ZTV2B13C21__6E21x15__8G21x15y1[2]),  2,3},
};
extern VTBL_ENTRY _ZTI8G21x15y1[];
extern  VTBL_ENTRY _ZTV8G21x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x15y1[];
static VTBL_ENTRY alt_thunk_names667[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn8_N6E21x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn8_N6E21x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G21x15y1 = {  "G21x15y1", // class name
  bases_G21x15y1, 6,
  &(vtc_G21x15y1[0]), // expected_vtbl_contents
  &(vtt_G21x15y1[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G21x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x15y1),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x15y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names667,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x15y2  : E21x15 , virtual F1 {
  int ff;
  ~G21x15y2(); // tgen
  G21x15y2(); // tgen
};
//SIG(1 G21x15y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G21x15y2 ::~G21x15y2(){ note_dtor("G21x15y2", this);} // tgen
G21x15y2 ::G21x15y2(){ note_ctor("G21x15y2", this);} // tgen

static void Test_G21x15y2()
{
  extern Class_Descriptor cd_G21x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G21x15y2, buf);
    G21x15y2 *dp, &lv = *(dp=new (buf) G21x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G21x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x15y2)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(16,12), "G21x15y2");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(32,20), "G21x15y2");
    check_base_class_offset(lv, (C21*)(E21x15*), ABISELECT(16,12), "G21x15y2");
    check_base_class_offset(lv, (D0*)(E21x15*), ABISELECT(48,32), "G21x15y2");
    check_base_class_offset(lv, (E21x15*), 0, "G21x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G21x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x15y2.ff");
    test_class_info(&lv, &cd_G21x15y2);
    dp->~G21x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x15y2(Test_G21x15y2, "G21x15y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G21x15y2C1Ev();
extern void _ZN8G21x15y2D1Ev();
Name_Map name_map_G21x15y2[] = {
  NSPAIR(_ZN8G21x15y2C1Ev),
  NSPAIR(_ZN8G21x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x15;
extern VTBL_ENTRY _ZTI6E21x15[];
extern  VTBL_ENTRY _ZTV6E21x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x15y2[] = {
  // 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)
    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
    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(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_E21x15,    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)
    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 _ZTI8G21x15y2[];
extern void _ZN6E21x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv)();
extern void ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn12_N6E21x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x15y2[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x15y2[0]),
  (VTBL_ENTRY)&_ZN6E21x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G21x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G21x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G21x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G21x15y2[];
extern void _ZN6E21x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x15__8G21x15y2[] = {
  ABISELECT(48,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&_ZN6E21x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv)();
extern void ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn12_N6E21x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C21__6E21x15__8G21x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__6E21x15__8G21x15y2[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv),
};
static  VTT_ENTRY vtt_G21x15y2[] = {
  {&(_ZTV8G21x15y2[5]),  5,17},
  {&(_tg__ZTV6E21x15__8G21x15y2[4]),  4,5},
  {&(_tg__ZTV3C21__6E21x15__8G21x15y2[3]),  3,4},
  {&(_tg__ZTV2B13C21__6E21x15__8G21x15y2[2]),  2,3},
  {&(_ZTV8G21x15y2[9]),  9,17},
  {&(_ZTV8G21x15y2[12]),  12,17},
  {&(_ZTV8G21x15y2[16]),  16,17},
};
extern VTBL_ENTRY _ZTI8G21x15y2[];
extern  VTBL_ENTRY _ZTV8G21x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x15y2[];
static VTBL_ENTRY alt_thunk_names668[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn12_N6E21x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn12_N6E21x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G21x15y2 = {  "G21x15y2", // class name
  bases_G21x15y2, 6,
  &(vtc_G21x15y2[0]), // expected_vtbl_contents
  &(vtt_G21x15y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G21x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x15y2),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x15y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names668,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x15y3  : virtual E21x15 , virtual F1 {
  int ff;
  ~G21x15y3(); // tgen
  G21x15y3(); // tgen
};
//SIG(1 G21x15y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G21x15y3 ::~G21x15y3(){ note_dtor("G21x15y3", this);} // tgen
G21x15y3 ::G21x15y3(){ note_ctor("G21x15y3", this);} // tgen

static void Test_G21x15y3()
{
  extern Class_Descriptor cd_G21x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G21x15y3, buf);
    G21x15y3 *dp, &lv = *(dp=new (buf) G21x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G21x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x15y3)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,16), "G21x15y3");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,24), "G21x15y3");
    check_base_class_offset(lv, (C21*)(E21x15*), ABISELECT(32,16), "G21x15y3");
    check_base_class_offset(lv, (D0*)(E21x15*), ABISELECT(64,36), "G21x15y3");
    check_base_class_offset(lv, (E21x15*), ABISELECT(16,8), "G21x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(72,40), "G21x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G21x15y3.ff");
    test_class_info(&lv, &cd_G21x15y3);
    dp->~G21x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x15y3(Test_G21x15y3, "G21x15y3", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN8G21x15y3C1Ev();
extern void _ZN8G21x15y3D1Ev();
Name_Map name_map_G21x15y3[] = {
  NSPAIR(_ZN8G21x15y3C1Ev),
  NSPAIR(_ZN8G21x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x15;
extern VTBL_ENTRY _ZTI6E21x15[];
extern  VTBL_ENTRY _ZTV6E21x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x15y3[] = {
  // 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
    16, //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
    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
    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_E21x15,    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
    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 _ZTI8G21x15y3[];
extern void _ZN6E21x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv)();
extern void ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn8_N6E21x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x15y3[] = {
  ABISELECT(72,40),
  ABISELECT(64,36),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x15y3[0]),
  0,
  ABISELECT(48,28),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G21x15y3[0]),
  (VTBL_ENTRY)&_ZN6E21x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G21x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI8G21x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv),
  0,
  ABISELECT(-72,-40),
  (VTBL_ENTRY)&(_ZTI8G21x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G21x15y3[];
extern void _ZN6E21x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x15__8G21x15y3[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&_ZN6E21x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv)();
extern void ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn8_N6E21x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C21__6E21x15__8G21x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__6E21x15__8G21x15y3[] = {
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv),
};
static  VTT_ENTRY vtt_G21x15y3[] = {
  {&(_ZTV8G21x15y3[6]),  6,23},
  {&(_ZTV8G21x15y3[11]),  11,23},
  {&(_ZTV8G21x15y3[15]),  15,23},
  {&(_ZTV8G21x15y3[18]),  18,23},
  {&(_ZTV8G21x15y3[22]),  22,23},
  {&(_tg__ZTV6E21x15__8G21x15y3[4]),  4,5},
  {&(_tg__ZTV3C21__6E21x15__8G21x15y3[3]),  3,4},
  {&(_tg__ZTV2B13C21__6E21x15__8G21x15y3[2]),  2,3},
};
extern VTBL_ENTRY _ZTI8G21x15y3[];
extern  VTBL_ENTRY _ZTV8G21x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x15y3[];
static VTBL_ENTRY alt_thunk_names669[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn8_N6E21x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn8_N6E21x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G21x15y3 = {  "G21x15y3", // class name
  bases_G21x15y3, 6,
  &(vtc_G21x15y3[0]), // expected_vtbl_contents
  &(vtt_G21x15y3[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI8G21x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x15y3),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x15y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names669,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x15y4  : E21x15 , F0 {
  int ff;
  ~G21x15y4(); // tgen
  G21x15y4(); // tgen
};
//SIG(1 G21x15y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G21x15y4 ::~G21x15y4(){ note_dtor("G21x15y4", this);} // tgen
G21x15y4 ::G21x15y4(){ note_ctor("G21x15y4", this);} // tgen

static void Test_G21x15y4()
{
  extern Class_Descriptor cd_G21x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G21x15y4, buf);
    G21x15y4 *dp, &lv = *(dp=new (buf) G21x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G21x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x15y4)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(24,16), "G21x15y4");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(40,24), "G21x15y4");
    check_base_class_offset(lv, (C21*)(E21x15*), ABISELECT(24,16), "G21x15y4");
    check_base_class_offset(lv, (D0*)(E21x15*), ABISELECT(56,36), "G21x15y4");
    check_base_class_offset(lv, (E21x15*), 0, "G21x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G21x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G21x15y4.ff");
    test_class_info(&lv, &cd_G21x15y4);
    dp->~G21x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x15y4(Test_G21x15y4, "G21x15y4", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G21x15y4C1Ev();
extern void _ZN8G21x15y4D1Ev();
Name_Map name_map_G21x15y4[] = {
  NSPAIR(_ZN8G21x15y4C1Ev),
  NSPAIR(_ZN8G21x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x15;
extern VTBL_ENTRY _ZTI6E21x15[];
extern  VTBL_ENTRY _ZTV6E21x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x15y4[] = {
  // 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
    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(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
    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_E21x15,    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 _ZTI8G21x15y4[];
extern void _ZN6E21x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv)();
extern void ABISELECT(_ZThn24_N6E21x153fooEv,_ZThn16_N6E21x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv)();
static  VTBL_ENTRY vtc_G21x15y4[] = {
  ABISELECT(56,36),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x15y4[0]),
  (VTBL_ENTRY)&_ZN6E21x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G21x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G21x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv),
};
extern VTBL_ENTRY _ZTV8G21x15y4[];
extern void _ZN6E21x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x15__8G21x15y4[] = {
  ABISELECT(56,36),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&_ZN6E21x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv)();
extern void ABISELECT(_ZThn24_N6E21x153fooEv,_ZThn16_N6E21x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C21__6E21x15__8G21x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__6E21x15__8G21x15y4[] = {
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv),
};
static  VTT_ENTRY vtt_G21x15y4[] = {
  {&(_ZTV8G21x15y4[4]),  4,12},
  {&(_tg__ZTV6E21x15__8G21x15y4[4]),  4,5},
  {&(_tg__ZTV3C21__6E21x15__8G21x15y4[3]),  3,4},
  {&(_tg__ZTV2B13C21__6E21x15__8G21x15y4[2]),  2,3},
  {&(_ZTV8G21x15y4[8]),  8,12},
  {&(_ZTV8G21x15y4[11]),  11,12},
};
extern VTBL_ENTRY _ZTI8G21x15y4[];
extern  VTBL_ENTRY _ZTV8G21x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x15y4[];
static VTBL_ENTRY alt_thunk_names670[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E21x153fooEv,_ZThn16_N6E21x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E21x153fooEv,_ZThn16_N6E21x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G21x15y4 = {  "G21x15y4", // class name
  bases_G21x15y4, 6,
  &(vtc_G21x15y4[0]), // expected_vtbl_contents
  &(vtt_G21x15y4[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G21x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x15y4),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x15y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names670,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x15y5  : virtual E21x15 , F0 {
  int ff;
  ~G21x15y5(); // tgen
  G21x15y5(); // tgen
};
//SIG(1 G21x15y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G21x15y5 ::~G21x15y5(){ note_dtor("G21x15y5", this);} // tgen
G21x15y5 ::G21x15y5(){ note_ctor("G21x15y5", this);} // tgen

static void Test_G21x15y5()
{
  extern Class_Descriptor cd_G21x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G21x15y5, buf);
    G21x15y5 *dp, &lv = *(dp=new (buf) G21x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G21x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x15y5)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,20), "G21x15y5");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,28), "G21x15y5");
    check_base_class_offset(lv, (C21*)(E21x15*), ABISELECT(32,20), "G21x15y5");
    check_base_class_offset(lv, (D0*)(E21x15*), ABISELECT(64,40), "G21x15y5");
    check_base_class_offset(lv, (E21x15*), ABISELECT(16,12), "G21x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G21x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x15y5.ff");
    test_class_info(&lv, &cd_G21x15y5);
    dp->~G21x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x15y5(Test_G21x15y5, "G21x15y5", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G21x15y5C1Ev();
extern void _ZN8G21x15y5D1Ev();
Name_Map name_map_G21x15y5[] = {
  NSPAIR(_ZN8G21x15y5C1Ev),
  NSPAIR(_ZN8G21x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x15;
extern VTBL_ENTRY _ZTI6E21x15[];
extern  VTBL_ENTRY _ZTV6E21x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x15y5[] = {
  // 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
    15, //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
    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
    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_E21x15,    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 _ZTI8G21x15y5[];
extern void _ZN6E21x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv)();
extern void ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn8_N6E21x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv)();
static  VTBL_ENTRY vtc_G21x15y5[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x15y5[0]),
  0,
  ABISELECT(48,28),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G21x15y5[0]),
  (VTBL_ENTRY)&_ZN6E21x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G21x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G21x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv),
};
extern VTBL_ENTRY _ZTV8G21x15y5[];
extern void _ZN6E21x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x15__8G21x15y5[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&_ZN6E21x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv)();
extern void ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn8_N6E21x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C21__6E21x15__8G21x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__6E21x15__8G21x15y5[] = {
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv),
};
static  VTT_ENTRY vtt_G21x15y5[] = {
  {&(_ZTV8G21x15y5[5]),  5,18},
  {&(_ZTV8G21x15y5[10]),  10,18},
  {&(_ZTV8G21x15y5[14]),  14,18},
  {&(_ZTV8G21x15y5[17]),  17,18},
  {&(_tg__ZTV6E21x15__8G21x15y5[4]),  4,5},
  {&(_tg__ZTV3C21__6E21x15__8G21x15y5[3]),  3,4},
  {&(_tg__ZTV2B13C21__6E21x15__8G21x15y5[2]),  2,3},
};
extern VTBL_ENTRY _ZTI8G21x15y5[];
extern  VTBL_ENTRY _ZTV8G21x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x15y5[];
static VTBL_ENTRY alt_thunk_names671[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn8_N6E21x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn8_N6E21x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G21x15y5 = {  "G21x15y5", // class name
  bases_G21x15y5, 6,
  &(vtc_G21x15y5[0]), // expected_vtbl_contents
  &(vtt_G21x15y5[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G21x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x15y5),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x15y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names671,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x15y6  : E21x15 , virtual F0 {
  int ff;
  ~G21x15y6(); // tgen
  G21x15y6(); // tgen
};
//SIG(1 G21x15y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G21x15y6 ::~G21x15y6(){ note_dtor("G21x15y6", this);} // tgen
G21x15y6 ::G21x15y6(){ note_ctor("G21x15y6", this);} // tgen

static void Test_G21x15y6()
{
  extern Class_Descriptor cd_G21x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G21x15y6, buf);
    G21x15y6 *dp, &lv = *(dp=new (buf) G21x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G21x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x15y6)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(16,12), "G21x15y6");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(32,20), "G21x15y6");
    check_base_class_offset(lv, (C21*)(E21x15*), ABISELECT(16,12), "G21x15y6");
    check_base_class_offset(lv, (D0*)(E21x15*), ABISELECT(48,32), "G21x15y6");
    check_base_class_offset(lv, (E21x15*), 0, "G21x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G21x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x15y6.ff");
    test_class_info(&lv, &cd_G21x15y6);
    dp->~G21x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x15y6(Test_G21x15y6, "G21x15y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G21x15y6C1Ev();
extern void _ZN8G21x15y6D1Ev();
Name_Map name_map_G21x15y6[] = {
  NSPAIR(_ZN8G21x15y6C1Ev),
  NSPAIR(_ZN8G21x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x15;
extern VTBL_ENTRY _ZTI6E21x15[];
extern  VTBL_ENTRY _ZTV6E21x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x15y6[] = {
  // 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)
    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
    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(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_E21x15,    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 _ZTI8G21x15y6[];
extern void _ZN6E21x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv)();
extern void ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn12_N6E21x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv)();
static  VTBL_ENTRY vtc_G21x15y6[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x15y6[0]),
  (VTBL_ENTRY)&_ZN6E21x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G21x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G21x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv),
};
extern VTBL_ENTRY _ZTV8G21x15y6[];
extern void _ZN6E21x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x15__8G21x15y6[] = {
  ABISELECT(48,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&_ZN6E21x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv)();
extern void ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn12_N6E21x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C21__6E21x15__8G21x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__6E21x15__8G21x15y6[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv),
};
static  VTT_ENTRY vtt_G21x15y6[] = {
  {&(_ZTV8G21x15y6[5]),  5,13},
  {&(_tg__ZTV6E21x15__8G21x15y6[4]),  4,5},
  {&(_tg__ZTV3C21__6E21x15__8G21x15y6[3]),  3,4},
  {&(_tg__ZTV2B13C21__6E21x15__8G21x15y6[2]),  2,3},
  {&(_ZTV8G21x15y6[9]),  9,13},
  {&(_ZTV8G21x15y6[12]),  12,13},
};
extern VTBL_ENTRY _ZTI8G21x15y6[];
extern  VTBL_ENTRY _ZTV8G21x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x15y6[];
static VTBL_ENTRY alt_thunk_names672[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn12_N6E21x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn12_N6E21x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G21x15y6 = {  "G21x15y6", // class name
  bases_G21x15y6, 6,
  &(vtc_G21x15y6[0]), // expected_vtbl_contents
  &(vtt_G21x15y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G21x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x15y6),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x15y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names672,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x15y7  : virtual E21x15 , virtual F0 {
  int ff;
  ~G21x15y7(); // tgen
  G21x15y7(); // tgen
};
//SIG(1 G21x15y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G21x15y7 ::~G21x15y7(){ note_dtor("G21x15y7", this);} // tgen
G21x15y7 ::G21x15y7(){ note_ctor("G21x15y7", this);} // tgen

static void Test_G21x15y7()
{
  extern Class_Descriptor cd_G21x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G21x15y7, buf);
    G21x15y7 *dp, &lv = *(dp=new (buf) G21x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G21x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x15y7)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,16), "G21x15y7");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,24), "G21x15y7");
    check_base_class_offset(lv, (C21*)(E21x15*), ABISELECT(32,16), "G21x15y7");
    check_base_class_offset(lv, (D0*)(E21x15*), ABISELECT(64,36), "G21x15y7");
    check_base_class_offset(lv, (E21x15*), ABISELECT(16,8), "G21x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(68,40), "G21x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G21x15y7.ff");
    test_class_info(&lv, &cd_G21x15y7);
    dp->~G21x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x15y7(Test_G21x15y7, "G21x15y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G21x15y7C1Ev();
extern void _ZN8G21x15y7D1Ev();
Name_Map name_map_G21x15y7[] = {
  NSPAIR(_ZN8G21x15y7C1Ev),
  NSPAIR(_ZN8G21x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E21x15;
extern VTBL_ENTRY _ZTI6E21x15[];
extern  VTBL_ENTRY _ZTV6E21x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E21x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x15y7[] = {
  // 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
    16, //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
    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
    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_E21x15,    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 _ZTI8G21x15y7[];
extern void _ZN6E21x153fooEv();
extern void ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv)();
extern void ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn8_N6E21x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv)();
static  VTBL_ENTRY vtc_G21x15y7[] = {
  ABISELECT(68,40),
  ABISELECT(64,36),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G21x15y7[0]),
  0,
  ABISELECT(48,28),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G21x15y7[0]),
  (VTBL_ENTRY)&_ZN6E21x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G21x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI8G21x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv),
};
extern VTBL_ENTRY _ZTV8G21x15y7[];
extern void _ZN6E21x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E21x15__8G21x15y7[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&_ZN6E21x153fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv)();
extern void ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn8_N6E21x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C21__6E21x15__8G21x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv),
};
extern void ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__6E21x15__8G21x15y7[] = {
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E21x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTvn16_n24_N6E21x153fooEv,_ZTvn8_n12_N6E21x153fooEv),
};
static  VTT_ENTRY vtt_G21x15y7[] = {
  {&(_ZTV8G21x15y7[6]),  6,19},
  {&(_ZTV8G21x15y7[11]),  11,19},
  {&(_ZTV8G21x15y7[15]),  15,19},
  {&(_ZTV8G21x15y7[18]),  18,19},
  {&(_tg__ZTV6E21x15__8G21x15y7[4]),  4,5},
  {&(_tg__ZTV3C21__6E21x15__8G21x15y7[3]),  3,4},
  {&(_tg__ZTV2B13C21__6E21x15__8G21x15y7[2]),  2,3},
};
extern VTBL_ENTRY _ZTI8G21x15y7[];
extern  VTBL_ENTRY _ZTV8G21x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G21x15y7[];
static VTBL_ENTRY alt_thunk_names673[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E21x153fooEv,_ZTv0_n12_N6E21x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn8_N6E21x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E21x153fooEv,_ZThn8_N6E21x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G21x15y7 = {  "G21x15y7", // class name
  bases_G21x15y7, 6,
  &(vtc_G21x15y7[0]), // expected_vtbl_contents
  &(vtt_G21x15y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G21x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G21x15y7),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G21x15y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names673,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E22x15  : virtual C22 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E22x153fooEv
  ~E22x15(); // tgen
  E22x15(); // tgen
};
//SIG(-1 E22x15) C1{ VBC2{ VBC3{ Fi} BC4{ v1 Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E22x15 ::foo(){vfunc_called(this, "_ZN6E22x153fooEv");}
E22x15 ::~E22x15(){ note_dtor("E22x15", this);} // tgen
E22x15 ::E22x15(){ note_ctor("E22x15", this);} // tgen

static void Test_E22x15()
{
  extern Class_Descriptor cd_E22x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E22x15, buf);
    E22x15 *dp, &lv = *(dp=new (buf) E22x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E22x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E22x15)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(32,20), "E22x15");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(16,8), "E22x15");
    check_base_class_offset(lv, (C22*), ABISELECT(16,8), "E22x15");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E22x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E22x15.fd");
    test_class_info(&lv, &cd_E22x15);
    dp->~E22x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE22x15(Test_E22x15, "E22x15", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E22x15C1Ev();
extern void _ZN6E22x15D1Ev();
Name_Map name_map_E22x15[] = {
  NSPAIR(_ZN6E22x15C1Ev),
  NSPAIR(_ZN6E22x15D1Ev),
  {0,0}
};
extern Class_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_E22x15[] = {
  // 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
    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_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 _ZTI6E22x15[];
extern void _ZN6E22x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv)();
extern void ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn8_N6E22x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E22x15[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x15[0]),
  (VTBL_ENTRY)&_ZN6E22x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E22x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv),
};
extern VTBL_ENTRY _ZTV6E22x15[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__6E22x15[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_E22x15[] = {
  {&(_ZTV6E22x15[5]),  5,11},
  {&(_ZTV6E22x15[10]),  10,11},
  {&(_tg__ZTV3C22__6E22x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E22x15[];
extern  VTBL_ENTRY _ZTV6E22x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x15[];
static VTBL_ENTRY alt_thunk_names674[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn8_N6E22x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E22x15 = {  "E22x15", // class name
  bases_E22x15, 4,
  &(vtc_E22x15[0]), // expected_vtbl_contents
  &(vtt_E22x15[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E22x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E22x15),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E22x15),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names674,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x15y0  : E22x15 , F1 {
  int ff;
  ~G22x15y0(); // tgen
  G22x15y0(); // tgen
};
//SIG(1 G22x15y0) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G22x15y0 ::~G22x15y0(){ note_dtor("G22x15y0", this);} // tgen
G22x15y0 ::G22x15y0(){ note_ctor("G22x15y0", this);} // tgen

static void Test_G22x15y0()
{
  extern Class_Descriptor cd_G22x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G22x15y0, buf);
    G22x15y0 *dp, &lv = *(dp=new (buf) G22x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G22x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x15y0)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,32), "G22x15y0");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,20), "G22x15y0");
    check_base_class_offset(lv, (C22*)(E22x15*), ABISELECT(32,20), "G22x15y0");
    check_base_class_offset(lv, (D0*)(E22x15*), ABISELECT(52,36), "G22x15y0");
    check_base_class_offset(lv, (E22x15*), 0, "G22x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G22x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G22x15y0.ff");
    test_class_info(&lv, &cd_G22x15y0);
    dp->~G22x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x15y0(Test_G22x15y0, "G22x15y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G22x15y0C1Ev();
extern void _ZN8G22x15y0D1Ev();
Name_Map name_map_G22x15y0[] = {
  NSPAIR(_ZN8G22x15y0C1Ev),
  NSPAIR(_ZN8G22x15y0D1Ev),
  {0,0}
};
extern Class_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_E22x15;
extern VTBL_ENTRY _ZTI6E22x15[];
extern  VTBL_ENTRY _ZTV6E22x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x15y0[] = {
  // 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
    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
    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_E22x15,    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
    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 _ZTI8G22x15y0[];
extern void _ZN6E22x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv)();
extern void ABISELECT(_ZThn32_N6E22x153fooEv,_ZThn20_N6E22x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G22x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x15y0[0]),
  (VTBL_ENTRY)&_ZN6E22x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G22x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G22x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv),
};
extern VTBL_ENTRY _ZTV8G22x15y0[];
extern void _ZN6E22x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x15__8G22x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x15[0]),
  (VTBL_ENTRY)&_ZN6E22x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv)();
extern void ABISELECT(_ZThn32_N6E22x153fooEv,_ZThn20_N6E22x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C22__6E22x15__8G22x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E22x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__8G22x15y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x15y0[] = {
  {&(_ZTV8G22x15y0[5]),  5,14},
  {&(_tg__ZTV6E22x15__8G22x15y0[5]),  5,6},
  {&(_tg__ZTV3C22__6E22x15__8G22x15y0[4]),  4,5},
  {&(_ZTV8G22x15y0[13]),  13,14},
  {&(_tg__ZTV3C22__8G22x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x15y0[];
extern  VTBL_ENTRY _ZTV8G22x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x15y0[];
static VTBL_ENTRY alt_thunk_names675[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E22x153fooEv,_ZThn20_N6E22x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E22x153fooEv,_ZThn20_N6E22x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G22x15y0 = {  "G22x15y0", // class name
  bases_G22x15y0, 6,
  &(vtc_G22x15y0[0]), // expected_vtbl_contents
  &(vtt_G22x15y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G22x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x15y0),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x15y0),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names675,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x15y1  : virtual E22x15 , F1 {
  int ff;
  ~G22x15y1(); // tgen
  G22x15y1(); // tgen
};
//SIG(1 G22x15y1) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G22x15y1 ::~G22x15y1(){ note_dtor("G22x15y1", this);} // tgen
G22x15y1 ::G22x15y1(){ note_ctor("G22x15y1", this);} // tgen

static void Test_G22x15y1()
{
  extern Class_Descriptor cd_G22x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G22x15y1, buf);
    G22x15y1 *dp, &lv = *(dp=new (buf) G22x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G22x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x15y1)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,32), "G22x15y1");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,20), "G22x15y1");
    check_base_class_offset(lv, (C22*)(E22x15*), ABISELECT(32,20), "G22x15y1");
    check_base_class_offset(lv, (D0*)(E22x15*), ABISELECT(52,36), "G22x15y1");
    check_base_class_offset(lv, (E22x15*), ABISELECT(16,12), "G22x15y1");
    check_base_class_offset(lv, (F1*), 0, "G22x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x15y1.ff");
    test_class_info(&lv, &cd_G22x15y1);
    dp->~G22x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x15y1(Test_G22x15y1, "G22x15y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G22x15y1C1Ev();
extern void _ZN8G22x15y1D1Ev();
Name_Map name_map_G22x15y1[] = {
  NSPAIR(_ZN8G22x15y1C1Ev),
  NSPAIR(_ZN8G22x15y1D1Ev),
  {0,0}
};
extern Class_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_E22x15;
extern VTBL_ENTRY _ZTI6E22x15[];
extern  VTBL_ENTRY _ZTV6E22x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x15y1[] = {
  // 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
    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
    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_E22x15,    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 _ZTI8G22x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E22x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv)();
extern void ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn8_N6E22x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G22x15y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G22x15y1[0]),
  (VTBL_ENTRY)&_ZN6E22x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G22x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv),
};
extern VTBL_ENTRY _ZTV8G22x15y1[];
extern void _ZN6E22x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x15__8G22x15y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x15[0]),
  (VTBL_ENTRY)&_ZN6E22x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv)();
extern void ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn8_N6E22x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C22__6E22x15__8G22x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E22x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__8G22x15y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x15y1[] = {
  {&(_ZTV8G22x15y1[6]),  6,19},
  {&(_ZTV8G22x15y1[13]),  13,19},
  {&(_ZTV8G22x15y1[18]),  18,19},
  {&(_tg__ZTV6E22x15__8G22x15y1[5]),  5,6},
  {&(_tg__ZTV3C22__6E22x15__8G22x15y1[4]),  4,5},
  {&(_tg__ZTV3C22__8G22x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x15y1[];
extern  VTBL_ENTRY _ZTV8G22x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x15y1[];
static VTBL_ENTRY alt_thunk_names676[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn8_N6E22x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn8_N6E22x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G22x15y1 = {  "G22x15y1", // class name
  bases_G22x15y1, 6,
  &(vtc_G22x15y1[0]), // expected_vtbl_contents
  &(vtt_G22x15y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G22x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x15y1),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x15y1),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names676,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x15y2  : E22x15 , virtual F1 {
  int ff;
  ~G22x15y2(); // tgen
  G22x15y2(); // tgen
};
//SIG(1 G22x15y2) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G22x15y2 ::~G22x15y2(){ note_dtor("G22x15y2", this);} // tgen
G22x15y2 ::G22x15y2(){ note_ctor("G22x15y2", this);} // tgen

static void Test_G22x15y2()
{
  extern Class_Descriptor cd_G22x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G22x15y2, buf);
    G22x15y2 *dp, &lv = *(dp=new (buf) G22x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G22x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x15y2)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(32,24), "G22x15y2");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(16,12), "G22x15y2");
    check_base_class_offset(lv, (C22*)(E22x15*), ABISELECT(16,12), "G22x15y2");
    check_base_class_offset(lv, (D0*)(E22x15*), ABISELECT(36,28), "G22x15y2");
    check_base_class_offset(lv, (E22x15*), 0, "G22x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G22x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x15y2.ff");
    test_class_info(&lv, &cd_G22x15y2);
    dp->~G22x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x15y2(Test_G22x15y2, "G22x15y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G22x15y2C1Ev();
extern void _ZN8G22x15y2D1Ev();
Name_Map name_map_G22x15y2[] = {
  NSPAIR(_ZN8G22x15y2C1Ev),
  NSPAIR(_ZN8G22x15y2D1Ev),
  {0,0}
};
extern Class_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_E22x15;
extern VTBL_ENTRY _ZTI6E22x15[];
extern  VTBL_ENTRY _ZTV6E22x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x15y2[] = {
  // 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
    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
    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_E22x15,    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
    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
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI8G22x15y2[];
extern void _ZN6E22x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv)();
extern void ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn12_N6E22x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x15y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x15y2[0]),
  (VTBL_ENTRY)&_ZN6E22x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G22x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G22x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G22x15y2[];
extern void _ZN6E22x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x15__8G22x15y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x15[0]),
  (VTBL_ENTRY)&_ZN6E22x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv)();
extern void ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn12_N6E22x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C22__6E22x15__8G22x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E22x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__8G22x15y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x15y2[] = {
  {&(_ZTV8G22x15y2[6]),  6,16},
  {&(_tg__ZTV6E22x15__8G22x15y2[5]),  5,6},
  {&(_tg__ZTV3C22__6E22x15__8G22x15y2[4]),  4,5},
  {&(_ZTV8G22x15y2[11]),  11,16},
  {&(_ZTV8G22x15y2[15]),  15,16},
  {&(_tg__ZTV3C22__8G22x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x15y2[];
extern  VTBL_ENTRY _ZTV8G22x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x15y2[];
static VTBL_ENTRY alt_thunk_names677[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn12_N6E22x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn12_N6E22x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G22x15y2 = {  "G22x15y2", // class name
  bases_G22x15y2, 6,
  &(vtc_G22x15y2[0]), // expected_vtbl_contents
  &(vtt_G22x15y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G22x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x15y2),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x15y2),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names677,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x15y3  : virtual E22x15 , virtual F1 {
  int ff;
  ~G22x15y3(); // tgen
  G22x15y3(); // tgen
};
//SIG(1 G22x15y3) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G22x15y3 ::~G22x15y3(){ note_dtor("G22x15y3", this);} // tgen
G22x15y3 ::G22x15y3(){ note_ctor("G22x15y3", this);} // tgen

static void Test_G22x15y3()
{
  extern Class_Descriptor cd_G22x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G22x15y3, buf);
    G22x15y3 *dp, &lv = *(dp=new (buf) G22x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G22x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x15y3)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,28), "G22x15y3");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,16), "G22x15y3");
    check_base_class_offset(lv, (C22*)(E22x15*), ABISELECT(32,16), "G22x15y3");
    check_base_class_offset(lv, (D0*)(E22x15*), ABISELECT(52,32), "G22x15y3");
    check_base_class_offset(lv, (E22x15*), ABISELECT(16,8), "G22x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G22x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G22x15y3.ff");
    test_class_info(&lv, &cd_G22x15y3);
    dp->~G22x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x15y3(Test_G22x15y3, "G22x15y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G22x15y3C1Ev();
extern void _ZN8G22x15y3D1Ev();
Name_Map name_map_G22x15y3[] = {
  NSPAIR(_ZN8G22x15y3C1Ev),
  NSPAIR(_ZN8G22x15y3D1Ev),
  {0,0}
};
extern Class_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_E22x15;
extern VTBL_ENTRY _ZTI6E22x15[];
extern  VTBL_ENTRY _ZTV6E22x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x15y3[] = {
  // 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
    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
    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_E22x15,    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
    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI8G22x15y3[];
extern void _ZN6E22x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv)();
extern void ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn8_N6E22x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x15y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x15y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G22x15y3[0]),
  (VTBL_ENTRY)&_ZN6E22x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G22x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G22x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G22x15y3[];
extern void _ZN6E22x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x15__8G22x15y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x15[0]),
  (VTBL_ENTRY)&_ZN6E22x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv)();
extern void ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn8_N6E22x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C22__6E22x15__8G22x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E22x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__8G22x15y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x15y3[] = {
  {&(_ZTV8G22x15y3[7]),  7,23},
  {&(_ZTV8G22x15y3[13]),  13,23},
  {&(_ZTV8G22x15y3[18]),  18,23},
  {&(_ZTV8G22x15y3[22]),  22,23},
  {&(_tg__ZTV6E22x15__8G22x15y3[5]),  5,6},
  {&(_tg__ZTV3C22__6E22x15__8G22x15y3[4]),  4,5},
  {&(_tg__ZTV3C22__8G22x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x15y3[];
extern  VTBL_ENTRY _ZTV8G22x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x15y3[];
static VTBL_ENTRY alt_thunk_names678[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn8_N6E22x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn8_N6E22x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G22x15y3 = {  "G22x15y3", // class name
  bases_G22x15y3, 6,
  &(vtc_G22x15y3[0]), // expected_vtbl_contents
  &(vtt_G22x15y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G22x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x15y3),23, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x15y3),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names678,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x15y4  : E22x15 , F0 {
  int ff;
  ~G22x15y4(); // tgen
  G22x15y4(); // tgen
};
//SIG(1 G22x15y4) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G22x15y4 ::~G22x15y4(){ note_dtor("G22x15y4", this);} // tgen
G22x15y4 ::G22x15y4(){ note_ctor("G22x15y4", this);} // tgen

static void Test_G22x15y4()
{
  extern Class_Descriptor cd_G22x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x15y4, buf);
    G22x15y4 *dp, &lv = *(dp=new (buf) G22x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x15y4)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(40,28), "G22x15y4");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(24,16), "G22x15y4");
    check_base_class_offset(lv, (C22*)(E22x15*), ABISELECT(24,16), "G22x15y4");
    check_base_class_offset(lv, (D0*)(E22x15*), ABISELECT(44,32), "G22x15y4");
    check_base_class_offset(lv, (E22x15*), 0, "G22x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G22x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G22x15y4.ff");
    test_class_info(&lv, &cd_G22x15y4);
    dp->~G22x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x15y4(Test_G22x15y4, "G22x15y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G22x15y4C1Ev();
extern void _ZN8G22x15y4D1Ev();
Name_Map name_map_G22x15y4[] = {
  NSPAIR(_ZN8G22x15y4C1Ev),
  NSPAIR(_ZN8G22x15y4D1Ev),
  {0,0}
};
extern Class_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_E22x15;
extern VTBL_ENTRY _ZTI6E22x15[];
extern  VTBL_ENTRY _ZTV6E22x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x15y4[] = {
  // 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
    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(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_E22x15,    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 _ZTI8G22x15y4[];
extern void _ZN6E22x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv)();
extern void ABISELECT(_ZThn24_N6E22x153fooEv,_ZThn16_N6E22x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G22x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x15y4[0]),
  (VTBL_ENTRY)&_ZN6E22x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G22x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv),
};
extern VTBL_ENTRY _ZTV8G22x15y4[];
extern void _ZN6E22x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x15__8G22x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x15[0]),
  (VTBL_ENTRY)&_ZN6E22x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv)();
extern void ABISELECT(_ZThn24_N6E22x153fooEv,_ZThn16_N6E22x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C22__6E22x15__8G22x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E22x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__8G22x15y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x15y4[] = {
  {&(_ZTV8G22x15y4[5]),  5,11},
  {&(_tg__ZTV6E22x15__8G22x15y4[5]),  5,6},
  {&(_tg__ZTV3C22__6E22x15__8G22x15y4[4]),  4,5},
  {&(_ZTV8G22x15y4[10]),  10,11},
  {&(_tg__ZTV3C22__8G22x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x15y4[];
extern  VTBL_ENTRY _ZTV8G22x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x15y4[];
static VTBL_ENTRY alt_thunk_names679[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E22x153fooEv,_ZThn16_N6E22x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E22x153fooEv,_ZThn16_N6E22x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G22x15y4 = {  "G22x15y4", // class name
  bases_G22x15y4, 6,
  &(vtc_G22x15y4[0]), // expected_vtbl_contents
  &(vtt_G22x15y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G22x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x15y4),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x15y4),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names679,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x15y5  : virtual E22x15 , F0 {
  int ff;
  ~G22x15y5(); // tgen
  G22x15y5(); // tgen
};
//SIG(1 G22x15y5) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G22x15y5 ::~G22x15y5(){ note_dtor("G22x15y5", this);} // tgen
G22x15y5 ::G22x15y5(){ note_ctor("G22x15y5", this);} // tgen

static void Test_G22x15y5()
{
  extern Class_Descriptor cd_G22x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G22x15y5, buf);
    G22x15y5 *dp, &lv = *(dp=new (buf) G22x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G22x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x15y5)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,32), "G22x15y5");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,20), "G22x15y5");
    check_base_class_offset(lv, (C22*)(E22x15*), ABISELECT(32,20), "G22x15y5");
    check_base_class_offset(lv, (D0*)(E22x15*), ABISELECT(52,36), "G22x15y5");
    check_base_class_offset(lv, (E22x15*), ABISELECT(16,12), "G22x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G22x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x15y5.ff");
    test_class_info(&lv, &cd_G22x15y5);
    dp->~G22x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x15y5(Test_G22x15y5, "G22x15y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G22x15y5C1Ev();
extern void _ZN8G22x15y5D1Ev();
Name_Map name_map_G22x15y5[] = {
  NSPAIR(_ZN8G22x15y5C1Ev),
  NSPAIR(_ZN8G22x15y5D1Ev),
  {0,0}
};
extern Class_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_E22x15;
extern VTBL_ENTRY _ZTI6E22x15[];
extern  VTBL_ENTRY _ZTV6E22x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x15y5[] = {
  // 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
    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
    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_E22x15,    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 _ZTI8G22x15y5[];
extern void _ZN6E22x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv)();
extern void ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn8_N6E22x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G22x15y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x15y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G22x15y5[0]),
  (VTBL_ENTRY)&_ZN6E22x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G22x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv),
};
extern VTBL_ENTRY _ZTV8G22x15y5[];
extern void _ZN6E22x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x15__8G22x15y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x15[0]),
  (VTBL_ENTRY)&_ZN6E22x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv)();
extern void ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn8_N6E22x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C22__6E22x15__8G22x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E22x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__8G22x15y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x15y5[] = {
  {&(_ZTV8G22x15y5[6]),  6,18},
  {&(_ZTV8G22x15y5[12]),  12,18},
  {&(_ZTV8G22x15y5[17]),  17,18},
  {&(_tg__ZTV6E22x15__8G22x15y5[5]),  5,6},
  {&(_tg__ZTV3C22__6E22x15__8G22x15y5[4]),  4,5},
  {&(_tg__ZTV3C22__8G22x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x15y5[];
extern  VTBL_ENTRY _ZTV8G22x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x15y5[];
static VTBL_ENTRY alt_thunk_names680[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn8_N6E22x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn8_N6E22x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G22x15y5 = {  "G22x15y5", // class name
  bases_G22x15y5, 6,
  &(vtc_G22x15y5[0]), // expected_vtbl_contents
  &(vtt_G22x15y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G22x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x15y5),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x15y5),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names680,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x15y6  : E22x15 , virtual F0 {
  int ff;
  ~G22x15y6(); // tgen
  G22x15y6(); // tgen
};
//SIG(1 G22x15y6) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G22x15y6 ::~G22x15y6(){ note_dtor("G22x15y6", this);} // tgen
G22x15y6 ::G22x15y6(){ note_ctor("G22x15y6", this);} // tgen

static void Test_G22x15y6()
{
  extern Class_Descriptor cd_G22x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x15y6, buf);
    G22x15y6 *dp, &lv = *(dp=new (buf) G22x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x15y6)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(32,24), "G22x15y6");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(16,12), "G22x15y6");
    check_base_class_offset(lv, (C22*)(E22x15*), ABISELECT(16,12), "G22x15y6");
    check_base_class_offset(lv, (D0*)(E22x15*), ABISELECT(36,28), "G22x15y6");
    check_base_class_offset(lv, (E22x15*), 0, "G22x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G22x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x15y6.ff");
    test_class_info(&lv, &cd_G22x15y6);
    dp->~G22x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x15y6(Test_G22x15y6, "G22x15y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G22x15y6C1Ev();
extern void _ZN8G22x15y6D1Ev();
Name_Map name_map_G22x15y6[] = {
  NSPAIR(_ZN8G22x15y6C1Ev),
  NSPAIR(_ZN8G22x15y6D1Ev),
  {0,0}
};
extern Class_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_E22x15;
extern VTBL_ENTRY _ZTI6E22x15[];
extern  VTBL_ENTRY _ZTV6E22x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x15y6[] = {
  // 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
    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(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_E22x15,    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 _ZTI8G22x15y6[];
extern void _ZN6E22x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv)();
extern void ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn12_N6E22x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G22x15y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x15y6[0]),
  (VTBL_ENTRY)&_ZN6E22x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G22x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv),
};
extern VTBL_ENTRY _ZTV8G22x15y6[];
extern void _ZN6E22x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x15__8G22x15y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x15[0]),
  (VTBL_ENTRY)&_ZN6E22x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv)();
extern void ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn12_N6E22x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C22__6E22x15__8G22x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E22x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__8G22x15y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x15y6[] = {
  {&(_ZTV8G22x15y6[6]),  6,12},
  {&(_tg__ZTV6E22x15__8G22x15y6[5]),  5,6},
  {&(_tg__ZTV3C22__6E22x15__8G22x15y6[4]),  4,5},
  {&(_ZTV8G22x15y6[11]),  11,12},
  {&(_tg__ZTV3C22__8G22x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x15y6[];
extern  VTBL_ENTRY _ZTV8G22x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x15y6[];
static VTBL_ENTRY alt_thunk_names681[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn12_N6E22x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn12_N6E22x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G22x15y6 = {  "G22x15y6", // class name
  bases_G22x15y6, 6,
  &(vtc_G22x15y6[0]), // expected_vtbl_contents
  &(vtt_G22x15y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G22x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x15y6),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x15y6),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names681,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x15y7  : virtual E22x15 , virtual F0 {
  int ff;
  ~G22x15y7(); // tgen
  G22x15y7(); // tgen
};
//SIG(1 G22x15y7) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G22x15y7 ::~G22x15y7(){ note_dtor("G22x15y7", this);} // tgen
G22x15y7 ::G22x15y7(){ note_ctor("G22x15y7", this);} // tgen

static void Test_G22x15y7()
{
  extern Class_Descriptor cd_G22x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G22x15y7, buf);
    G22x15y7 *dp, &lv = *(dp=new (buf) G22x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G22x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x15y7)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,28), "G22x15y7");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,16), "G22x15y7");
    check_base_class_offset(lv, (C22*)(E22x15*), ABISELECT(32,16), "G22x15y7");
    check_base_class_offset(lv, (D0*)(E22x15*), ABISELECT(52,32), "G22x15y7");
    check_base_class_offset(lv, (E22x15*), ABISELECT(16,8), "G22x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G22x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G22x15y7.ff");
    test_class_info(&lv, &cd_G22x15y7);
    dp->~G22x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x15y7(Test_G22x15y7, "G22x15y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G22x15y7C1Ev();
extern void _ZN8G22x15y7D1Ev();
Name_Map name_map_G22x15y7[] = {
  NSPAIR(_ZN8G22x15y7C1Ev),
  NSPAIR(_ZN8G22x15y7D1Ev),
  {0,0}
};
extern Class_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_E22x15;
extern VTBL_ENTRY _ZTI6E22x15[];
extern  VTBL_ENTRY _ZTV6E22x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E22x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x15y7[] = {
  // 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
    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
    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_E22x15,    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 _ZTI8G22x15y7[];
extern void _ZN6E22x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv)();
extern void ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn8_N6E22x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G22x15y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G22x15y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G22x15y7[0]),
  (VTBL_ENTRY)&_ZN6E22x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G22x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv),
};
extern VTBL_ENTRY _ZTV8G22x15y7[];
extern void _ZN6E22x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E22x15__8G22x15y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E22x15[0]),
  (VTBL_ENTRY)&_ZN6E22x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv)();
extern void ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn8_N6E22x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C22__6E22x15__8G22x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E22x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__8G22x15y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x15y7[] = {
  {&(_ZTV8G22x15y7[7]),  7,19},
  {&(_ZTV8G22x15y7[13]),  13,19},
  {&(_ZTV8G22x15y7[18]),  18,19},
  {&(_tg__ZTV6E22x15__8G22x15y7[5]),  5,6},
  {&(_tg__ZTV3C22__6E22x15__8G22x15y7[4]),  4,5},
  {&(_tg__ZTV3C22__8G22x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G22x15y7[];
extern  VTBL_ENTRY _ZTV8G22x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G22x15y7[];
static VTBL_ENTRY alt_thunk_names682[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E22x153fooEv,_ZTv0_n16_N6E22x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn8_N6E22x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E22x153fooEv,_ZThn8_N6E22x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G22x15y7 = {  "G22x15y7", // class name
  bases_G22x15y7, 6,
  &(vtc_G22x15y7[0]), // expected_vtbl_contents
  &(vtt_G22x15y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G22x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G22x15y7),19, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G22x15y7),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names682,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E23x15  : virtual C23 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E23x153fooEv
  ~E23x15(); // tgen
  E23x15(); // tgen
};
//SIG(-1 E23x15) C1{ VBC2{ VBC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E23x15 ::foo(){vfunc_called(this, "_ZN6E23x153fooEv");}
E23x15 ::~E23x15(){ note_dtor("E23x15", this);} // tgen
E23x15 ::E23x15(){ note_ctor("E23x15", this);} // tgen

static void Test_E23x15()
{
  extern Class_Descriptor cd_E23x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E23x15, buf);
    E23x15 *dp, &lv = *(dp=new (buf) E23x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E23x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E23x15)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(32,20), "E23x15");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(16,8), "E23x15");
    check_base_class_offset(lv, (C23*), ABISELECT(16,8), "E23x15");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E23x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E23x15.fd");
    test_class_info(&lv, &cd_E23x15);
    dp->~E23x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE23x15(Test_E23x15, "E23x15", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E23x15C1Ev();
extern void _ZN6E23x15D1Ev();
Name_Map name_map_E23x15[] = {
  NSPAIR(_ZN6E23x15C1Ev),
  NSPAIR(_ZN6E23x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x15[] = {
  // 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(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
    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_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 _ZTI6E23x15[];
extern void _ZN6E23x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv)();
extern void ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn8_N6E23x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv)();
extern void ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E23x15[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&_ZN6E23x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv),
};
extern VTBL_ENTRY _ZTV6E23x15[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__6E23x15[] = {
  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__6E23x15[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_E23x15[] = {
  {&(_ZTV6E23x15[5]),  5,15},
  {&(_ZTV6E23x15[10]),  10,15},
  {&(_ZTV6E23x15[14]),  14,15},
  {&(_tg__ZTV3C23__6E23x15[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__6E23x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E23x15[];
extern  VTBL_ENTRY _ZTV6E23x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x15[];
static VTBL_ENTRY alt_thunk_names683[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn8_N6E23x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E23x15 = {  "E23x15", // class name
  bases_E23x15, 4,
  &(vtc_E23x15[0]), // expected_vtbl_contents
  &(vtt_E23x15[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E23x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E23x15),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E23x15),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names683,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x15y0  : E23x15 , F1 {
  int ff;
  ~G23x15y0(); // tgen
  G23x15y0(); // tgen
};
//SIG(1 G23x15y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G23x15y0 ::~G23x15y0(){ note_dtor("G23x15y0", this);} // tgen
G23x15y0 ::G23x15y0(){ note_ctor("G23x15y0", this);} // tgen

static void Test_G23x15y0()
{
  extern Class_Descriptor cd_G23x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G23x15y0, buf);
    G23x15y0 *dp, &lv = *(dp=new (buf) G23x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G23x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x15y0)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,32), "G23x15y0");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,20), "G23x15y0");
    check_base_class_offset(lv, (C23*)(E23x15*), ABISELECT(32,20), "G23x15y0");
    check_base_class_offset(lv, (D0*)(E23x15*), ABISELECT(60,40), "G23x15y0");
    check_base_class_offset(lv, (E23x15*), 0, "G23x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G23x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G23x15y0.ff");
    test_class_info(&lv, &cd_G23x15y0);
    dp->~G23x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x15y0(Test_G23x15y0, "G23x15y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G23x15y0C1Ev();
extern void _ZN8G23x15y0D1Ev();
Name_Map name_map_G23x15y0[] = {
  NSPAIR(_ZN8G23x15y0C1Ev),
  NSPAIR(_ZN8G23x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x15;
extern VTBL_ENTRY _ZTI6E23x15[];
extern  VTBL_ENTRY _ZTV6E23x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x15y0[] = {
  // 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_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
    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
    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_E23x15,    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
    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 _ZTI8G23x15y0[];
extern void _ZN6E23x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv)();
extern void ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv)();
extern void ABISELECT(_ZThn48_N6E23x153fooEv,_ZThn32_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x15y0[0]),
  (VTBL_ENTRY)&_ZN6E23x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G23x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G23x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G23x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv),
};
extern VTBL_ENTRY _ZTV8G23x15y0[];
extern void _ZN6E23x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x15__8G23x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&_ZN6E23x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv)();
extern void ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C23__6E23x15__8G23x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv)();
extern void ABISELECT(_ZThn48_N6E23x153fooEv,_ZThn32_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x15__8G23x15y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__8G23x15y0[] = {
  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__8G23x15y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x15y0[] = {
  {&(_ZTV8G23x15y0[5]),  5,18},
  {&(_tg__ZTV6E23x15__8G23x15y0[5]),  5,6},
  {&(_tg__ZTV3C23__6E23x15__8G23x15y0[4]),  4,5},
  {&(_tg__ZTV2A1__6E23x15__8G23x15y0[3]),  3,4},
  {&(_ZTV8G23x15y0[13]),  13,18},
  {&(_ZTV8G23x15y0[17]),  17,18},
  {&(_tg__ZTV3C23__8G23x15y0[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__8G23x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x15y0[];
extern  VTBL_ENTRY _ZTV8G23x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x15y0[];
static VTBL_ENTRY alt_thunk_names684[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E23x153fooEv,_ZThn32_N6E23x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E23x153fooEv,_ZThn32_N6E23x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x15y0 = {  "G23x15y0", // class name
  bases_G23x15y0, 6,
  &(vtc_G23x15y0[0]), // expected_vtbl_contents
  &(vtt_G23x15y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G23x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x15y0),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x15y0),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names684,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x15y1  : virtual E23x15 , F1 {
  int ff;
  ~G23x15y1(); // tgen
  G23x15y1(); // tgen
};
//SIG(1 G23x15y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G23x15y1 ::~G23x15y1(){ note_dtor("G23x15y1", this);} // tgen
G23x15y1 ::G23x15y1(){ note_ctor("G23x15y1", this);} // tgen

static void Test_G23x15y1()
{
  extern Class_Descriptor cd_G23x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G23x15y1, buf);
    G23x15y1 *dp, &lv = *(dp=new (buf) G23x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G23x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x15y1)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,32), "G23x15y1");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,20), "G23x15y1");
    check_base_class_offset(lv, (C23*)(E23x15*), ABISELECT(32,20), "G23x15y1");
    check_base_class_offset(lv, (D0*)(E23x15*), ABISELECT(60,40), "G23x15y1");
    check_base_class_offset(lv, (E23x15*), ABISELECT(16,12), "G23x15y1");
    check_base_class_offset(lv, (F1*), 0, "G23x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x15y1.ff");
    test_class_info(&lv, &cd_G23x15y1);
    dp->~G23x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x15y1(Test_G23x15y1, "G23x15y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G23x15y1C1Ev();
extern void _ZN8G23x15y1D1Ev();
Name_Map name_map_G23x15y1[] = {
  NSPAIR(_ZN8G23x15y1C1Ev),
  NSPAIR(_ZN8G23x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x15;
extern VTBL_ENTRY _ZTI6E23x15[];
extern  VTBL_ENTRY _ZTV6E23x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x15y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    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_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
    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
    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_E23x15,    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 _ZTI8G23x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E23x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv)();
extern void ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn8_N6E23x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv)();
extern void ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x15y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G23x15y1[0]),
  (VTBL_ENTRY)&_ZN6E23x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G23x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G23x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv),
};
extern VTBL_ENTRY _ZTV8G23x15y1[];
extern void _ZN6E23x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x15__8G23x15y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&_ZN6E23x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv)();
extern void ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn8_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C23__6E23x15__8G23x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv)();
extern void ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x15__8G23x15y1[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__8G23x15y1[] = {
  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__8G23x15y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x15y1[] = {
  {&(_ZTV8G23x15y1[6]),  6,23},
  {&(_ZTV8G23x15y1[13]),  13,23},
  {&(_ZTV8G23x15y1[18]),  18,23},
  {&(_ZTV8G23x15y1[22]),  22,23},
  {&(_tg__ZTV6E23x15__8G23x15y1[5]),  5,6},
  {&(_tg__ZTV3C23__6E23x15__8G23x15y1[4]),  4,5},
  {&(_tg__ZTV2A1__6E23x15__8G23x15y1[3]),  3,4},
  {&(_tg__ZTV3C23__8G23x15y1[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__8G23x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x15y1[];
extern  VTBL_ENTRY _ZTV8G23x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x15y1[];
static VTBL_ENTRY alt_thunk_names685[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn8_N6E23x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn8_N6E23x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x15y1 = {  "G23x15y1", // class name
  bases_G23x15y1, 6,
  &(vtc_G23x15y1[0]), // expected_vtbl_contents
  &(vtt_G23x15y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G23x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x15y1),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x15y1),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names685,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x15y2  : E23x15 , virtual F1 {
  int ff;
  ~G23x15y2(); // tgen
  G23x15y2(); // tgen
};
//SIG(1 G23x15y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G23x15y2 ::~G23x15y2(){ note_dtor("G23x15y2", this);} // tgen
G23x15y2 ::G23x15y2(){ note_ctor("G23x15y2", this);} // tgen

static void Test_G23x15y2()
{
  extern Class_Descriptor cd_G23x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G23x15y2, buf);
    G23x15y2 *dp, &lv = *(dp=new (buf) G23x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G23x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x15y2)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(32,24), "G23x15y2");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(16,12), "G23x15y2");
    check_base_class_offset(lv, (C23*)(E23x15*), ABISELECT(16,12), "G23x15y2");
    check_base_class_offset(lv, (D0*)(E23x15*), ABISELECT(44,32), "G23x15y2");
    check_base_class_offset(lv, (E23x15*), 0, "G23x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G23x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x15y2.ff");
    test_class_info(&lv, &cd_G23x15y2);
    dp->~G23x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x15y2(Test_G23x15y2, "G23x15y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G23x15y2C1Ev();
extern void _ZN8G23x15y2D1Ev();
Name_Map name_map_G23x15y2[] = {
  NSPAIR(_ZN8G23x15y2C1Ev),
  NSPAIR(_ZN8G23x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x15;
extern VTBL_ENTRY _ZTI6E23x15[];
extern  VTBL_ENTRY _ZTV6E23x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x15y2[] = {
  // 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)
    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
    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
    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_E23x15,    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
    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI8G23x15y2[];
extern void _ZN6E23x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv)();
extern void ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn12_N6E23x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv)();
extern void ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn24_N6E23x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G23x15y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x15y2[0]),
  (VTBL_ENTRY)&_ZN6E23x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G23x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G23x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G23x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G23x15y2[];
extern void _ZN6E23x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x15__8G23x15y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&_ZN6E23x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv)();
extern void ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn12_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C23__6E23x15__8G23x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv)();
extern void ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn24_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x15__8G23x15y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__8G23x15y2[] = {
  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__8G23x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x15y2[] = {
  {&(_ZTV8G23x15y2[6]),  6,20},
  {&(_tg__ZTV6E23x15__8G23x15y2[5]),  5,6},
  {&(_tg__ZTV3C23__6E23x15__8G23x15y2[4]),  4,5},
  {&(_tg__ZTV2A1__6E23x15__8G23x15y2[3]),  3,4},
  {&(_ZTV8G23x15y2[11]),  11,20},
  {&(_ZTV8G23x15y2[15]),  15,20},
  {&(_ZTV8G23x15y2[19]),  19,20},
  {&(_tg__ZTV3C23__8G23x15y2[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__8G23x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x15y2[];
extern  VTBL_ENTRY _ZTV8G23x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x15y2[];
static VTBL_ENTRY alt_thunk_names686[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn24_N6E23x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn24_N6E23x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn12_N6E23x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn12_N6E23x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x15y2 = {  "G23x15y2", // class name
  bases_G23x15y2, 6,
  &(vtc_G23x15y2[0]), // expected_vtbl_contents
  &(vtt_G23x15y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G23x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x15y2),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x15y2),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names686,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x15y3  : virtual E23x15 , virtual F1 {
  int ff;
  ~G23x15y3(); // tgen
  G23x15y3(); // tgen
};
//SIG(1 G23x15y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G23x15y3 ::~G23x15y3(){ note_dtor("G23x15y3", this);} // tgen
G23x15y3 ::G23x15y3(){ note_ctor("G23x15y3", this);} // tgen

static void Test_G23x15y3()
{
  extern Class_Descriptor cd_G23x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G23x15y3, buf);
    G23x15y3 *dp, &lv = *(dp=new (buf) G23x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G23x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x15y3)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,28), "G23x15y3");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,16), "G23x15y3");
    check_base_class_offset(lv, (C23*)(E23x15*), ABISELECT(32,16), "G23x15y3");
    check_base_class_offset(lv, (D0*)(E23x15*), ABISELECT(60,36), "G23x15y3");
    check_base_class_offset(lv, (E23x15*), ABISELECT(16,8), "G23x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G23x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G23x15y3.ff");
    test_class_info(&lv, &cd_G23x15y3);
    dp->~G23x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x15y3(Test_G23x15y3, "G23x15y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G23x15y3C1Ev();
extern void _ZN8G23x15y3D1Ev();
Name_Map name_map_G23x15y3[] = {
  NSPAIR(_ZN8G23x15y3C1Ev),
  NSPAIR(_ZN8G23x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x15;
extern VTBL_ENTRY _ZTI6E23x15[];
extern  VTBL_ENTRY _ZTV6E23x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x15y3[] = {
  // 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(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
    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
    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_E23x15,    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
    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
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI8G23x15y3[];
extern void _ZN6E23x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv)();
extern void ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn8_N6E23x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv)();
extern void ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G23x15y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x15y3[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G23x15y3[0]),
  (VTBL_ENTRY)&_ZN6E23x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G23x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G23x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G23x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G23x15y3[];
extern void _ZN6E23x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x15__8G23x15y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&_ZN6E23x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv)();
extern void ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn8_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C23__6E23x15__8G23x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv)();
extern void ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x15__8G23x15y3[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__8G23x15y3[] = {
  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__8G23x15y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x15y3[] = {
  {&(_ZTV8G23x15y3[7]),  7,27},
  {&(_ZTV8G23x15y3[13]),  13,27},
  {&(_ZTV8G23x15y3[18]),  18,27},
  {&(_ZTV8G23x15y3[22]),  22,27},
  {&(_ZTV8G23x15y3[26]),  26,27},
  {&(_tg__ZTV6E23x15__8G23x15y3[5]),  5,6},
  {&(_tg__ZTV3C23__6E23x15__8G23x15y3[4]),  4,5},
  {&(_tg__ZTV2A1__6E23x15__8G23x15y3[3]),  3,4},
  {&(_tg__ZTV3C23__8G23x15y3[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__8G23x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x15y3[];
extern  VTBL_ENTRY _ZTV8G23x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x15y3[];
static VTBL_ENTRY alt_thunk_names687[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn8_N6E23x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn8_N6E23x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x15y3 = {  "G23x15y3", // class name
  bases_G23x15y3, 6,
  &(vtc_G23x15y3[0]), // expected_vtbl_contents
  &(vtt_G23x15y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G23x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x15y3),27, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x15y3),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names687,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x15y4  : E23x15 , F0 {
  int ff;
  ~G23x15y4(); // tgen
  G23x15y4(); // tgen
};
//SIG(1 G23x15y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G23x15y4 ::~G23x15y4(){ note_dtor("G23x15y4", this);} // tgen
G23x15y4 ::G23x15y4(){ note_ctor("G23x15y4", this);} // tgen

static void Test_G23x15y4()
{
  extern Class_Descriptor cd_G23x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x15y4, buf);
    G23x15y4 *dp, &lv = *(dp=new (buf) G23x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x15y4)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(40,28), "G23x15y4");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(24,16), "G23x15y4");
    check_base_class_offset(lv, (C23*)(E23x15*), ABISELECT(24,16), "G23x15y4");
    check_base_class_offset(lv, (D0*)(E23x15*), ABISELECT(52,36), "G23x15y4");
    check_base_class_offset(lv, (E23x15*), 0, "G23x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G23x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G23x15y4.ff");
    test_class_info(&lv, &cd_G23x15y4);
    dp->~G23x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x15y4(Test_G23x15y4, "G23x15y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G23x15y4C1Ev();
extern void _ZN8G23x15y4D1Ev();
Name_Map name_map_G23x15y4[] = {
  NSPAIR(_ZN8G23x15y4C1Ev),
  NSPAIR(_ZN8G23x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x15;
extern VTBL_ENTRY _ZTI6E23x15[];
extern  VTBL_ENTRY _ZTV6E23x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x15y4[] = {
  // 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_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
    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(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_E23x15,    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 _ZTI8G23x15y4[];
extern void _ZN6E23x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv)();
extern void ABISELECT(_ZThn24_N6E23x153fooEv,_ZThn16_N6E23x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv)();
extern void ABISELECT(_ZThn40_N6E23x153fooEv,_ZThn28_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x15y4[0]),
  (VTBL_ENTRY)&_ZN6E23x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G23x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G23x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv),
};
extern VTBL_ENTRY _ZTV8G23x15y4[];
extern void _ZN6E23x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x15__8G23x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&_ZN6E23x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv)();
extern void ABISELECT(_ZThn24_N6E23x153fooEv,_ZThn16_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C23__6E23x15__8G23x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv)();
extern void ABISELECT(_ZThn40_N6E23x153fooEv,_ZThn28_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x15__8G23x15y4[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__8G23x15y4[] = {
  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__8G23x15y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x15y4[] = {
  {&(_ZTV8G23x15y4[5]),  5,15},
  {&(_tg__ZTV6E23x15__8G23x15y4[5]),  5,6},
  {&(_tg__ZTV3C23__6E23x15__8G23x15y4[4]),  4,5},
  {&(_tg__ZTV2A1__6E23x15__8G23x15y4[3]),  3,4},
  {&(_ZTV8G23x15y4[10]),  10,15},
  {&(_ZTV8G23x15y4[14]),  14,15},
  {&(_tg__ZTV3C23__8G23x15y4[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__8G23x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x15y4[];
extern  VTBL_ENTRY _ZTV8G23x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x15y4[];
static VTBL_ENTRY alt_thunk_names688[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E23x153fooEv,_ZThn28_N6E23x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E23x153fooEv,_ZThn28_N6E23x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x153fooEv,_ZThn16_N6E23x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E23x153fooEv,_ZThn16_N6E23x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x15y4 = {  "G23x15y4", // class name
  bases_G23x15y4, 6,
  &(vtc_G23x15y4[0]), // expected_vtbl_contents
  &(vtt_G23x15y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G23x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x15y4),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x15y4),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names688,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x15y5  : virtual E23x15 , F0 {
  int ff;
  ~G23x15y5(); // tgen
  G23x15y5(); // tgen
};
//SIG(1 G23x15y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G23x15y5 ::~G23x15y5(){ note_dtor("G23x15y5", this);} // tgen
G23x15y5 ::G23x15y5(){ note_ctor("G23x15y5", this);} // tgen

static void Test_G23x15y5()
{
  extern Class_Descriptor cd_G23x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G23x15y5, buf);
    G23x15y5 *dp, &lv = *(dp=new (buf) G23x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G23x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x15y5)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,32), "G23x15y5");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,20), "G23x15y5");
    check_base_class_offset(lv, (C23*)(E23x15*), ABISELECT(32,20), "G23x15y5");
    check_base_class_offset(lv, (D0*)(E23x15*), ABISELECT(60,40), "G23x15y5");
    check_base_class_offset(lv, (E23x15*), ABISELECT(16,12), "G23x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G23x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x15y5.ff");
    test_class_info(&lv, &cd_G23x15y5);
    dp->~G23x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x15y5(Test_G23x15y5, "G23x15y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G23x15y5C1Ev();
extern void _ZN8G23x15y5D1Ev();
Name_Map name_map_G23x15y5[] = {
  NSPAIR(_ZN8G23x15y5C1Ev),
  NSPAIR(_ZN8G23x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x15;
extern VTBL_ENTRY _ZTI6E23x15[];
extern  VTBL_ENTRY _ZTV6E23x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x15y5[] = {
  // 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(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
    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
    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_E23x15,    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 _ZTI8G23x15y5[];
extern void _ZN6E23x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv)();
extern void ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn8_N6E23x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv)();
extern void ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x15y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x15y5[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G23x15y5[0]),
  (VTBL_ENTRY)&_ZN6E23x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G23x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G23x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv),
};
extern VTBL_ENTRY _ZTV8G23x15y5[];
extern void _ZN6E23x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x15__8G23x15y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&_ZN6E23x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv)();
extern void ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn8_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C23__6E23x15__8G23x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv)();
extern void ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x15__8G23x15y5[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__8G23x15y5[] = {
  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__8G23x15y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x15y5[] = {
  {&(_ZTV8G23x15y5[6]),  6,22},
  {&(_ZTV8G23x15y5[12]),  12,22},
  {&(_ZTV8G23x15y5[17]),  17,22},
  {&(_ZTV8G23x15y5[21]),  21,22},
  {&(_tg__ZTV6E23x15__8G23x15y5[5]),  5,6},
  {&(_tg__ZTV3C23__6E23x15__8G23x15y5[4]),  4,5},
  {&(_tg__ZTV2A1__6E23x15__8G23x15y5[3]),  3,4},
  {&(_tg__ZTV3C23__8G23x15y5[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__8G23x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x15y5[];
extern  VTBL_ENTRY _ZTV8G23x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x15y5[];
static VTBL_ENTRY alt_thunk_names689[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn8_N6E23x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn8_N6E23x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x15y5 = {  "G23x15y5", // class name
  bases_G23x15y5, 6,
  &(vtc_G23x15y5[0]), // expected_vtbl_contents
  &(vtt_G23x15y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G23x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x15y5),22, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x15y5),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names689,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x15y6  : E23x15 , virtual F0 {
  int ff;
  ~G23x15y6(); // tgen
  G23x15y6(); // tgen
};
//SIG(1 G23x15y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G23x15y6 ::~G23x15y6(){ note_dtor("G23x15y6", this);} // tgen
G23x15y6 ::G23x15y6(){ note_ctor("G23x15y6", this);} // tgen

static void Test_G23x15y6()
{
  extern Class_Descriptor cd_G23x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x15y6, buf);
    G23x15y6 *dp, &lv = *(dp=new (buf) G23x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x15y6)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(32,24), "G23x15y6");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(16,12), "G23x15y6");
    check_base_class_offset(lv, (C23*)(E23x15*), ABISELECT(16,12), "G23x15y6");
    check_base_class_offset(lv, (D0*)(E23x15*), ABISELECT(44,32), "G23x15y6");
    check_base_class_offset(lv, (E23x15*), 0, "G23x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G23x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x15y6.ff");
    test_class_info(&lv, &cd_G23x15y6);
    dp->~G23x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x15y6(Test_G23x15y6, "G23x15y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G23x15y6C1Ev();
extern void _ZN8G23x15y6D1Ev();
Name_Map name_map_G23x15y6[] = {
  NSPAIR(_ZN8G23x15y6C1Ev),
  NSPAIR(_ZN8G23x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x15;
extern VTBL_ENTRY _ZTI6E23x15[];
extern  VTBL_ENTRY _ZTV6E23x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x15y6[] = {
  // 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)
    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
    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(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_E23x15,    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 _ZTI8G23x15y6[];
extern void _ZN6E23x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv)();
extern void ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn12_N6E23x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv)();
extern void ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn24_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x15y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x15y6[0]),
  (VTBL_ENTRY)&_ZN6E23x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G23x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G23x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv),
};
extern VTBL_ENTRY _ZTV8G23x15y6[];
extern void _ZN6E23x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x15__8G23x15y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&_ZN6E23x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv)();
extern void ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn12_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C23__6E23x15__8G23x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv)();
extern void ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn24_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x15__8G23x15y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__8G23x15y6[] = {
  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__8G23x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x15y6[] = {
  {&(_ZTV8G23x15y6[6]),  6,16},
  {&(_tg__ZTV6E23x15__8G23x15y6[5]),  5,6},
  {&(_tg__ZTV3C23__6E23x15__8G23x15y6[4]),  4,5},
  {&(_tg__ZTV2A1__6E23x15__8G23x15y6[3]),  3,4},
  {&(_ZTV8G23x15y6[11]),  11,16},
  {&(_ZTV8G23x15y6[15]),  15,16},
  {&(_tg__ZTV3C23__8G23x15y6[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__8G23x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x15y6[];
extern  VTBL_ENTRY _ZTV8G23x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x15y6[];
static VTBL_ENTRY alt_thunk_names690[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn24_N6E23x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn24_N6E23x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn12_N6E23x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn12_N6E23x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x15y6 = {  "G23x15y6", // class name
  bases_G23x15y6, 6,
  &(vtc_G23x15y6[0]), // expected_vtbl_contents
  &(vtt_G23x15y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G23x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x15y6),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x15y6),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names690,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x15y7  : virtual E23x15 , virtual F0 {
  int ff;
  ~G23x15y7(); // tgen
  G23x15y7(); // tgen
};
//SIG(1 G23x15y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G23x15y7 ::~G23x15y7(){ note_dtor("G23x15y7", this);} // tgen
G23x15y7 ::G23x15y7(){ note_ctor("G23x15y7", this);} // tgen

static void Test_G23x15y7()
{
  extern Class_Descriptor cd_G23x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G23x15y7, buf);
    G23x15y7 *dp, &lv = *(dp=new (buf) G23x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G23x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x15y7)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,28), "G23x15y7");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,16), "G23x15y7");
    check_base_class_offset(lv, (C23*)(E23x15*), ABISELECT(32,16), "G23x15y7");
    check_base_class_offset(lv, (D0*)(E23x15*), ABISELECT(60,36), "G23x15y7");
    check_base_class_offset(lv, (E23x15*), ABISELECT(16,8), "G23x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G23x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G23x15y7.ff");
    test_class_info(&lv, &cd_G23x15y7);
    dp->~G23x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x15y7(Test_G23x15y7, "G23x15y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G23x15y7C1Ev();
extern void _ZN8G23x15y7D1Ev();
Name_Map name_map_G23x15y7[] = {
  NSPAIR(_ZN8G23x15y7C1Ev),
  NSPAIR(_ZN8G23x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E23x15;
extern VTBL_ENTRY _ZTI6E23x15[];
extern  VTBL_ENTRY _ZTV6E23x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E23x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x15y7[] = {
  // 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(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
    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
    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_E23x15,    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 _ZTI8G23x15y7[];
extern void _ZN6E23x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv)();
extern void ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn8_N6E23x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv)();
extern void ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x15y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G23x15y7[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G23x15y7[0]),
  (VTBL_ENTRY)&_ZN6E23x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G23x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G23x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv),
};
extern VTBL_ENTRY _ZTV8G23x15y7[];
extern void _ZN6E23x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E23x15__8G23x15y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&_ZN6E23x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv)();
extern void ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn8_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C23__6E23x15__8G23x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv)();
extern void ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E23x15__8G23x15y7[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E23x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__8G23x15y7[] = {
  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__8G23x15y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x15y7[] = {
  {&(_ZTV8G23x15y7[7]),  7,23},
  {&(_ZTV8G23x15y7[13]),  13,23},
  {&(_ZTV8G23x15y7[18]),  18,23},
  {&(_ZTV8G23x15y7[22]),  22,23},
  {&(_tg__ZTV6E23x15__8G23x15y7[5]),  5,6},
  {&(_tg__ZTV3C23__6E23x15__8G23x15y7[4]),  4,5},
  {&(_tg__ZTV2A1__6E23x15__8G23x15y7[3]),  3,4},
  {&(_tg__ZTV3C23__8G23x15y7[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__8G23x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G23x15y7[];
extern  VTBL_ENTRY _ZTV8G23x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G23x15y7[];
static VTBL_ENTRY alt_thunk_names691[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E23x153fooEv,_ZTv0_n12_N6E23x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E23x153fooEv,_ZThn20_N6E23x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E23x153fooEv,_ZTv0_n16_N6E23x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn8_N6E23x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E23x153fooEv,_ZThn8_N6E23x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x15y7 = {  "G23x15y7", // class name
  bases_G23x15y7, 6,
  &(vtc_G23x15y7[0]), // expected_vtbl_contents
  &(vtt_G23x15y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G23x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G23x15y7),23, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G23x15y7),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names691,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E24x15  : virtual C24 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E24x153fooEv
  ~E24x15(); // tgen
  E24x15(); // tgen
};
//SIG(-1 E24x15) C1{ VBC2{ BC3{ Fi} VBC4{ Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E24x15 ::foo(){vfunc_called(this, "_ZN6E24x153fooEv");}
E24x15 ::~E24x15(){ note_dtor("E24x15", this);} // tgen
E24x15 ::E24x15(){ note_ctor("E24x15", this);} // tgen

static void Test_E24x15()
{
  extern Class_Descriptor cd_E24x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E24x15, buf);
    E24x15 *dp, &lv = *(dp=new (buf) E24x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E24x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E24x15)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(24,12), "E24x15");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(32,20), "E24x15");
    check_base_class_offset(lv, (C24*), ABISELECT(16,8), "E24x15");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E24x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E24x15.fd");
    test_class_info(&lv, &cd_E24x15);
    dp->~E24x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE24x15(Test_E24x15, "E24x15", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E24x15C1Ev();
extern void _ZN6E24x15D1Ev();
Name_Map name_map_E24x15[] = {
  NSPAIR(_ZN6E24x15C1Ev),
  NSPAIR(_ZN6E24x15D1Ev),
  {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_E24x15[] = {
  // 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
    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 _ZTI6E24x15[];
extern void _ZN6E24x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv)();
extern void ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn8_N6E24x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E24x15[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x15[0]),
  (VTBL_ENTRY)&_ZN6E24x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E24x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv),
};
extern VTBL_ENTRY _ZTV6E24x15[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__6E24x15[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_E24x15[] = {
  {&(_ZTV6E24x15[5]),  5,11},
  {&(_ZTV6E24x15[10]),  10,11},
  {&(_tg__ZTV3C24__6E24x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E24x15[];
extern  VTBL_ENTRY _ZTV6E24x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x15[];
static VTBL_ENTRY alt_thunk_names692[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn8_N6E24x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E24x15 = {  "E24x15", // class name
  bases_E24x15, 4,
  &(vtc_E24x15[0]), // expected_vtbl_contents
  &(vtt_E24x15[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E24x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E24x15),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E24x15),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names692,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x15y0  : E24x15 , F1 {
  int ff;
  ~G24x15y0(); // tgen
  G24x15y0(); // tgen
};
//SIG(1 G24x15y0) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G24x15y0 ::~G24x15y0(){ note_dtor("G24x15y0", this);} // tgen
G24x15y0 ::G24x15y0(){ note_ctor("G24x15y0", this);} // tgen

static void Test_G24x15y0()
{
  extern Class_Descriptor cd_G24x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G24x15y0, buf);
    G24x15y0 *dp, &lv = *(dp=new (buf) G24x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G24x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x15y0)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,24), "G24x15y0");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,32), "G24x15y0");
    check_base_class_offset(lv, (C24*)(E24x15*), ABISELECT(32,20), "G24x15y0");
    check_base_class_offset(lv, (D0*)(E24x15*), ABISELECT(52,36), "G24x15y0");
    check_base_class_offset(lv, (E24x15*), 0, "G24x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G24x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G24x15y0.ff");
    test_class_info(&lv, &cd_G24x15y0);
    dp->~G24x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x15y0(Test_G24x15y0, "G24x15y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G24x15y0C1Ev();
extern void _ZN8G24x15y0D1Ev();
Name_Map name_map_G24x15y0[] = {
  NSPAIR(_ZN8G24x15y0C1Ev),
  NSPAIR(_ZN8G24x15y0D1Ev),
  {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_E24x15;
extern VTBL_ENTRY _ZTI6E24x15[];
extern  VTBL_ENTRY _ZTV6E24x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x15y0[] = {
  // 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
    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_E24x15,    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
    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 _ZTI8G24x15y0[];
extern void _ZN6E24x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv)();
extern void ABISELECT(_ZThn32_N6E24x153fooEv,_ZThn20_N6E24x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G24x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x15y0[0]),
  (VTBL_ENTRY)&_ZN6E24x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G24x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G24x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv),
};
extern VTBL_ENTRY _ZTV8G24x15y0[];
extern void _ZN6E24x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x15__8G24x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x15[0]),
  (VTBL_ENTRY)&_ZN6E24x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv)();
extern void ABISELECT(_ZThn32_N6E24x153fooEv,_ZThn20_N6E24x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C24__6E24x15__8G24x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E24x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__8G24x15y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x15y0[] = {
  {&(_ZTV8G24x15y0[5]),  5,14},
  {&(_tg__ZTV6E24x15__8G24x15y0[5]),  5,6},
  {&(_tg__ZTV3C24__6E24x15__8G24x15y0[4]),  4,5},
  {&(_ZTV8G24x15y0[13]),  13,14},
  {&(_tg__ZTV3C24__8G24x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x15y0[];
extern  VTBL_ENTRY _ZTV8G24x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x15y0[];
static VTBL_ENTRY alt_thunk_names693[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E24x153fooEv,_ZThn20_N6E24x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E24x153fooEv,_ZThn20_N6E24x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G24x15y0 = {  "G24x15y0", // class name
  bases_G24x15y0, 6,
  &(vtc_G24x15y0[0]), // expected_vtbl_contents
  &(vtt_G24x15y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G24x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x15y0),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x15y0),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names693,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x15y1  : virtual E24x15 , F1 {
  int ff;
  ~G24x15y1(); // tgen
  G24x15y1(); // tgen
};
//SIG(1 G24x15y1) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G24x15y1 ::~G24x15y1(){ note_dtor("G24x15y1", this);} // tgen
G24x15y1 ::G24x15y1(){ note_ctor("G24x15y1", this);} // tgen

static void Test_G24x15y1()
{
  extern Class_Descriptor cd_G24x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G24x15y1, buf);
    G24x15y1 *dp, &lv = *(dp=new (buf) G24x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G24x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x15y1)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,24), "G24x15y1");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,32), "G24x15y1");
    check_base_class_offset(lv, (C24*)(E24x15*), ABISELECT(32,20), "G24x15y1");
    check_base_class_offset(lv, (D0*)(E24x15*), ABISELECT(52,36), "G24x15y1");
    check_base_class_offset(lv, (E24x15*), ABISELECT(16,12), "G24x15y1");
    check_base_class_offset(lv, (F1*), 0, "G24x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x15y1.ff");
    test_class_info(&lv, &cd_G24x15y1);
    dp->~G24x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x15y1(Test_G24x15y1, "G24x15y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G24x15y1C1Ev();
extern void _ZN8G24x15y1D1Ev();
Name_Map name_map_G24x15y1[] = {
  NSPAIR(_ZN8G24x15y1C1Ev),
  NSPAIR(_ZN8G24x15y1D1Ev),
  {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_E24x15;
extern VTBL_ENTRY _ZTI6E24x15[];
extern  VTBL_ENTRY _ZTV6E24x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x15y1[] = {
  // 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
    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_E24x15,    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_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 _ZTI8G24x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E24x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv)();
extern void ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn8_N6E24x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G24x15y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G24x15y1[0]),
  (VTBL_ENTRY)&_ZN6E24x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G24x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv),
};
extern VTBL_ENTRY _ZTV8G24x15y1[];
extern void _ZN6E24x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x15__8G24x15y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x15[0]),
  (VTBL_ENTRY)&_ZN6E24x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv)();
extern void ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn8_N6E24x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C24__6E24x15__8G24x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E24x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__8G24x15y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x15y1[] = {
  {&(_ZTV8G24x15y1[6]),  6,19},
  {&(_ZTV8G24x15y1[13]),  13,19},
  {&(_ZTV8G24x15y1[18]),  18,19},
  {&(_tg__ZTV6E24x15__8G24x15y1[5]),  5,6},
  {&(_tg__ZTV3C24__6E24x15__8G24x15y1[4]),  4,5},
  {&(_tg__ZTV3C24__8G24x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x15y1[];
extern  VTBL_ENTRY _ZTV8G24x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x15y1[];
static VTBL_ENTRY alt_thunk_names694[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn8_N6E24x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn8_N6E24x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G24x15y1 = {  "G24x15y1", // class name
  bases_G24x15y1, 6,
  &(vtc_G24x15y1[0]), // expected_vtbl_contents
  &(vtt_G24x15y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G24x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x15y1),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x15y1),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names694,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x15y2  : E24x15 , virtual F1 {
  int ff;
  ~G24x15y2(); // tgen
  G24x15y2(); // tgen
};
//SIG(1 G24x15y2) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G24x15y2 ::~G24x15y2(){ note_dtor("G24x15y2", this);} // tgen
G24x15y2 ::G24x15y2(){ note_ctor("G24x15y2", this);} // tgen

static void Test_G24x15y2()
{
  extern Class_Descriptor cd_G24x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G24x15y2, buf);
    G24x15y2 *dp, &lv = *(dp=new (buf) G24x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G24x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x15y2)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(24,16), "G24x15y2");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(32,24), "G24x15y2");
    check_base_class_offset(lv, (C24*)(E24x15*), ABISELECT(16,12), "G24x15y2");
    check_base_class_offset(lv, (D0*)(E24x15*), ABISELECT(36,28), "G24x15y2");
    check_base_class_offset(lv, (E24x15*), 0, "G24x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G24x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x15y2.ff");
    test_class_info(&lv, &cd_G24x15y2);
    dp->~G24x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x15y2(Test_G24x15y2, "G24x15y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G24x15y2C1Ev();
extern void _ZN8G24x15y2D1Ev();
Name_Map name_map_G24x15y2[] = {
  NSPAIR(_ZN8G24x15y2C1Ev),
  NSPAIR(_ZN8G24x15y2D1Ev),
  {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_E24x15;
extern VTBL_ENTRY _ZTI6E24x15[];
extern  VTBL_ENTRY _ZTV6E24x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x15y2[] = {
  // 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
    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_E24x15,    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
    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 _ZTI8G24x15y2[];
extern void _ZN6E24x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv)();
extern void ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn12_N6E24x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x15y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x15y2[0]),
  (VTBL_ENTRY)&_ZN6E24x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G24x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G24x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G24x15y2[];
extern void _ZN6E24x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x15__8G24x15y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x15[0]),
  (VTBL_ENTRY)&_ZN6E24x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv)();
extern void ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn12_N6E24x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C24__6E24x15__8G24x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E24x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__8G24x15y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x15y2[] = {
  {&(_ZTV8G24x15y2[6]),  6,16},
  {&(_tg__ZTV6E24x15__8G24x15y2[5]),  5,6},
  {&(_tg__ZTV3C24__6E24x15__8G24x15y2[4]),  4,5},
  {&(_ZTV8G24x15y2[11]),  11,16},
  {&(_ZTV8G24x15y2[15]),  15,16},
  {&(_tg__ZTV3C24__8G24x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x15y2[];
extern  VTBL_ENTRY _ZTV8G24x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x15y2[];
static VTBL_ENTRY alt_thunk_names695[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn12_N6E24x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn12_N6E24x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G24x15y2 = {  "G24x15y2", // class name
  bases_G24x15y2, 6,
  &(vtc_G24x15y2[0]), // expected_vtbl_contents
  &(vtt_G24x15y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G24x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x15y2),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x15y2),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names695,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x15y3  : virtual E24x15 , virtual F1 {
  int ff;
  ~G24x15y3(); // tgen
  G24x15y3(); // tgen
};
//SIG(1 G24x15y3) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G24x15y3 ::~G24x15y3(){ note_dtor("G24x15y3", this);} // tgen
G24x15y3 ::G24x15y3(){ note_ctor("G24x15y3", this);} // tgen

static void Test_G24x15y3()
{
  extern Class_Descriptor cd_G24x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G24x15y3, buf);
    G24x15y3 *dp, &lv = *(dp=new (buf) G24x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G24x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x15y3)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,20), "G24x15y3");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,28), "G24x15y3");
    check_base_class_offset(lv, (C24*)(E24x15*), ABISELECT(32,16), "G24x15y3");
    check_base_class_offset(lv, (D0*)(E24x15*), ABISELECT(52,32), "G24x15y3");
    check_base_class_offset(lv, (E24x15*), ABISELECT(16,8), "G24x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G24x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G24x15y3.ff");
    test_class_info(&lv, &cd_G24x15y3);
    dp->~G24x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x15y3(Test_G24x15y3, "G24x15y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G24x15y3C1Ev();
extern void _ZN8G24x15y3D1Ev();
Name_Map name_map_G24x15y3[] = {
  NSPAIR(_ZN8G24x15y3C1Ev),
  NSPAIR(_ZN8G24x15y3D1Ev),
  {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_E24x15;
extern VTBL_ENTRY _ZTI6E24x15[];
extern  VTBL_ENTRY _ZTV6E24x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x15y3[] = {
  // 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
    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_E24x15,    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
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //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
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI8G24x15y3[];
extern void _ZN6E24x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv)();
extern void ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn8_N6E24x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x15y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x15y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G24x15y3[0]),
  (VTBL_ENTRY)&_ZN6E24x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G24x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G24x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G24x15y3[];
extern void _ZN6E24x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x15__8G24x15y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x15[0]),
  (VTBL_ENTRY)&_ZN6E24x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv)();
extern void ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn8_N6E24x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C24__6E24x15__8G24x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E24x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__8G24x15y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x15y3[] = {
  {&(_ZTV8G24x15y3[7]),  7,23},
  {&(_ZTV8G24x15y3[13]),  13,23},
  {&(_ZTV8G24x15y3[18]),  18,23},
  {&(_ZTV8G24x15y3[22]),  22,23},
  {&(_tg__ZTV6E24x15__8G24x15y3[5]),  5,6},
  {&(_tg__ZTV3C24__6E24x15__8G24x15y3[4]),  4,5},
  {&(_tg__ZTV3C24__8G24x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x15y3[];
extern  VTBL_ENTRY _ZTV8G24x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x15y3[];
static VTBL_ENTRY alt_thunk_names696[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn8_N6E24x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn8_N6E24x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G24x15y3 = {  "G24x15y3", // class name
  bases_G24x15y3, 6,
  &(vtc_G24x15y3[0]), // expected_vtbl_contents
  &(vtt_G24x15y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G24x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x15y3),23, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x15y3),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names696,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x15y4  : E24x15 , F0 {
  int ff;
  ~G24x15y4(); // tgen
  G24x15y4(); // tgen
};
//SIG(1 G24x15y4) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G24x15y4 ::~G24x15y4(){ note_dtor("G24x15y4", this);} // tgen
G24x15y4 ::G24x15y4(){ note_ctor("G24x15y4", this);} // tgen

static void Test_G24x15y4()
{
  extern Class_Descriptor cd_G24x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x15y4, buf);
    G24x15y4 *dp, &lv = *(dp=new (buf) G24x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x15y4)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(32,20), "G24x15y4");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(40,28), "G24x15y4");
    check_base_class_offset(lv, (C24*)(E24x15*), ABISELECT(24,16), "G24x15y4");
    check_base_class_offset(lv, (D0*)(E24x15*), ABISELECT(44,32), "G24x15y4");
    check_base_class_offset(lv, (E24x15*), 0, "G24x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G24x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G24x15y4.ff");
    test_class_info(&lv, &cd_G24x15y4);
    dp->~G24x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x15y4(Test_G24x15y4, "G24x15y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G24x15y4C1Ev();
extern void _ZN8G24x15y4D1Ev();
Name_Map name_map_G24x15y4[] = {
  NSPAIR(_ZN8G24x15y4C1Ev),
  NSPAIR(_ZN8G24x15y4D1Ev),
  {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_E24x15;
extern VTBL_ENTRY _ZTI6E24x15[];
extern  VTBL_ENTRY _ZTV6E24x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x15y4[] = {
  // 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
    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_E24x15,    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 _ZTI8G24x15y4[];
extern void _ZN6E24x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv)();
extern void ABISELECT(_ZThn24_N6E24x153fooEv,_ZThn16_N6E24x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G24x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x15y4[0]),
  (VTBL_ENTRY)&_ZN6E24x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G24x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv),
};
extern VTBL_ENTRY _ZTV8G24x15y4[];
extern void _ZN6E24x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x15__8G24x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x15[0]),
  (VTBL_ENTRY)&_ZN6E24x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv)();
extern void ABISELECT(_ZThn24_N6E24x153fooEv,_ZThn16_N6E24x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C24__6E24x15__8G24x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E24x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__8G24x15y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x15y4[] = {
  {&(_ZTV8G24x15y4[5]),  5,11},
  {&(_tg__ZTV6E24x15__8G24x15y4[5]),  5,6},
  {&(_tg__ZTV3C24__6E24x15__8G24x15y4[4]),  4,5},
  {&(_ZTV8G24x15y4[10]),  10,11},
  {&(_tg__ZTV3C24__8G24x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x15y4[];
extern  VTBL_ENTRY _ZTV8G24x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x15y4[];
static VTBL_ENTRY alt_thunk_names697[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E24x153fooEv,_ZThn16_N6E24x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E24x153fooEv,_ZThn16_N6E24x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G24x15y4 = {  "G24x15y4", // class name
  bases_G24x15y4, 6,
  &(vtc_G24x15y4[0]), // expected_vtbl_contents
  &(vtt_G24x15y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G24x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x15y4),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x15y4),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names697,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x15y5  : virtual E24x15 , F0 {
  int ff;
  ~G24x15y5(); // tgen
  G24x15y5(); // tgen
};
//SIG(1 G24x15y5) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G24x15y5 ::~G24x15y5(){ note_dtor("G24x15y5", this);} // tgen
G24x15y5 ::G24x15y5(){ note_ctor("G24x15y5", this);} // tgen

static void Test_G24x15y5()
{
  extern Class_Descriptor cd_G24x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G24x15y5, buf);
    G24x15y5 *dp, &lv = *(dp=new (buf) G24x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G24x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x15y5)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,24), "G24x15y5");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,32), "G24x15y5");
    check_base_class_offset(lv, (C24*)(E24x15*), ABISELECT(32,20), "G24x15y5");
    check_base_class_offset(lv, (D0*)(E24x15*), ABISELECT(52,36), "G24x15y5");
    check_base_class_offset(lv, (E24x15*), ABISELECT(16,12), "G24x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G24x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x15y5.ff");
    test_class_info(&lv, &cd_G24x15y5);
    dp->~G24x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x15y5(Test_G24x15y5, "G24x15y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G24x15y5C1Ev();
extern void _ZN8G24x15y5D1Ev();
Name_Map name_map_G24x15y5[] = {
  NSPAIR(_ZN8G24x15y5C1Ev),
  NSPAIR(_ZN8G24x15y5D1Ev),
  {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_E24x15;
extern VTBL_ENTRY _ZTI6E24x15[];
extern  VTBL_ENTRY _ZTV6E24x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x15y5[] = {
  // 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
    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_E24x15,    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
    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 _ZTI8G24x15y5[];
extern void _ZN6E24x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv)();
extern void ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn8_N6E24x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G24x15y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x15y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G24x15y5[0]),
  (VTBL_ENTRY)&_ZN6E24x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G24x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv),
};
extern VTBL_ENTRY _ZTV8G24x15y5[];
extern void _ZN6E24x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x15__8G24x15y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x15[0]),
  (VTBL_ENTRY)&_ZN6E24x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv)();
extern void ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn8_N6E24x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C24__6E24x15__8G24x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E24x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__8G24x15y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x15y5[] = {
  {&(_ZTV8G24x15y5[6]),  6,18},
  {&(_ZTV8G24x15y5[12]),  12,18},
  {&(_ZTV8G24x15y5[17]),  17,18},
  {&(_tg__ZTV6E24x15__8G24x15y5[5]),  5,6},
  {&(_tg__ZTV3C24__6E24x15__8G24x15y5[4]),  4,5},
  {&(_tg__ZTV3C24__8G24x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x15y5[];
extern  VTBL_ENTRY _ZTV8G24x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x15y5[];
static VTBL_ENTRY alt_thunk_names698[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn8_N6E24x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn8_N6E24x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G24x15y5 = {  "G24x15y5", // class name
  bases_G24x15y5, 6,
  &(vtc_G24x15y5[0]), // expected_vtbl_contents
  &(vtt_G24x15y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G24x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x15y5),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x15y5),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names698,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x15y6  : E24x15 , virtual F0 {
  int ff;
  ~G24x15y6(); // tgen
  G24x15y6(); // tgen
};
//SIG(1 G24x15y6) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G24x15y6 ::~G24x15y6(){ note_dtor("G24x15y6", this);} // tgen
G24x15y6 ::G24x15y6(){ note_ctor("G24x15y6", this);} // tgen

static void Test_G24x15y6()
{
  extern Class_Descriptor cd_G24x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x15y6, buf);
    G24x15y6 *dp, &lv = *(dp=new (buf) G24x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x15y6)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(24,16), "G24x15y6");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(32,24), "G24x15y6");
    check_base_class_offset(lv, (C24*)(E24x15*), ABISELECT(16,12), "G24x15y6");
    check_base_class_offset(lv, (D0*)(E24x15*), ABISELECT(36,28), "G24x15y6");
    check_base_class_offset(lv, (E24x15*), 0, "G24x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G24x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x15y6.ff");
    test_class_info(&lv, &cd_G24x15y6);
    dp->~G24x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x15y6(Test_G24x15y6, "G24x15y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G24x15y6C1Ev();
extern void _ZN8G24x15y6D1Ev();
Name_Map name_map_G24x15y6[] = {
  NSPAIR(_ZN8G24x15y6C1Ev),
  NSPAIR(_ZN8G24x15y6D1Ev),
  {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_E24x15;
extern VTBL_ENTRY _ZTI6E24x15[];
extern  VTBL_ENTRY _ZTV6E24x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x15y6[] = {
  // 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
    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_E24x15,    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 _ZTI8G24x15y6[];
extern void _ZN6E24x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv)();
extern void ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn12_N6E24x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G24x15y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x15y6[0]),
  (VTBL_ENTRY)&_ZN6E24x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G24x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv),
};
extern VTBL_ENTRY _ZTV8G24x15y6[];
extern void _ZN6E24x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x15__8G24x15y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x15[0]),
  (VTBL_ENTRY)&_ZN6E24x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv)();
extern void ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn12_N6E24x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C24__6E24x15__8G24x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E24x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__8G24x15y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x15y6[] = {
  {&(_ZTV8G24x15y6[6]),  6,12},
  {&(_tg__ZTV6E24x15__8G24x15y6[5]),  5,6},
  {&(_tg__ZTV3C24__6E24x15__8G24x15y6[4]),  4,5},
  {&(_ZTV8G24x15y6[11]),  11,12},
  {&(_tg__ZTV3C24__8G24x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x15y6[];
extern  VTBL_ENTRY _ZTV8G24x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x15y6[];
static VTBL_ENTRY alt_thunk_names699[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn12_N6E24x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn12_N6E24x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G24x15y6 = {  "G24x15y6", // class name
  bases_G24x15y6, 6,
  &(vtc_G24x15y6[0]), // expected_vtbl_contents
  &(vtt_G24x15y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G24x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x15y6),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x15y6),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names699,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x15y7  : virtual E24x15 , virtual F0 {
  int ff;
  ~G24x15y7(); // tgen
  G24x15y7(); // tgen
};
//SIG(1 G24x15y7) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G24x15y7 ::~G24x15y7(){ note_dtor("G24x15y7", this);} // tgen
G24x15y7 ::G24x15y7(){ note_ctor("G24x15y7", this);} // tgen

static void Test_G24x15y7()
{
  extern Class_Descriptor cd_G24x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G24x15y7, buf);
    G24x15y7 *dp, &lv = *(dp=new (buf) G24x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G24x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x15y7)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,20), "G24x15y7");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,28), "G24x15y7");
    check_base_class_offset(lv, (C24*)(E24x15*), ABISELECT(32,16), "G24x15y7");
    check_base_class_offset(lv, (D0*)(E24x15*), ABISELECT(52,32), "G24x15y7");
    check_base_class_offset(lv, (E24x15*), ABISELECT(16,8), "G24x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G24x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G24x15y7.ff");
    test_class_info(&lv, &cd_G24x15y7);
    dp->~G24x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x15y7(Test_G24x15y7, "G24x15y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G24x15y7C1Ev();
extern void _ZN8G24x15y7D1Ev();
Name_Map name_map_G24x15y7[] = {
  NSPAIR(_ZN8G24x15y7C1Ev),
  NSPAIR(_ZN8G24x15y7D1Ev),
  {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_E24x15;
extern VTBL_ENTRY _ZTI6E24x15[];
extern  VTBL_ENTRY _ZTV6E24x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E24x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x15y7[] = {
  // 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
    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_E24x15,    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_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 _ZTI8G24x15y7[];
extern void _ZN6E24x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv)();
extern void ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn8_N6E24x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G24x15y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G24x15y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G24x15y7[0]),
  (VTBL_ENTRY)&_ZN6E24x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G24x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv),
};
extern VTBL_ENTRY _ZTV8G24x15y7[];
extern void _ZN6E24x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E24x15__8G24x15y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E24x15[0]),
  (VTBL_ENTRY)&_ZN6E24x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv)();
extern void ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn8_N6E24x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C24__6E24x15__8G24x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E24x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__8G24x15y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x15y7[] = {
  {&(_ZTV8G24x15y7[7]),  7,19},
  {&(_ZTV8G24x15y7[13]),  13,19},
  {&(_ZTV8G24x15y7[18]),  18,19},
  {&(_tg__ZTV6E24x15__8G24x15y7[5]),  5,6},
  {&(_tg__ZTV3C24__6E24x15__8G24x15y7[4]),  4,5},
  {&(_tg__ZTV3C24__8G24x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G24x15y7[];
extern  VTBL_ENTRY _ZTV8G24x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G24x15y7[];
static VTBL_ENTRY alt_thunk_names700[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E24x153fooEv,_ZTv0_n16_N6E24x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn8_N6E24x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E24x153fooEv,_ZThn8_N6E24x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G24x15y7 = {  "G24x15y7", // class name
  bases_G24x15y7, 6,
  &(vtc_G24x15y7[0]), // expected_vtbl_contents
  &(vtt_G24x15y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G24x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G24x15y7),19, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G24x15y7),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names700,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E25x15  : virtual C25 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E25x153fooEv
  ~E25x15(); // tgen
  E25x15(); // tgen
};
//SIG(-1 E25x15) C1{ VBC2{ BC3{ v1 Fi} VBC4{ Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E25x15 ::foo(){vfunc_called(this, "_ZN6E25x153fooEv");}
E25x15 ::~E25x15(){ note_dtor("E25x15", this);} // tgen
E25x15 ::E25x15(){ note_ctor("E25x15", this);} // tgen

static void Test_E25x15()
{
  extern Class_Descriptor cd_E25x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E25x15, buf);
    E25x15 *dp, &lv = *(dp=new (buf) E25x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E25x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E25x15)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(16,8), "E25x15");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(32,20), "E25x15");
    check_base_class_offset(lv, (C25*), ABISELECT(16,8), "E25x15");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E25x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E25x15.fd");
    test_class_info(&lv, &cd_E25x15);
    dp->~E25x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE25x15(Test_E25x15, "E25x15", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E25x15C1Ev();
extern void _ZN6E25x15D1Ev();
Name_Map name_map_E25x15[] = {
  NSPAIR(_ZN6E25x15C1Ev),
  NSPAIR(_ZN6E25x15D1Ev),
  {0,0}
};
extern Class_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_E25x15[] = {
  // 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
    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_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 _ZTI6E25x15[];
extern void _ZN6E25x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv)();
extern void ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn8_N6E25x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E25x15[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x15[0]),
  (VTBL_ENTRY)&_ZN6E25x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E25x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv),
};
extern VTBL_ENTRY _ZTV6E25x15[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__6E25x15[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_E25x15[] = {
  {&(_ZTV6E25x15[5]),  5,11},
  {&(_ZTV6E25x15[10]),  10,11},
  {&(_tg__ZTV3C25__6E25x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E25x15[];
extern  VTBL_ENTRY _ZTV6E25x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x15[];
static VTBL_ENTRY alt_thunk_names701[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn8_N6E25x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E25x15 = {  "E25x15", // class name
  bases_E25x15, 4,
  &(vtc_E25x15[0]), // expected_vtbl_contents
  &(vtt_E25x15[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E25x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E25x15),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E25x15),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names701,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x15y0  : E25x15 , F1 {
  int ff;
  ~G25x15y0(); // tgen
  G25x15y0(); // tgen
};
//SIG(1 G25x15y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G25x15y0 ::~G25x15y0(){ note_dtor("G25x15y0", this);} // tgen
G25x15y0 ::G25x15y0(){ note_ctor("G25x15y0", this);} // tgen

static void Test_G25x15y0()
{
  extern Class_Descriptor cd_G25x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G25x15y0, buf);
    G25x15y0 *dp, &lv = *(dp=new (buf) G25x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G25x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x15y0)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,20), "G25x15y0");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,32), "G25x15y0");
    check_base_class_offset(lv, (C25*)(E25x15*), ABISELECT(32,20), "G25x15y0");
    check_base_class_offset(lv, (D0*)(E25x15*), ABISELECT(52,36), "G25x15y0");
    check_base_class_offset(lv, (E25x15*), 0, "G25x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G25x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G25x15y0.ff");
    test_class_info(&lv, &cd_G25x15y0);
    dp->~G25x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x15y0(Test_G25x15y0, "G25x15y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G25x15y0C1Ev();
extern void _ZN8G25x15y0D1Ev();
Name_Map name_map_G25x15y0[] = {
  NSPAIR(_ZN8G25x15y0C1Ev),
  NSPAIR(_ZN8G25x15y0D1Ev),
  {0,0}
};
extern Class_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_E25x15;
extern VTBL_ENTRY _ZTI6E25x15[];
extern  VTBL_ENTRY _ZTV6E25x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x15y0[] = {
  // 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
    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
    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_E25x15,    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
    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 _ZTI8G25x15y0[];
extern void _ZN6E25x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv)();
extern void ABISELECT(_ZThn32_N6E25x153fooEv,_ZThn20_N6E25x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G25x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x15y0[0]),
  (VTBL_ENTRY)&_ZN6E25x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G25x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G25x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv),
};
extern VTBL_ENTRY _ZTV8G25x15y0[];
extern void _ZN6E25x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x15__8G25x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x15[0]),
  (VTBL_ENTRY)&_ZN6E25x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv)();
extern void ABISELECT(_ZThn32_N6E25x153fooEv,_ZThn20_N6E25x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C25__6E25x15__8G25x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E25x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__8G25x15y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x15y0[] = {
  {&(_ZTV8G25x15y0[5]),  5,14},
  {&(_tg__ZTV6E25x15__8G25x15y0[5]),  5,6},
  {&(_tg__ZTV3C25__6E25x15__8G25x15y0[4]),  4,5},
  {&(_ZTV8G25x15y0[13]),  13,14},
  {&(_tg__ZTV3C25__8G25x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x15y0[];
extern  VTBL_ENTRY _ZTV8G25x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x15y0[];
static VTBL_ENTRY alt_thunk_names702[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E25x153fooEv,_ZThn20_N6E25x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E25x153fooEv,_ZThn20_N6E25x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G25x15y0 = {  "G25x15y0", // class name
  bases_G25x15y0, 6,
  &(vtc_G25x15y0[0]), // expected_vtbl_contents
  &(vtt_G25x15y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G25x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x15y0),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x15y0),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names702,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x15y1  : virtual E25x15 , F1 {
  int ff;
  ~G25x15y1(); // tgen
  G25x15y1(); // tgen
};
//SIG(1 G25x15y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G25x15y1 ::~G25x15y1(){ note_dtor("G25x15y1", this);} // tgen
G25x15y1 ::G25x15y1(){ note_ctor("G25x15y1", this);} // tgen

static void Test_G25x15y1()
{
  extern Class_Descriptor cd_G25x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G25x15y1, buf);
    G25x15y1 *dp, &lv = *(dp=new (buf) G25x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G25x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x15y1)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,20), "G25x15y1");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,32), "G25x15y1");
    check_base_class_offset(lv, (C25*)(E25x15*), ABISELECT(32,20), "G25x15y1");
    check_base_class_offset(lv, (D0*)(E25x15*), ABISELECT(52,36), "G25x15y1");
    check_base_class_offset(lv, (E25x15*), ABISELECT(16,12), "G25x15y1");
    check_base_class_offset(lv, (F1*), 0, "G25x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x15y1.ff");
    test_class_info(&lv, &cd_G25x15y1);
    dp->~G25x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x15y1(Test_G25x15y1, "G25x15y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G25x15y1C1Ev();
extern void _ZN8G25x15y1D1Ev();
Name_Map name_map_G25x15y1[] = {
  NSPAIR(_ZN8G25x15y1C1Ev),
  NSPAIR(_ZN8G25x15y1D1Ev),
  {0,0}
};
extern Class_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_E25x15;
extern VTBL_ENTRY _ZTI6E25x15[];
extern  VTBL_ENTRY _ZTV6E25x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x15y1[] = {
  // 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
    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
    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_E25x15,    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 _ZTI8G25x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E25x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv)();
extern void ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn8_N6E25x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G25x15y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G25x15y1[0]),
  (VTBL_ENTRY)&_ZN6E25x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G25x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv),
};
extern VTBL_ENTRY _ZTV8G25x15y1[];
extern void _ZN6E25x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x15__8G25x15y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x15[0]),
  (VTBL_ENTRY)&_ZN6E25x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv)();
extern void ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn8_N6E25x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C25__6E25x15__8G25x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E25x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__8G25x15y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x15y1[] = {
  {&(_ZTV8G25x15y1[6]),  6,19},
  {&(_ZTV8G25x15y1[13]),  13,19},
  {&(_ZTV8G25x15y1[18]),  18,19},
  {&(_tg__ZTV6E25x15__8G25x15y1[5]),  5,6},
  {&(_tg__ZTV3C25__6E25x15__8G25x15y1[4]),  4,5},
  {&(_tg__ZTV3C25__8G25x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x15y1[];
extern  VTBL_ENTRY _ZTV8G25x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x15y1[];
static VTBL_ENTRY alt_thunk_names703[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn8_N6E25x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn8_N6E25x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G25x15y1 = {  "G25x15y1", // class name
  bases_G25x15y1, 6,
  &(vtc_G25x15y1[0]), // expected_vtbl_contents
  &(vtt_G25x15y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G25x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x15y1),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x15y1),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names703,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x15y2  : E25x15 , virtual F1 {
  int ff;
  ~G25x15y2(); // tgen
  G25x15y2(); // tgen
};
//SIG(1 G25x15y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G25x15y2 ::~G25x15y2(){ note_dtor("G25x15y2", this);} // tgen
G25x15y2 ::G25x15y2(){ note_ctor("G25x15y2", this);} // tgen

static void Test_G25x15y2()
{
  extern Class_Descriptor cd_G25x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G25x15y2, buf);
    G25x15y2 *dp, &lv = *(dp=new (buf) G25x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G25x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x15y2)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(16,12), "G25x15y2");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(32,24), "G25x15y2");
    check_base_class_offset(lv, (C25*)(E25x15*), ABISELECT(16,12), "G25x15y2");
    check_base_class_offset(lv, (D0*)(E25x15*), ABISELECT(36,28), "G25x15y2");
    check_base_class_offset(lv, (E25x15*), 0, "G25x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G25x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x15y2.ff");
    test_class_info(&lv, &cd_G25x15y2);
    dp->~G25x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x15y2(Test_G25x15y2, "G25x15y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G25x15y2C1Ev();
extern void _ZN8G25x15y2D1Ev();
Name_Map name_map_G25x15y2[] = {
  NSPAIR(_ZN8G25x15y2C1Ev),
  NSPAIR(_ZN8G25x15y2D1Ev),
  {0,0}
};
extern Class_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_E25x15;
extern VTBL_ENTRY _ZTI6E25x15[];
extern  VTBL_ENTRY _ZTV6E25x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x15y2[] = {
  // 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
    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
    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_E25x15,    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
    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
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI8G25x15y2[];
extern void _ZN6E25x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv)();
extern void ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn12_N6E25x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x15y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x15y2[0]),
  (VTBL_ENTRY)&_ZN6E25x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G25x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G25x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G25x15y2[];
extern void _ZN6E25x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x15__8G25x15y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x15[0]),
  (VTBL_ENTRY)&_ZN6E25x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv)();
extern void ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn12_N6E25x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C25__6E25x15__8G25x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E25x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__8G25x15y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x15y2[] = {
  {&(_ZTV8G25x15y2[6]),  6,16},
  {&(_tg__ZTV6E25x15__8G25x15y2[5]),  5,6},
  {&(_tg__ZTV3C25__6E25x15__8G25x15y2[4]),  4,5},
  {&(_ZTV8G25x15y2[11]),  11,16},
  {&(_ZTV8G25x15y2[15]),  15,16},
  {&(_tg__ZTV3C25__8G25x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x15y2[];
extern  VTBL_ENTRY _ZTV8G25x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x15y2[];
static VTBL_ENTRY alt_thunk_names704[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn12_N6E25x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn12_N6E25x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G25x15y2 = {  "G25x15y2", // class name
  bases_G25x15y2, 6,
  &(vtc_G25x15y2[0]), // expected_vtbl_contents
  &(vtt_G25x15y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G25x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x15y2),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x15y2),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names704,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x15y3  : virtual E25x15 , virtual F1 {
  int ff;
  ~G25x15y3(); // tgen
  G25x15y3(); // tgen
};
//SIG(1 G25x15y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G25x15y3 ::~G25x15y3(){ note_dtor("G25x15y3", this);} // tgen
G25x15y3 ::G25x15y3(){ note_ctor("G25x15y3", this);} // tgen

static void Test_G25x15y3()
{
  extern Class_Descriptor cd_G25x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G25x15y3, buf);
    G25x15y3 *dp, &lv = *(dp=new (buf) G25x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G25x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x15y3)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,16), "G25x15y3");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,28), "G25x15y3");
    check_base_class_offset(lv, (C25*)(E25x15*), ABISELECT(32,16), "G25x15y3");
    check_base_class_offset(lv, (D0*)(E25x15*), ABISELECT(52,32), "G25x15y3");
    check_base_class_offset(lv, (E25x15*), ABISELECT(16,8), "G25x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G25x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G25x15y3.ff");
    test_class_info(&lv, &cd_G25x15y3);
    dp->~G25x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x15y3(Test_G25x15y3, "G25x15y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G25x15y3C1Ev();
extern void _ZN8G25x15y3D1Ev();
Name_Map name_map_G25x15y3[] = {
  NSPAIR(_ZN8G25x15y3C1Ev),
  NSPAIR(_ZN8G25x15y3D1Ev),
  {0,0}
};
extern Class_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_E25x15;
extern VTBL_ENTRY _ZTI6E25x15[];
extern  VTBL_ENTRY _ZTV6E25x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x15y3[] = {
  // 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
    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
    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_E25x15,    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
    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI8G25x15y3[];
extern void _ZN6E25x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv)();
extern void ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn8_N6E25x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x15y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x15y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G25x15y3[0]),
  (VTBL_ENTRY)&_ZN6E25x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G25x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G25x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G25x15y3[];
extern void _ZN6E25x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x15__8G25x15y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x15[0]),
  (VTBL_ENTRY)&_ZN6E25x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv)();
extern void ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn8_N6E25x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C25__6E25x15__8G25x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E25x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__8G25x15y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x15y3[] = {
  {&(_ZTV8G25x15y3[7]),  7,23},
  {&(_ZTV8G25x15y3[13]),  13,23},
  {&(_ZTV8G25x15y3[18]),  18,23},
  {&(_ZTV8G25x15y3[22]),  22,23},
  {&(_tg__ZTV6E25x15__8G25x15y3[5]),  5,6},
  {&(_tg__ZTV3C25__6E25x15__8G25x15y3[4]),  4,5},
  {&(_tg__ZTV3C25__8G25x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x15y3[];
extern  VTBL_ENTRY _ZTV8G25x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x15y3[];
static VTBL_ENTRY alt_thunk_names705[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn8_N6E25x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn8_N6E25x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G25x15y3 = {  "G25x15y3", // class name
  bases_G25x15y3, 6,
  &(vtc_G25x15y3[0]), // expected_vtbl_contents
  &(vtt_G25x15y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G25x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x15y3),23, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x15y3),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names705,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x15y4  : E25x15 , F0 {
  int ff;
  ~G25x15y4(); // tgen
  G25x15y4(); // tgen
};
//SIG(1 G25x15y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G25x15y4 ::~G25x15y4(){ note_dtor("G25x15y4", this);} // tgen
G25x15y4 ::G25x15y4(){ note_ctor("G25x15y4", this);} // tgen

static void Test_G25x15y4()
{
  extern Class_Descriptor cd_G25x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x15y4, buf);
    G25x15y4 *dp, &lv = *(dp=new (buf) G25x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x15y4)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(24,16), "G25x15y4");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(40,28), "G25x15y4");
    check_base_class_offset(lv, (C25*)(E25x15*), ABISELECT(24,16), "G25x15y4");
    check_base_class_offset(lv, (D0*)(E25x15*), ABISELECT(44,32), "G25x15y4");
    check_base_class_offset(lv, (E25x15*), 0, "G25x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G25x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G25x15y4.ff");
    test_class_info(&lv, &cd_G25x15y4);
    dp->~G25x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x15y4(Test_G25x15y4, "G25x15y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G25x15y4C1Ev();
extern void _ZN8G25x15y4D1Ev();
Name_Map name_map_G25x15y4[] = {
  NSPAIR(_ZN8G25x15y4C1Ev),
  NSPAIR(_ZN8G25x15y4D1Ev),
  {0,0}
};
extern Class_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_E25x15;
extern VTBL_ENTRY _ZTI6E25x15[];
extern  VTBL_ENTRY _ZTV6E25x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x15y4[] = {
  // 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
    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(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_E25x15,    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 _ZTI8G25x15y4[];
extern void _ZN6E25x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv)();
extern void ABISELECT(_ZThn24_N6E25x153fooEv,_ZThn16_N6E25x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G25x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x15y4[0]),
  (VTBL_ENTRY)&_ZN6E25x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G25x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv),
};
extern VTBL_ENTRY _ZTV8G25x15y4[];
extern void _ZN6E25x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x15__8G25x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x15[0]),
  (VTBL_ENTRY)&_ZN6E25x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv)();
extern void ABISELECT(_ZThn24_N6E25x153fooEv,_ZThn16_N6E25x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C25__6E25x15__8G25x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E25x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__8G25x15y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x15y4[] = {
  {&(_ZTV8G25x15y4[5]),  5,11},
  {&(_tg__ZTV6E25x15__8G25x15y4[5]),  5,6},
  {&(_tg__ZTV3C25__6E25x15__8G25x15y4[4]),  4,5},
  {&(_ZTV8G25x15y4[10]),  10,11},
  {&(_tg__ZTV3C25__8G25x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x15y4[];
extern  VTBL_ENTRY _ZTV8G25x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x15y4[];
static VTBL_ENTRY alt_thunk_names706[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E25x153fooEv,_ZThn16_N6E25x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E25x153fooEv,_ZThn16_N6E25x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G25x15y4 = {  "G25x15y4", // class name
  bases_G25x15y4, 6,
  &(vtc_G25x15y4[0]), // expected_vtbl_contents
  &(vtt_G25x15y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G25x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x15y4),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x15y4),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names706,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x15y5  : virtual E25x15 , F0 {
  int ff;
  ~G25x15y5(); // tgen
  G25x15y5(); // tgen
};
//SIG(1 G25x15y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G25x15y5 ::~G25x15y5(){ note_dtor("G25x15y5", this);} // tgen
G25x15y5 ::G25x15y5(){ note_ctor("G25x15y5", this);} // tgen

static void Test_G25x15y5()
{
  extern Class_Descriptor cd_G25x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G25x15y5, buf);
    G25x15y5 *dp, &lv = *(dp=new (buf) G25x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G25x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x15y5)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,20), "G25x15y5");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,32), "G25x15y5");
    check_base_class_offset(lv, (C25*)(E25x15*), ABISELECT(32,20), "G25x15y5");
    check_base_class_offset(lv, (D0*)(E25x15*), ABISELECT(52,36), "G25x15y5");
    check_base_class_offset(lv, (E25x15*), ABISELECT(16,12), "G25x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G25x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x15y5.ff");
    test_class_info(&lv, &cd_G25x15y5);
    dp->~G25x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x15y5(Test_G25x15y5, "G25x15y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G25x15y5C1Ev();
extern void _ZN8G25x15y5D1Ev();
Name_Map name_map_G25x15y5[] = {
  NSPAIR(_ZN8G25x15y5C1Ev),
  NSPAIR(_ZN8G25x15y5D1Ev),
  {0,0}
};
extern Class_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_E25x15;
extern VTBL_ENTRY _ZTI6E25x15[];
extern  VTBL_ENTRY _ZTV6E25x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x15y5[] = {
  // 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
    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
    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_E25x15,    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 _ZTI8G25x15y5[];
extern void _ZN6E25x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv)();
extern void ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn8_N6E25x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G25x15y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x15y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G25x15y5[0]),
  (VTBL_ENTRY)&_ZN6E25x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G25x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv),
};
extern VTBL_ENTRY _ZTV8G25x15y5[];
extern void _ZN6E25x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x15__8G25x15y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x15[0]),
  (VTBL_ENTRY)&_ZN6E25x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv)();
extern void ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn8_N6E25x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C25__6E25x15__8G25x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E25x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__8G25x15y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x15y5[] = {
  {&(_ZTV8G25x15y5[6]),  6,18},
  {&(_ZTV8G25x15y5[12]),  12,18},
  {&(_ZTV8G25x15y5[17]),  17,18},
  {&(_tg__ZTV6E25x15__8G25x15y5[5]),  5,6},
  {&(_tg__ZTV3C25__6E25x15__8G25x15y5[4]),  4,5},
  {&(_tg__ZTV3C25__8G25x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x15y5[];
extern  VTBL_ENTRY _ZTV8G25x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x15y5[];
static VTBL_ENTRY alt_thunk_names707[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn8_N6E25x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn8_N6E25x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G25x15y5 = {  "G25x15y5", // class name
  bases_G25x15y5, 6,
  &(vtc_G25x15y5[0]), // expected_vtbl_contents
  &(vtt_G25x15y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G25x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x15y5),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x15y5),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names707,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x15y6  : E25x15 , virtual F0 {
  int ff;
  ~G25x15y6(); // tgen
  G25x15y6(); // tgen
};
//SIG(1 G25x15y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G25x15y6 ::~G25x15y6(){ note_dtor("G25x15y6", this);} // tgen
G25x15y6 ::G25x15y6(){ note_ctor("G25x15y6", this);} // tgen

static void Test_G25x15y6()
{
  extern Class_Descriptor cd_G25x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x15y6, buf);
    G25x15y6 *dp, &lv = *(dp=new (buf) G25x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x15y6)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(16,12), "G25x15y6");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(32,24), "G25x15y6");
    check_base_class_offset(lv, (C25*)(E25x15*), ABISELECT(16,12), "G25x15y6");
    check_base_class_offset(lv, (D0*)(E25x15*), ABISELECT(36,28), "G25x15y6");
    check_base_class_offset(lv, (E25x15*), 0, "G25x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G25x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x15y6.ff");
    test_class_info(&lv, &cd_G25x15y6);
    dp->~G25x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x15y6(Test_G25x15y6, "G25x15y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G25x15y6C1Ev();
extern void _ZN8G25x15y6D1Ev();
Name_Map name_map_G25x15y6[] = {
  NSPAIR(_ZN8G25x15y6C1Ev),
  NSPAIR(_ZN8G25x15y6D1Ev),
  {0,0}
};
extern Class_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_E25x15;
extern VTBL_ENTRY _ZTI6E25x15[];
extern  VTBL_ENTRY _ZTV6E25x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x15y6[] = {
  // 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
    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(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_E25x15,    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 _ZTI8G25x15y6[];
extern void _ZN6E25x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv)();
extern void ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn12_N6E25x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G25x15y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x15y6[0]),
  (VTBL_ENTRY)&_ZN6E25x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G25x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv),
};
extern VTBL_ENTRY _ZTV8G25x15y6[];
extern void _ZN6E25x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x15__8G25x15y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x15[0]),
  (VTBL_ENTRY)&_ZN6E25x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv)();
extern void ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn12_N6E25x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C25__6E25x15__8G25x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E25x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__8G25x15y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x15y6[] = {
  {&(_ZTV8G25x15y6[6]),  6,12},
  {&(_tg__ZTV6E25x15__8G25x15y6[5]),  5,6},
  {&(_tg__ZTV3C25__6E25x15__8G25x15y6[4]),  4,5},
  {&(_ZTV8G25x15y6[11]),  11,12},
  {&(_tg__ZTV3C25__8G25x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x15y6[];
extern  VTBL_ENTRY _ZTV8G25x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x15y6[];
static VTBL_ENTRY alt_thunk_names708[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn12_N6E25x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn12_N6E25x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G25x15y6 = {  "G25x15y6", // class name
  bases_G25x15y6, 6,
  &(vtc_G25x15y6[0]), // expected_vtbl_contents
  &(vtt_G25x15y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G25x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x15y6),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x15y6),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names708,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x15y7  : virtual E25x15 , virtual F0 {
  int ff;
  ~G25x15y7(); // tgen
  G25x15y7(); // tgen
};
//SIG(1 G25x15y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G25x15y7 ::~G25x15y7(){ note_dtor("G25x15y7", this);} // tgen
G25x15y7 ::G25x15y7(){ note_ctor("G25x15y7", this);} // tgen

static void Test_G25x15y7()
{
  extern Class_Descriptor cd_G25x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G25x15y7, buf);
    G25x15y7 *dp, &lv = *(dp=new (buf) G25x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G25x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x15y7)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,16), "G25x15y7");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,28), "G25x15y7");
    check_base_class_offset(lv, (C25*)(E25x15*), ABISELECT(32,16), "G25x15y7");
    check_base_class_offset(lv, (D0*)(E25x15*), ABISELECT(52,32), "G25x15y7");
    check_base_class_offset(lv, (E25x15*), ABISELECT(16,8), "G25x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G25x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G25x15y7.ff");
    test_class_info(&lv, &cd_G25x15y7);
    dp->~G25x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x15y7(Test_G25x15y7, "G25x15y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G25x15y7C1Ev();
extern void _ZN8G25x15y7D1Ev();
Name_Map name_map_G25x15y7[] = {
  NSPAIR(_ZN8G25x15y7C1Ev),
  NSPAIR(_ZN8G25x15y7D1Ev),
  {0,0}
};
extern Class_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_E25x15;
extern VTBL_ENTRY _ZTI6E25x15[];
extern  VTBL_ENTRY _ZTV6E25x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E25x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x15y7[] = {
  // 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
    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
    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_E25x15,    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 _ZTI8G25x15y7[];
extern void _ZN6E25x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv)();
extern void ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn8_N6E25x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G25x15y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G25x15y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G25x15y7[0]),
  (VTBL_ENTRY)&_ZN6E25x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G25x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv),
};
extern VTBL_ENTRY _ZTV8G25x15y7[];
extern void _ZN6E25x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E25x15__8G25x15y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E25x15[0]),
  (VTBL_ENTRY)&_ZN6E25x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv)();
extern void ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn8_N6E25x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C25__6E25x15__8G25x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E25x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__8G25x15y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x15y7[] = {
  {&(_ZTV8G25x15y7[7]),  7,19},
  {&(_ZTV8G25x15y7[13]),  13,19},
  {&(_ZTV8G25x15y7[18]),  18,19},
  {&(_tg__ZTV6E25x15__8G25x15y7[5]),  5,6},
  {&(_tg__ZTV3C25__6E25x15__8G25x15y7[4]),  4,5},
  {&(_tg__ZTV3C25__8G25x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G25x15y7[];
extern  VTBL_ENTRY _ZTV8G25x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G25x15y7[];
static VTBL_ENTRY alt_thunk_names709[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E25x153fooEv,_ZTv0_n16_N6E25x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn8_N6E25x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E25x153fooEv,_ZThn8_N6E25x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G25x15y7 = {  "G25x15y7", // class name
  bases_G25x15y7, 6,
  &(vtc_G25x15y7[0]), // expected_vtbl_contents
  &(vtt_G25x15y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G25x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G25x15y7),19, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G25x15y7),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names709,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E26x15  : virtual C26 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E26x153fooEv
  ~E26x15(); // tgen
  E26x15(); // tgen
};
//SIG(-1 E26x15) C1{ VBC2{ VBC3{ Fi} VBC4{ Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E26x15 ::foo(){vfunc_called(this, "_ZN6E26x153fooEv");}
E26x15 ::~E26x15(){ note_dtor("E26x15", this);} // tgen
E26x15 ::E26x15(){ note_ctor("E26x15", this);} // tgen

static void Test_E26x15()
{
  extern Class_Descriptor cd_E26x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E26x15, buf);
    E26x15 *dp, &lv = *(dp=new (buf) E26x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E26x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E26x15)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(28,16), "E26x15");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(32,20), "E26x15");
    check_base_class_offset(lv, (C26*), ABISELECT(16,8), "E26x15");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E26x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E26x15.fd");
    test_class_info(&lv, &cd_E26x15);
    dp->~E26x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE26x15(Test_E26x15, "E26x15", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN6E26x15C1Ev();
extern void _ZN6E26x15D1Ev();
Name_Map name_map_E26x15[] = {
  NSPAIR(_ZN6E26x15C1Ev),
  NSPAIR(_ZN6E26x15D1Ev),
  {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_E26x15[] = {
  // 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
    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
    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 _ZTI6E26x15[];
extern void _ZN6E26x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv)();
extern void ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn8_N6E26x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E26x15[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x15[0]),
  (VTBL_ENTRY)&_ZN6E26x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E26x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv),
};
extern VTBL_ENTRY _ZTV6E26x15[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__6E26x15[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_E26x15[] = {
  {&(_ZTV6E26x15[6]),  6,13},
  {&(_ZTV6E26x15[12]),  12,13},
  {&(_tg__ZTV3C26__6E26x15[4]),  4,5},
};
extern VTBL_ENTRY _ZTI6E26x15[];
extern  VTBL_ENTRY _ZTV6E26x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x15[];
static VTBL_ENTRY alt_thunk_names710[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn8_N6E26x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E26x15 = {  "E26x15", // class name
  bases_E26x15, 4,
  &(vtc_E26x15[0]), // expected_vtbl_contents
  &(vtt_E26x15[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI6E26x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E26x15),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E26x15),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names710,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x15y0  : E26x15 , F1 {
  int ff;
  ~G26x15y0(); // tgen
  G26x15y0(); // tgen
};
//SIG(1 G26x15y0) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G26x15y0 ::~G26x15y0(){ note_dtor("G26x15y0", this);} // tgen
G26x15y0 ::G26x15y0(){ note_ctor("G26x15y0", this);} // tgen

static void Test_G26x15y0()
{
  extern Class_Descriptor cd_G26x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G26x15y0, buf);
    G26x15y0 *dp, &lv = *(dp=new (buf) G26x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G26x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x15y0)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,28), "G26x15y0");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,32), "G26x15y0");
    check_base_class_offset(lv, (C26*)(E26x15*), ABISELECT(32,20), "G26x15y0");
    check_base_class_offset(lv, (D0*)(E26x15*), ABISELECT(52,36), "G26x15y0");
    check_base_class_offset(lv, (E26x15*), 0, "G26x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G26x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G26x15y0.ff");
    test_class_info(&lv, &cd_G26x15y0);
    dp->~G26x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x15y0(Test_G26x15y0, "G26x15y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G26x15y0C1Ev();
extern void _ZN8G26x15y0D1Ev();
Name_Map name_map_G26x15y0[] = {
  NSPAIR(_ZN8G26x15y0C1Ev),
  NSPAIR(_ZN8G26x15y0D1Ev),
  {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_E26x15;
extern VTBL_ENTRY _ZTI6E26x15[];
extern  VTBL_ENTRY _ZTV6E26x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x15y0[] = {
  // 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
    10, //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_E26x15,    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
    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
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8G26x15y0[];
extern void _ZN6E26x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv)();
extern void ABISELECT(_ZThn32_N6E26x153fooEv,_ZThn20_N6E26x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G26x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x15y0[0]),
  (VTBL_ENTRY)&_ZN6E26x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G26x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G26x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv),
};
extern VTBL_ENTRY _ZTV8G26x15y0[];
extern void _ZN6E26x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x15__8G26x15y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x15[0]),
  (VTBL_ENTRY)&_ZN6E26x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv)();
extern void ABISELECT(_ZThn32_N6E26x153fooEv,_ZThn20_N6E26x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C26__6E26x15__8G26x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E26x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__8G26x15y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x15y0[] = {
  {&(_ZTV8G26x15y0[6]),  6,16},
  {&(_tg__ZTV6E26x15__8G26x15y0[6]),  6,7},
  {&(_tg__ZTV3C26__6E26x15__8G26x15y0[5]),  5,6},
  {&(_ZTV8G26x15y0[15]),  15,16},
  {&(_tg__ZTV3C26__8G26x15y0[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x15y0[];
extern  VTBL_ENTRY _ZTV8G26x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x15y0[];
static VTBL_ENTRY alt_thunk_names711[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E26x153fooEv,_ZThn20_N6E26x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E26x153fooEv,_ZThn20_N6E26x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G26x15y0 = {  "G26x15y0", // class name
  bases_G26x15y0, 6,
  &(vtc_G26x15y0[0]), // expected_vtbl_contents
  &(vtt_G26x15y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G26x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x15y0),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x15y0),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names711,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x15y1  : virtual E26x15 , F1 {
  int ff;
  ~G26x15y1(); // tgen
  G26x15y1(); // tgen
};
//SIG(1 G26x15y1) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G26x15y1 ::~G26x15y1(){ note_dtor("G26x15y1", this);} // tgen
G26x15y1 ::G26x15y1(){ note_ctor("G26x15y1", this);} // tgen

static void Test_G26x15y1()
{
  extern Class_Descriptor cd_G26x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G26x15y1, buf);
    G26x15y1 *dp, &lv = *(dp=new (buf) G26x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G26x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x15y1)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,28), "G26x15y1");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,32), "G26x15y1");
    check_base_class_offset(lv, (C26*)(E26x15*), ABISELECT(32,20), "G26x15y1");
    check_base_class_offset(lv, (D0*)(E26x15*), ABISELECT(52,36), "G26x15y1");
    check_base_class_offset(lv, (E26x15*), ABISELECT(16,12), "G26x15y1");
    check_base_class_offset(lv, (F1*), 0, "G26x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x15y1.ff");
    test_class_info(&lv, &cd_G26x15y1);
    dp->~G26x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x15y1(Test_G26x15y1, "G26x15y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G26x15y1C1Ev();
extern void _ZN8G26x15y1D1Ev();
Name_Map name_map_G26x15y1[] = {
  NSPAIR(_ZN8G26x15y1C1Ev),
  NSPAIR(_ZN8G26x15y1D1Ev),
  {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_E26x15;
extern VTBL_ENTRY _ZTI6E26x15[];
extern  VTBL_ENTRY _ZTV6E26x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x15y1[] = {
  // 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
    16, //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_E26x15,    ABISELECT(16,12), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G26x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E26x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv)();
extern void ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn8_N6E26x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G26x15y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G26x15y1[0]),
  (VTBL_ENTRY)&_ZN6E26x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G26x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv),
};
extern VTBL_ENTRY _ZTV8G26x15y1[];
extern void _ZN6E26x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x15__8G26x15y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x15[0]),
  (VTBL_ENTRY)&_ZN6E26x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv)();
extern void ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn8_N6E26x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C26__6E26x15__8G26x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E26x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__8G26x15y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x15y1[] = {
  {&(_ZTV8G26x15y1[7]),  7,22},
  {&(_ZTV8G26x15y1[15]),  15,22},
  {&(_ZTV8G26x15y1[21]),  21,22},
  {&(_tg__ZTV6E26x15__8G26x15y1[6]),  6,7},
  {&(_tg__ZTV3C26__6E26x15__8G26x15y1[5]),  5,6},
  {&(_tg__ZTV3C26__8G26x15y1[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x15y1[];
extern  VTBL_ENTRY _ZTV8G26x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x15y1[];
static VTBL_ENTRY alt_thunk_names712[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn8_N6E26x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn8_N6E26x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G26x15y1 = {  "G26x15y1", // class name
  bases_G26x15y1, 6,
  &(vtc_G26x15y1[0]), // expected_vtbl_contents
  &(vtt_G26x15y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G26x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x15y1),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x15y1),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names712,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x15y2  : E26x15 , virtual F1 {
  int ff;
  ~G26x15y2(); // tgen
  G26x15y2(); // tgen
};
//SIG(1 G26x15y2) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G26x15y2 ::~G26x15y2(){ note_dtor("G26x15y2", this);} // tgen
G26x15y2 ::G26x15y2(){ note_ctor("G26x15y2", this);} // tgen

static void Test_G26x15y2()
{
  extern Class_Descriptor cd_G26x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G26x15y2, buf);
    G26x15y2 *dp, &lv = *(dp=new (buf) G26x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G26x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x15y2)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(28,20), "G26x15y2");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(32,24), "G26x15y2");
    check_base_class_offset(lv, (C26*)(E26x15*), ABISELECT(16,12), "G26x15y2");
    check_base_class_offset(lv, (D0*)(E26x15*), ABISELECT(36,28), "G26x15y2");
    check_base_class_offset(lv, (E26x15*), 0, "G26x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G26x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x15y2.ff");
    test_class_info(&lv, &cd_G26x15y2);
    dp->~G26x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x15y2(Test_G26x15y2, "G26x15y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G26x15y2C1Ev();
extern void _ZN8G26x15y2D1Ev();
Name_Map name_map_G26x15y2[] = {
  NSPAIR(_ZN8G26x15y2C1Ev),
  NSPAIR(_ZN8G26x15y2D1Ev),
  {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_E26x15;
extern VTBL_ENTRY _ZTI6E26x15[];
extern  VTBL_ENTRY _ZTV6E26x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x15y2[] = {
  // 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
    8, //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_E26x15,    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
    14, //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 _ZTI8G26x15y2[];
extern void _ZN6E26x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv)();
extern void ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn12_N6E26x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x15y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x15y2[0]),
  (VTBL_ENTRY)&_ZN6E26x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G26x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI8G26x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G26x15y2[];
extern void _ZN6E26x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x15__8G26x15y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x15[0]),
  (VTBL_ENTRY)&_ZN6E26x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv)();
extern void ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn12_N6E26x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C26__6E26x15__8G26x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E26x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__8G26x15y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x15y2[] = {
  {&(_ZTV8G26x15y2[7]),  7,18},
  {&(_tg__ZTV6E26x15__8G26x15y2[6]),  6,7},
  {&(_tg__ZTV3C26__6E26x15__8G26x15y2[5]),  5,6},
  {&(_ZTV8G26x15y2[13]),  13,18},
  {&(_ZTV8G26x15y2[17]),  17,18},
  {&(_tg__ZTV3C26__8G26x15y2[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x15y2[];
extern  VTBL_ENTRY _ZTV8G26x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x15y2[];
static VTBL_ENTRY alt_thunk_names713[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn12_N6E26x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn12_N6E26x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G26x15y2 = {  "G26x15y2", // class name
  bases_G26x15y2, 6,
  &(vtc_G26x15y2[0]), // expected_vtbl_contents
  &(vtt_G26x15y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G26x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x15y2),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x15y2),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names713,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x15y3  : virtual E26x15 , virtual F1 {
  int ff;
  ~G26x15y3(); // tgen
  G26x15y3(); // tgen
};
//SIG(1 G26x15y3) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G26x15y3 ::~G26x15y3(){ note_dtor("G26x15y3", this);} // tgen
G26x15y3 ::G26x15y3(){ note_ctor("G26x15y3", this);} // tgen

static void Test_G26x15y3()
{
  extern Class_Descriptor cd_G26x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G26x15y3, buf);
    G26x15y3 *dp, &lv = *(dp=new (buf) G26x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G26x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x15y3)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,24), "G26x15y3");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,28), "G26x15y3");
    check_base_class_offset(lv, (C26*)(E26x15*), ABISELECT(32,16), "G26x15y3");
    check_base_class_offset(lv, (D0*)(E26x15*), ABISELECT(52,32), "G26x15y3");
    check_base_class_offset(lv, (E26x15*), ABISELECT(16,8), "G26x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G26x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G26x15y3.ff");
    test_class_info(&lv, &cd_G26x15y3);
    dp->~G26x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x15y3(Test_G26x15y3, "G26x15y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G26x15y3C1Ev();
extern void _ZN8G26x15y3D1Ev();
Name_Map name_map_G26x15y3[] = {
  NSPAIR(_ZN8G26x15y3C1Ev),
  NSPAIR(_ZN8G26x15y3D1Ev),
  {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_E26x15;
extern VTBL_ENTRY _ZTI6E26x15[];
extern  VTBL_ENTRY _ZTV6E26x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x15y3[] = {
  // 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
    16, //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_E26x15,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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
    22, //bcp->virtual_function_table_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 _ZTI8G26x15y3[];
extern void _ZN6E26x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv)();
extern void ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn8_N6E26x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x15y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x15y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G26x15y3[0]),
  (VTBL_ENTRY)&_ZN6E26x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G26x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G26x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G26x15y3[];
extern void _ZN6E26x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x15__8G26x15y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x15[0]),
  (VTBL_ENTRY)&_ZN6E26x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv)();
extern void ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn8_N6E26x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C26__6E26x15__8G26x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E26x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__8G26x15y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x15y3[] = {
  {&(_ZTV8G26x15y3[8]),  8,26},
  {&(_ZTV8G26x15y3[15]),  15,26},
  {&(_ZTV8G26x15y3[21]),  21,26},
  {&(_ZTV8G26x15y3[25]),  25,26},
  {&(_tg__ZTV6E26x15__8G26x15y3[6]),  6,7},
  {&(_tg__ZTV3C26__6E26x15__8G26x15y3[5]),  5,6},
  {&(_tg__ZTV3C26__8G26x15y3[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x15y3[];
extern  VTBL_ENTRY _ZTV8G26x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x15y3[];
static VTBL_ENTRY alt_thunk_names714[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn8_N6E26x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn8_N6E26x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G26x15y3 = {  "G26x15y3", // class name
  bases_G26x15y3, 6,
  &(vtc_G26x15y3[0]), // expected_vtbl_contents
  &(vtt_G26x15y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G26x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x15y3),26, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x15y3),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names714,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x15y4  : E26x15 , F0 {
  int ff;
  ~G26x15y4(); // tgen
  G26x15y4(); // tgen
};
//SIG(1 G26x15y4) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G26x15y4 ::~G26x15y4(){ note_dtor("G26x15y4", this);} // tgen
G26x15y4 ::G26x15y4(){ note_ctor("G26x15y4", this);} // tgen

static void Test_G26x15y4()
{
  extern Class_Descriptor cd_G26x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x15y4, buf);
    G26x15y4 *dp, &lv = *(dp=new (buf) G26x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x15y4)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(36,24), "G26x15y4");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(40,28), "G26x15y4");
    check_base_class_offset(lv, (C26*)(E26x15*), ABISELECT(24,16), "G26x15y4");
    check_base_class_offset(lv, (D0*)(E26x15*), ABISELECT(44,32), "G26x15y4");
    check_base_class_offset(lv, (E26x15*), 0, "G26x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G26x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G26x15y4.ff");
    test_class_info(&lv, &cd_G26x15y4);
    dp->~G26x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x15y4(Test_G26x15y4, "G26x15y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G26x15y4C1Ev();
extern void _ZN8G26x15y4D1Ev();
Name_Map name_map_G26x15y4[] = {
  NSPAIR(_ZN8G26x15y4C1Ev),
  NSPAIR(_ZN8G26x15y4D1Ev),
  {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_E26x15;
extern VTBL_ENTRY _ZTI6E26x15[];
extern  VTBL_ENTRY _ZTV6E26x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x15y4[] = {
  // 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
    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(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_E26x15,    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 _ZTI8G26x15y4[];
extern void _ZN6E26x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv)();
extern void ABISELECT(_ZThn24_N6E26x153fooEv,_ZThn16_N6E26x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G26x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x15y4[0]),
  (VTBL_ENTRY)&_ZN6E26x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G26x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv),
};
extern VTBL_ENTRY _ZTV8G26x15y4[];
extern void _ZN6E26x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x15__8G26x15y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x15[0]),
  (VTBL_ENTRY)&_ZN6E26x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv)();
extern void ABISELECT(_ZThn24_N6E26x153fooEv,_ZThn16_N6E26x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C26__6E26x15__8G26x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E26x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__8G26x15y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x15y4[] = {
  {&(_ZTV8G26x15y4[6]),  6,13},
  {&(_tg__ZTV6E26x15__8G26x15y4[6]),  6,7},
  {&(_tg__ZTV3C26__6E26x15__8G26x15y4[5]),  5,6},
  {&(_ZTV8G26x15y4[12]),  12,13},
  {&(_tg__ZTV3C26__8G26x15y4[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x15y4[];
extern  VTBL_ENTRY _ZTV8G26x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x15y4[];
static VTBL_ENTRY alt_thunk_names715[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E26x153fooEv,_ZThn16_N6E26x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E26x153fooEv,_ZThn16_N6E26x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G26x15y4 = {  "G26x15y4", // class name
  bases_G26x15y4, 6,
  &(vtc_G26x15y4[0]), // expected_vtbl_contents
  &(vtt_G26x15y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G26x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x15y4),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x15y4),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names715,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x15y5  : virtual E26x15 , F0 {
  int ff;
  ~G26x15y5(); // tgen
  G26x15y5(); // tgen
};
//SIG(1 G26x15y5) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G26x15y5 ::~G26x15y5(){ note_dtor("G26x15y5", this);} // tgen
G26x15y5 ::G26x15y5(){ note_ctor("G26x15y5", this);} // tgen

static void Test_G26x15y5()
{
  extern Class_Descriptor cd_G26x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G26x15y5, buf);
    G26x15y5 *dp, &lv = *(dp=new (buf) G26x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G26x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x15y5)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,28), "G26x15y5");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,32), "G26x15y5");
    check_base_class_offset(lv, (C26*)(E26x15*), ABISELECT(32,20), "G26x15y5");
    check_base_class_offset(lv, (D0*)(E26x15*), ABISELECT(52,36), "G26x15y5");
    check_base_class_offset(lv, (E26x15*), ABISELECT(16,12), "G26x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G26x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x15y5.ff");
    test_class_info(&lv, &cd_G26x15y5);
    dp->~G26x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x15y5(Test_G26x15y5, "G26x15y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G26x15y5C1Ev();
extern void _ZN8G26x15y5D1Ev();
Name_Map name_map_G26x15y5[] = {
  NSPAIR(_ZN8G26x15y5C1Ev),
  NSPAIR(_ZN8G26x15y5D1Ev),
  {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_E26x15;
extern VTBL_ENTRY _ZTI6E26x15[];
extern  VTBL_ENTRY _ZTV6E26x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x15y5[] = {
  // 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
    15, //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_E26x15,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G26x15y5[];
extern void _ZN6E26x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv)();
extern void ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn8_N6E26x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G26x15y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x15y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G26x15y5[0]),
  (VTBL_ENTRY)&_ZN6E26x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G26x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv),
};
extern VTBL_ENTRY _ZTV8G26x15y5[];
extern void _ZN6E26x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x15__8G26x15y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x15[0]),
  (VTBL_ENTRY)&_ZN6E26x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv)();
extern void ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn8_N6E26x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C26__6E26x15__8G26x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E26x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__8G26x15y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x15y5[] = {
  {&(_ZTV8G26x15y5[7]),  7,21},
  {&(_ZTV8G26x15y5[14]),  14,21},
  {&(_ZTV8G26x15y5[20]),  20,21},
  {&(_tg__ZTV6E26x15__8G26x15y5[6]),  6,7},
  {&(_tg__ZTV3C26__6E26x15__8G26x15y5[5]),  5,6},
  {&(_tg__ZTV3C26__8G26x15y5[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x15y5[];
extern  VTBL_ENTRY _ZTV8G26x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x15y5[];
static VTBL_ENTRY alt_thunk_names716[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn8_N6E26x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn8_N6E26x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G26x15y5 = {  "G26x15y5", // class name
  bases_G26x15y5, 6,
  &(vtc_G26x15y5[0]), // expected_vtbl_contents
  &(vtt_G26x15y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G26x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x15y5),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x15y5),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names716,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x15y6  : E26x15 , virtual F0 {
  int ff;
  ~G26x15y6(); // tgen
  G26x15y6(); // tgen
};
//SIG(1 G26x15y6) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G26x15y6 ::~G26x15y6(){ note_dtor("G26x15y6", this);} // tgen
G26x15y6 ::G26x15y6(){ note_ctor("G26x15y6", this);} // tgen

static void Test_G26x15y6()
{
  extern Class_Descriptor cd_G26x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x15y6, buf);
    G26x15y6 *dp, &lv = *(dp=new (buf) G26x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x15y6)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(28,20), "G26x15y6");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(32,24), "G26x15y6");
    check_base_class_offset(lv, (C26*)(E26x15*), ABISELECT(16,12), "G26x15y6");
    check_base_class_offset(lv, (D0*)(E26x15*), ABISELECT(36,28), "G26x15y6");
    check_base_class_offset(lv, (E26x15*), 0, "G26x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G26x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x15y6.ff");
    test_class_info(&lv, &cd_G26x15y6);
    dp->~G26x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x15y6(Test_G26x15y6, "G26x15y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN8G26x15y6C1Ev();
extern void _ZN8G26x15y6D1Ev();
Name_Map name_map_G26x15y6[] = {
  NSPAIR(_ZN8G26x15y6C1Ev),
  NSPAIR(_ZN8G26x15y6D1Ev),
  {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_E26x15;
extern VTBL_ENTRY _ZTI6E26x15[];
extern  VTBL_ENTRY _ZTV6E26x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x15y6[] = {
  // 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
    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(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_E26x15,    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 _ZTI8G26x15y6[];
extern void _ZN6E26x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv)();
extern void ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn12_N6E26x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G26x15y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x15y6[0]),
  (VTBL_ENTRY)&_ZN6E26x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G26x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv),
};
extern VTBL_ENTRY _ZTV8G26x15y6[];
extern void _ZN6E26x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x15__8G26x15y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x15[0]),
  (VTBL_ENTRY)&_ZN6E26x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv)();
extern void ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn12_N6E26x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C26__6E26x15__8G26x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E26x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__8G26x15y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x15y6[] = {
  {&(_ZTV8G26x15y6[7]),  7,14},
  {&(_tg__ZTV6E26x15__8G26x15y6[6]),  6,7},
  {&(_tg__ZTV3C26__6E26x15__8G26x15y6[5]),  5,6},
  {&(_ZTV8G26x15y6[13]),  13,14},
  {&(_tg__ZTV3C26__8G26x15y6[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x15y6[];
extern  VTBL_ENTRY _ZTV8G26x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x15y6[];
static VTBL_ENTRY alt_thunk_names717[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn12_N6E26x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn12_N6E26x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G26x15y6 = {  "G26x15y6", // class name
  bases_G26x15y6, 6,
  &(vtc_G26x15y6[0]), // expected_vtbl_contents
  &(vtt_G26x15y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI8G26x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x15y6),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x15y6),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names717,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x15y7  : virtual E26x15 , virtual F0 {
  int ff;
  ~G26x15y7(); // tgen
  G26x15y7(); // tgen
};
//SIG(1 G26x15y7) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G26x15y7 ::~G26x15y7(){ note_dtor("G26x15y7", this);} // tgen
G26x15y7 ::G26x15y7(){ note_ctor("G26x15y7", this);} // tgen

static void Test_G26x15y7()
{
  extern Class_Descriptor cd_G26x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G26x15y7, buf);
    G26x15y7 *dp, &lv = *(dp=new (buf) G26x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G26x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x15y7)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,24), "G26x15y7");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,28), "G26x15y7");
    check_base_class_offset(lv, (C26*)(E26x15*), ABISELECT(32,16), "G26x15y7");
    check_base_class_offset(lv, (D0*)(E26x15*), ABISELECT(52,32), "G26x15y7");
    check_base_class_offset(lv, (E26x15*), ABISELECT(16,8), "G26x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G26x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G26x15y7.ff");
    test_class_info(&lv, &cd_G26x15y7);
    dp->~G26x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x15y7(Test_G26x15y7, "G26x15y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G26x15y7C1Ev();
extern void _ZN8G26x15y7D1Ev();
Name_Map name_map_G26x15y7[] = {
  NSPAIR(_ZN8G26x15y7C1Ev),
  NSPAIR(_ZN8G26x15y7D1Ev),
  {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_E26x15;
extern VTBL_ENTRY _ZTI6E26x15[];
extern  VTBL_ENTRY _ZTV6E26x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E26x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x15y7[] = {
  // 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
    16, //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_E26x15,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G26x15y7[];
extern void _ZN6E26x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv)();
extern void ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn8_N6E26x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G26x15y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G26x15y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G26x15y7[0]),
  (VTBL_ENTRY)&_ZN6E26x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G26x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv),
};
extern VTBL_ENTRY _ZTV8G26x15y7[];
extern void _ZN6E26x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E26x15__8G26x15y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E26x15[0]),
  (VTBL_ENTRY)&_ZN6E26x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv)();
extern void ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn8_N6E26x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C26__6E26x15__8G26x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E26x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__8G26x15y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x15y7[] = {
  {&(_ZTV8G26x15y7[8]),  8,22},
  {&(_ZTV8G26x15y7[15]),  15,22},
  {&(_ZTV8G26x15y7[21]),  21,22},
  {&(_tg__ZTV6E26x15__8G26x15y7[6]),  6,7},
  {&(_tg__ZTV3C26__6E26x15__8G26x15y7[5]),  5,6},
  {&(_tg__ZTV3C26__8G26x15y7[4]),  4,5},
};
extern VTBL_ENTRY _ZTI8G26x15y7[];
extern  VTBL_ENTRY _ZTV8G26x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G26x15y7[];
static VTBL_ENTRY alt_thunk_names718[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E26x153fooEv,_ZTv0_n20_N6E26x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn8_N6E26x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E26x153fooEv,_ZThn8_N6E26x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G26x15y7 = {  "G26x15y7", // class name
  bases_G26x15y7, 6,
  &(vtc_G26x15y7[0]), // expected_vtbl_contents
  &(vtt_G26x15y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G26x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G26x15y7),22, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G26x15y7),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names718,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E27x15  : virtual C27 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E27x153fooEv
  ~E27x15(); // tgen
  E27x15(); // tgen
};
//SIG(-1 E27x15) C1{ VBC2{ VBC3{ v1 Fi} VBC4{ Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E27x15 ::foo(){vfunc_called(this, "_ZN6E27x153fooEv");}
E27x15 ::~E27x15(){ note_dtor("E27x15", this);} // tgen
E27x15 ::E27x15(){ note_ctor("E27x15", this);} // tgen

static void Test_E27x15()
{
  extern Class_Descriptor cd_E27x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_E27x15, buf);
    E27x15 *dp, &lv = *(dp=new (buf) E27x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(E27x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E27x15)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(32,16), "E27x15");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(44,24), "E27x15");
    check_base_class_offset(lv, (C27*), ABISELECT(16,8), "E27x15");
    check_base_class_offset(lv, (D0*), ABISELECT(48,28), "E27x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E27x15.fd");
    test_class_info(&lv, &cd_E27x15);
    dp->~E27x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE27x15(Test_E27x15, "E27x15", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN6E27x15C1Ev();
extern void _ZN6E27x15D1Ev();
Name_Map name_map_E27x15[] = {
  NSPAIR(_ZN6E27x15C1Ev),
  NSPAIR(_ZN6E27x15D1Ev),
  {0,0}
};
extern Class_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_E27x15[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //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,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //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
    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_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 _ZTI6E27x15[];
extern void _ZN6E27x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv)();
extern void ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn8_N6E27x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv)();
extern void ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn16_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E27x15[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&_ZN6E27x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv),
};
extern VTBL_ENTRY _ZTV6E27x15[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__6E27x15[] = {
  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__6E27x15[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_E27x15[] = {
  {&(_ZTV6E27x15[6]),  6,17},
  {&(_ZTV6E27x15[12]),  12,17},
  {&(_ZTV6E27x15[16]),  16,17},
  {&(_tg__ZTV3C27__6E27x15[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__6E27x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E27x15[];
extern  VTBL_ENTRY _ZTV6E27x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x15[];
static VTBL_ENTRY alt_thunk_names719[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn16_N6E27x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn8_N6E27x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E27x15 = {  "E27x15", // class name
  bases_E27x15, 4,
  &(vtc_E27x15[0]), // expected_vtbl_contents
  &(vtt_E27x15[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI6E27x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E27x15),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E27x15),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names719,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x15y0  : E27x15 , F1 {
  int ff;
  ~G27x15y0(); // tgen
  G27x15y0(); // tgen
};
//SIG(1 G27x15y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G27x15y0 ::~G27x15y0(){ note_dtor("G27x15y0", this);} // tgen
G27x15y0 ::G27x15y0(){ note_ctor("G27x15y0", this);} // tgen

static void Test_G27x15y0()
{
  extern Class_Descriptor cd_G27x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G27x15y0, buf);
    G27x15y0 *dp, &lv = *(dp=new (buf) G27x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G27x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x15y0)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,28), "G27x15y0");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,36), "G27x15y0");
    check_base_class_offset(lv, (C27*)(E27x15*), ABISELECT(32,20), "G27x15y0");
    check_base_class_offset(lv, (D0*)(E27x15*), ABISELECT(64,40), "G27x15y0");
    check_base_class_offset(lv, (E27x15*), 0, "G27x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G27x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G27x15y0.ff");
    test_class_info(&lv, &cd_G27x15y0);
    dp->~G27x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x15y0(Test_G27x15y0, "G27x15y0", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G27x15y0C1Ev();
extern void _ZN8G27x15y0D1Ev();
Name_Map name_map_G27x15y0[] = {
  NSPAIR(_ZN8G27x15y0C1Ev),
  NSPAIR(_ZN8G27x15y0D1Ev),
  {0,0}
};
extern Class_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_E27x15;
extern VTBL_ENTRY _ZTI6E27x15[];
extern  VTBL_ENTRY _ZTV6E27x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x15y0[] = {
  // 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)
    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
    10, //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_E27x15,    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
    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
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8G27x15y0[];
extern void _ZN6E27x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv)();
extern void ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn20_N6E27x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv)();
extern void ABISELECT(_ZThn48_N6E27x153fooEv,_ZThn28_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x15y0[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x15y0[0]),
  (VTBL_ENTRY)&_ZN6E27x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G27x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G27x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv),
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G27x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv),
};
extern VTBL_ENTRY _ZTV8G27x15y0[];
extern void _ZN6E27x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x15__8G27x15y0[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&_ZN6E27x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv)();
extern void ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn20_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C27__6E27x15__8G27x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv)();
extern void ABISELECT(_ZThn48_N6E27x153fooEv,_ZThn28_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x15__8G27x15y0[] = {
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__8G27x15y0[] = {
  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__8G27x15y0[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x15y0[] = {
  {&(_ZTV8G27x15y0[6]),  6,20},
  {&(_tg__ZTV6E27x15__8G27x15y0[6]),  6,7},
  {&(_tg__ZTV3C27__6E27x15__8G27x15y0[5]),  5,6},
  {&(_tg__ZTV2A1__6E27x15__8G27x15y0[3]),  3,4},
  {&(_ZTV8G27x15y0[15]),  15,20},
  {&(_ZTV8G27x15y0[19]),  19,20},
  {&(_tg__ZTV3C27__8G27x15y0[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__8G27x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x15y0[];
extern  VTBL_ENTRY _ZTV8G27x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x15y0[];
static VTBL_ENTRY alt_thunk_names720[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E27x153fooEv,_ZThn28_N6E27x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E27x153fooEv,_ZThn28_N6E27x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn20_N6E27x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn20_N6E27x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x15y0 = {  "G27x15y0", // class name
  bases_G27x15y0, 6,
  &(vtc_G27x15y0[0]), // expected_vtbl_contents
  &(vtt_G27x15y0[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G27x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x15y0),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x15y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names720,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x15y1  : virtual E27x15 , F1 {
  int ff;
  ~G27x15y1(); // tgen
  G27x15y1(); // tgen
};
//SIG(1 G27x15y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G27x15y1 ::~G27x15y1(){ note_dtor("G27x15y1", this);} // tgen
G27x15y1 ::G27x15y1(){ note_ctor("G27x15y1", this);} // tgen

static void Test_G27x15y1()
{
  extern Class_Descriptor cd_G27x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G27x15y1, buf);
    G27x15y1 *dp, &lv = *(dp=new (buf) G27x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G27x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x15y1)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,28), "G27x15y1");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,36), "G27x15y1");
    check_base_class_offset(lv, (C27*)(E27x15*), ABISELECT(32,20), "G27x15y1");
    check_base_class_offset(lv, (D0*)(E27x15*), ABISELECT(64,40), "G27x15y1");
    check_base_class_offset(lv, (E27x15*), ABISELECT(16,12), "G27x15y1");
    check_base_class_offset(lv, (F1*), 0, "G27x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x15y1.ff");
    test_class_info(&lv, &cd_G27x15y1);
    dp->~G27x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x15y1(Test_G27x15y1, "G27x15y1", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G27x15y1C1Ev();
extern void _ZN8G27x15y1D1Ev();
Name_Map name_map_G27x15y1[] = {
  NSPAIR(_ZN8G27x15y1C1Ev),
  NSPAIR(_ZN8G27x15y1D1Ev),
  {0,0}
};
extern Class_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_E27x15;
extern VTBL_ENTRY _ZTI6E27x15[];
extern  VTBL_ENTRY _ZTV6E27x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x15y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    22, //bcp->virtual_function_table_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
    16, //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_E27x15,    ABISELECT(16,12), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G27x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E27x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv)();
extern void ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn8_N6E27x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv)();
extern void ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn16_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x15y1[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G27x15y1[0]),
  (VTBL_ENTRY)&_ZN6E27x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G27x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G27x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv),
};
extern VTBL_ENTRY _ZTV8G27x15y1[];
extern void _ZN6E27x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x15__8G27x15y1[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&_ZN6E27x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv)();
extern void ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn8_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C27__6E27x15__8G27x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv)();
extern void ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn16_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x15__8G27x15y1[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__8G27x15y1[] = {
  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__8G27x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x15y1[] = {
  {&(_ZTV8G27x15y1[7]),  7,26},
  {&(_ZTV8G27x15y1[15]),  15,26},
  {&(_ZTV8G27x15y1[21]),  21,26},
  {&(_ZTV8G27x15y1[25]),  25,26},
  {&(_tg__ZTV6E27x15__8G27x15y1[6]),  6,7},
  {&(_tg__ZTV3C27__6E27x15__8G27x15y1[5]),  5,6},
  {&(_tg__ZTV2A1__6E27x15__8G27x15y1[3]),  3,4},
  {&(_tg__ZTV3C27__8G27x15y1[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__8G27x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x15y1[];
extern  VTBL_ENTRY _ZTV8G27x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x15y1[];
static VTBL_ENTRY alt_thunk_names721[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn16_N6E27x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn16_N6E27x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn8_N6E27x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn8_N6E27x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x15y1 = {  "G27x15y1", // class name
  bases_G27x15y1, 6,
  &(vtc_G27x15y1[0]), // expected_vtbl_contents
  &(vtt_G27x15y1[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G27x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x15y1),26, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x15y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names721,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x15y2  : E27x15 , virtual F1 {
  int ff;
  ~G27x15y2(); // tgen
  G27x15y2(); // tgen
};
//SIG(1 G27x15y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G27x15y2 ::~G27x15y2(){ note_dtor("G27x15y2", this);} // tgen
G27x15y2 ::G27x15y2(){ note_ctor("G27x15y2", this);} // tgen

static void Test_G27x15y2()
{
  extern Class_Descriptor cd_G27x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G27x15y2, buf);
    G27x15y2 *dp, &lv = *(dp=new (buf) G27x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G27x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x15y2)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(32,20), "G27x15y2");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(44,28), "G27x15y2");
    check_base_class_offset(lv, (C27*)(E27x15*), ABISELECT(16,12), "G27x15y2");
    check_base_class_offset(lv, (D0*)(E27x15*), ABISELECT(48,32), "G27x15y2");
    check_base_class_offset(lv, (E27x15*), 0, "G27x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G27x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x15y2.ff");
    test_class_info(&lv, &cd_G27x15y2);
    dp->~G27x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x15y2(Test_G27x15y2, "G27x15y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G27x15y2C1Ev();
extern void _ZN8G27x15y2D1Ev();
Name_Map name_map_G27x15y2[] = {
  NSPAIR(_ZN8G27x15y2C1Ev),
  NSPAIR(_ZN8G27x15y2D1Ev),
  {0,0}
};
extern Class_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_E27x15;
extern VTBL_ENTRY _ZTI6E27x15[];
extern  VTBL_ENTRY _ZTV6E27x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x15y2[] = {
  // 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)
    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
    8, //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_E27x15,    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
    18, //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 _ZTI8G27x15y2[];
extern void _ZN6E27x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv)();
extern void ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn12_N6E27x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv)();
extern void ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn20_N6E27x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G27x15y2[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x15y2[0]),
  (VTBL_ENTRY)&_ZN6E27x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G27x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G27x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI8G27x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G27x15y2[];
extern void _ZN6E27x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x15__8G27x15y2[] = {
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&_ZN6E27x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv)();
extern void ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn12_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C27__6E27x15__8G27x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv)();
extern void ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn20_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x15__8G27x15y2[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__8G27x15y2[] = {
  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__8G27x15y2[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x15y2[] = {
  {&(_ZTV8G27x15y2[7]),  7,22},
  {&(_tg__ZTV6E27x15__8G27x15y2[6]),  6,7},
  {&(_tg__ZTV3C27__6E27x15__8G27x15y2[5]),  5,6},
  {&(_tg__ZTV2A1__6E27x15__8G27x15y2[3]),  3,4},
  {&(_ZTV8G27x15y2[13]),  13,22},
  {&(_ZTV8G27x15y2[17]),  17,22},
  {&(_ZTV8G27x15y2[21]),  21,22},
  {&(_tg__ZTV3C27__8G27x15y2[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__8G27x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x15y2[];
extern  VTBL_ENTRY _ZTV8G27x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x15y2[];
static VTBL_ENTRY alt_thunk_names722[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn20_N6E27x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn20_N6E27x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn12_N6E27x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn12_N6E27x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x15y2 = {  "G27x15y2", // class name
  bases_G27x15y2, 6,
  &(vtc_G27x15y2[0]), // expected_vtbl_contents
  &(vtt_G27x15y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G27x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x15y2),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x15y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names722,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x15y3  : virtual E27x15 , virtual F1 {
  int ff;
  ~G27x15y3(); // tgen
  G27x15y3(); // tgen
};
//SIG(1 G27x15y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G27x15y3 ::~G27x15y3(){ note_dtor("G27x15y3", this);} // tgen
G27x15y3 ::G27x15y3(){ note_ctor("G27x15y3", this);} // tgen

static void Test_G27x15y3()
{
  extern Class_Descriptor cd_G27x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G27x15y3, buf);
    G27x15y3 *dp, &lv = *(dp=new (buf) G27x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G27x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x15y3)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,24), "G27x15y3");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,32), "G27x15y3");
    check_base_class_offset(lv, (C27*)(E27x15*), ABISELECT(32,16), "G27x15y3");
    check_base_class_offset(lv, (D0*)(E27x15*), ABISELECT(64,36), "G27x15y3");
    check_base_class_offset(lv, (E27x15*), ABISELECT(16,8), "G27x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(72,40), "G27x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G27x15y3.ff");
    test_class_info(&lv, &cd_G27x15y3);
    dp->~G27x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x15y3(Test_G27x15y3, "G27x15y3", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN8G27x15y3C1Ev();
extern void _ZN8G27x15y3D1Ev();
Name_Map name_map_G27x15y3[] = {
  NSPAIR(_ZN8G27x15y3C1Ev),
  NSPAIR(_ZN8G27x15y3D1Ev),
  {0,0}
};
extern Class_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_E27x15;
extern VTBL_ENTRY _ZTI6E27x15[];
extern  VTBL_ENTRY _ZTV6E27x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x15y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,24), //bcp->offset
    22, //bcp->virtual_function_table_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
    16, //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_E27x15,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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
    26, //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 _ZTI8G27x15y3[];
extern void _ZN6E27x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv)();
extern void ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn8_N6E27x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv)();
extern void ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn16_N6E27x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G27x15y3[] = {
  ABISELECT(72,40),
  ABISELECT(64,36),
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x15y3[0]),
  0,
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G27x15y3[0]),
  (VTBL_ENTRY)&_ZN6E27x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G27x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI8G27x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv),
  0,
  ABISELECT(-72,-40),
  (VTBL_ENTRY)&(_ZTI8G27x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G27x15y3[];
extern void _ZN6E27x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x15__8G27x15y3[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&_ZN6E27x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv)();
extern void ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn8_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C27__6E27x15__8G27x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv)();
extern void ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn16_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x15__8G27x15y3[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__8G27x15y3[] = {
  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__8G27x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x15y3[] = {
  {&(_ZTV8G27x15y3[8]),  8,30},
  {&(_ZTV8G27x15y3[15]),  15,30},
  {&(_ZTV8G27x15y3[21]),  21,30},
  {&(_ZTV8G27x15y3[25]),  25,30},
  {&(_ZTV8G27x15y3[29]),  29,30},
  {&(_tg__ZTV6E27x15__8G27x15y3[6]),  6,7},
  {&(_tg__ZTV3C27__6E27x15__8G27x15y3[5]),  5,6},
  {&(_tg__ZTV2A1__6E27x15__8G27x15y3[3]),  3,4},
  {&(_tg__ZTV3C27__8G27x15y3[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__8G27x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x15y3[];
extern  VTBL_ENTRY _ZTV8G27x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x15y3[];
static VTBL_ENTRY alt_thunk_names723[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn16_N6E27x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn16_N6E27x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn8_N6E27x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn8_N6E27x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x15y3 = {  "G27x15y3", // class name
  bases_G27x15y3, 6,
  &(vtc_G27x15y3[0]), // expected_vtbl_contents
  &(vtt_G27x15y3[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI8G27x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x15y3),30, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x15y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names723,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x15y4  : E27x15 , F0 {
  int ff;
  ~G27x15y4(); // tgen
  G27x15y4(); // tgen
};
//SIG(1 G27x15y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G27x15y4 ::~G27x15y4(){ note_dtor("G27x15y4", this);} // tgen
G27x15y4 ::G27x15y4(){ note_ctor("G27x15y4", this);} // tgen

static void Test_G27x15y4()
{
  extern Class_Descriptor cd_G27x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G27x15y4, buf);
    G27x15y4 *dp, &lv = *(dp=new (buf) G27x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G27x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x15y4)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(40,24), "G27x15y4");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(52,32), "G27x15y4");
    check_base_class_offset(lv, (C27*)(E27x15*), ABISELECT(24,16), "G27x15y4");
    check_base_class_offset(lv, (D0*)(E27x15*), ABISELECT(56,36), "G27x15y4");
    check_base_class_offset(lv, (E27x15*), 0, "G27x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G27x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G27x15y4.ff");
    test_class_info(&lv, &cd_G27x15y4);
    dp->~G27x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x15y4(Test_G27x15y4, "G27x15y4", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN8G27x15y4C1Ev();
extern void _ZN8G27x15y4D1Ev();
Name_Map name_map_G27x15y4[] = {
  NSPAIR(_ZN8G27x15y4C1Ev),
  NSPAIR(_ZN8G27x15y4D1Ev),
  {0,0}
};
extern Class_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_E27x15;
extern VTBL_ENTRY _ZTI6E27x15[];
extern  VTBL_ENTRY _ZTV6E27x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x15y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,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_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
    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(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_E27x15,    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 _ZTI8G27x15y4[];
extern void _ZN6E27x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv)();
extern void ABISELECT(_ZThn24_N6E27x153fooEv,_ZThn16_N6E27x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv)();
extern void ABISELECT(_ZThn40_N6E27x153fooEv,_ZThn24_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x15y4[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x15y4[0]),
  (VTBL_ENTRY)&_ZN6E27x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G27x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G27x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv),
};
extern VTBL_ENTRY _ZTV8G27x15y4[];
extern void _ZN6E27x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x15__8G27x15y4[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&_ZN6E27x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv)();
extern void ABISELECT(_ZThn24_N6E27x153fooEv,_ZThn16_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C27__6E27x15__8G27x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv)();
extern void ABISELECT(_ZThn40_N6E27x153fooEv,_ZThn24_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x15__8G27x15y4[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__8G27x15y4[] = {
  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__8G27x15y4[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x15y4[] = {
  {&(_ZTV8G27x15y4[6]),  6,17},
  {&(_tg__ZTV6E27x15__8G27x15y4[6]),  6,7},
  {&(_tg__ZTV3C27__6E27x15__8G27x15y4[5]),  5,6},
  {&(_tg__ZTV2A1__6E27x15__8G27x15y4[3]),  3,4},
  {&(_ZTV8G27x15y4[12]),  12,17},
  {&(_ZTV8G27x15y4[16]),  16,17},
  {&(_tg__ZTV3C27__8G27x15y4[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__8G27x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x15y4[];
extern  VTBL_ENTRY _ZTV8G27x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x15y4[];
static VTBL_ENTRY alt_thunk_names724[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E27x153fooEv,_ZThn24_N6E27x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E27x153fooEv,_ZThn24_N6E27x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x153fooEv,_ZThn16_N6E27x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E27x153fooEv,_ZThn16_N6E27x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x15y4 = {  "G27x15y4", // class name
  bases_G27x15y4, 6,
  &(vtc_G27x15y4[0]), // expected_vtbl_contents
  &(vtt_G27x15y4[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI8G27x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x15y4),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x15y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names724,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x15y5  : virtual E27x15 , F0 {
  int ff;
  ~G27x15y5(); // tgen
  G27x15y5(); // tgen
};
//SIG(1 G27x15y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G27x15y5 ::~G27x15y5(){ note_dtor("G27x15y5", this);} // tgen
G27x15y5 ::G27x15y5(){ note_ctor("G27x15y5", this);} // tgen

static void Test_G27x15y5()
{
  extern Class_Descriptor cd_G27x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G27x15y5, buf);
    G27x15y5 *dp, &lv = *(dp=new (buf) G27x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G27x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x15y5)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,28), "G27x15y5");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,36), "G27x15y5");
    check_base_class_offset(lv, (C27*)(E27x15*), ABISELECT(32,20), "G27x15y5");
    check_base_class_offset(lv, (D0*)(E27x15*), ABISELECT(64,40), "G27x15y5");
    check_base_class_offset(lv, (E27x15*), ABISELECT(16,12), "G27x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G27x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x15y5.ff");
    test_class_info(&lv, &cd_G27x15y5);
    dp->~G27x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x15y5(Test_G27x15y5, "G27x15y5", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G27x15y5C1Ev();
extern void _ZN8G27x15y5D1Ev();
Name_Map name_map_G27x15y5[] = {
  NSPAIR(_ZN8G27x15y5C1Ev),
  NSPAIR(_ZN8G27x15y5D1Ev),
  {0,0}
};
extern Class_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_E27x15;
extern VTBL_ENTRY _ZTI6E27x15[];
extern  VTBL_ENTRY _ZTV6E27x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x15y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    21, //bcp->virtual_function_table_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
    15, //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_E27x15,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G27x15y5[];
extern void _ZN6E27x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv)();
extern void ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn8_N6E27x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv)();
extern void ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn16_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x15y5[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x15y5[0]),
  0,
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G27x15y5[0]),
  (VTBL_ENTRY)&_ZN6E27x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G27x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G27x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv),
};
extern VTBL_ENTRY _ZTV8G27x15y5[];
extern void _ZN6E27x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x15__8G27x15y5[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&_ZN6E27x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv)();
extern void ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn8_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C27__6E27x15__8G27x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv)();
extern void ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn16_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x15__8G27x15y5[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__8G27x15y5[] = {
  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__8G27x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x15y5[] = {
  {&(_ZTV8G27x15y5[7]),  7,25},
  {&(_ZTV8G27x15y5[14]),  14,25},
  {&(_ZTV8G27x15y5[20]),  20,25},
  {&(_ZTV8G27x15y5[24]),  24,25},
  {&(_tg__ZTV6E27x15__8G27x15y5[6]),  6,7},
  {&(_tg__ZTV3C27__6E27x15__8G27x15y5[5]),  5,6},
  {&(_tg__ZTV2A1__6E27x15__8G27x15y5[3]),  3,4},
  {&(_tg__ZTV3C27__8G27x15y5[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__8G27x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x15y5[];
extern  VTBL_ENTRY _ZTV8G27x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x15y5[];
static VTBL_ENTRY alt_thunk_names725[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn16_N6E27x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn16_N6E27x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn8_N6E27x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn8_N6E27x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x15y5 = {  "G27x15y5", // class name
  bases_G27x15y5, 6,
  &(vtc_G27x15y5[0]), // expected_vtbl_contents
  &(vtt_G27x15y5[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G27x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x15y5),25, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x15y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names725,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x15y6  : E27x15 , virtual F0 {
  int ff;
  ~G27x15y6(); // tgen
  G27x15y6(); // tgen
};
//SIG(1 G27x15y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G27x15y6 ::~G27x15y6(){ note_dtor("G27x15y6", this);} // tgen
G27x15y6 ::G27x15y6(){ note_ctor("G27x15y6", this);} // tgen

static void Test_G27x15y6()
{
  extern Class_Descriptor cd_G27x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x15y6, buf);
    G27x15y6 *dp, &lv = *(dp=new (buf) G27x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x15y6)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(32,20), "G27x15y6");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(44,28), "G27x15y6");
    check_base_class_offset(lv, (C27*)(E27x15*), ABISELECT(16,12), "G27x15y6");
    check_base_class_offset(lv, (D0*)(E27x15*), ABISELECT(48,32), "G27x15y6");
    check_base_class_offset(lv, (E27x15*), 0, "G27x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G27x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x15y6.ff");
    test_class_info(&lv, &cd_G27x15y6);
    dp->~G27x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x15y6(Test_G27x15y6, "G27x15y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G27x15y6C1Ev();
extern void _ZN8G27x15y6D1Ev();
Name_Map name_map_G27x15y6[] = {
  NSPAIR(_ZN8G27x15y6C1Ev),
  NSPAIR(_ZN8G27x15y6D1Ev),
  {0,0}
};
extern Class_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_E27x15;
extern VTBL_ENTRY _ZTI6E27x15[];
extern  VTBL_ENTRY _ZTV6E27x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x15y6[] = {
  // 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)
    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
    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(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_E27x15,    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 _ZTI8G27x15y6[];
extern void _ZN6E27x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv)();
extern void ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn12_N6E27x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv)();
extern void ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn20_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x15y6[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x15y6[0]),
  (VTBL_ENTRY)&_ZN6E27x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G27x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G27x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv),
};
extern VTBL_ENTRY _ZTV8G27x15y6[];
extern void _ZN6E27x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x15__8G27x15y6[] = {
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&_ZN6E27x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv)();
extern void ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn12_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C27__6E27x15__8G27x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv)();
extern void ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn20_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x15__8G27x15y6[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__8G27x15y6[] = {
  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__8G27x15y6[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x15y6[] = {
  {&(_ZTV8G27x15y6[7]),  7,18},
  {&(_tg__ZTV6E27x15__8G27x15y6[6]),  6,7},
  {&(_tg__ZTV3C27__6E27x15__8G27x15y6[5]),  5,6},
  {&(_tg__ZTV2A1__6E27x15__8G27x15y6[3]),  3,4},
  {&(_ZTV8G27x15y6[13]),  13,18},
  {&(_ZTV8G27x15y6[17]),  17,18},
  {&(_tg__ZTV3C27__8G27x15y6[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__8G27x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x15y6[];
extern  VTBL_ENTRY _ZTV8G27x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x15y6[];
static VTBL_ENTRY alt_thunk_names726[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn20_N6E27x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn20_N6E27x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn12_N6E27x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn12_N6E27x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x15y6 = {  "G27x15y6", // class name
  bases_G27x15y6, 6,
  &(vtc_G27x15y6[0]), // expected_vtbl_contents
  &(vtt_G27x15y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G27x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x15y6),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x15y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names726,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x15y7  : virtual E27x15 , virtual F0 {
  int ff;
  ~G27x15y7(); // tgen
  G27x15y7(); // tgen
};
//SIG(1 G27x15y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G27x15y7 ::~G27x15y7(){ note_dtor("G27x15y7", this);} // tgen
G27x15y7 ::G27x15y7(){ note_ctor("G27x15y7", this);} // tgen

static void Test_G27x15y7()
{
  extern Class_Descriptor cd_G27x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G27x15y7, buf);
    G27x15y7 *dp, &lv = *(dp=new (buf) G27x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G27x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x15y7)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,24), "G27x15y7");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,32), "G27x15y7");
    check_base_class_offset(lv, (C27*)(E27x15*), ABISELECT(32,16), "G27x15y7");
    check_base_class_offset(lv, (D0*)(E27x15*), ABISELECT(64,36), "G27x15y7");
    check_base_class_offset(lv, (E27x15*), ABISELECT(16,8), "G27x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(68,40), "G27x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G27x15y7.ff");
    test_class_info(&lv, &cd_G27x15y7);
    dp->~G27x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x15y7(Test_G27x15y7, "G27x15y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G27x15y7C1Ev();
extern void _ZN8G27x15y7D1Ev();
Name_Map name_map_G27x15y7[] = {
  NSPAIR(_ZN8G27x15y7C1Ev),
  NSPAIR(_ZN8G27x15y7D1Ev),
  {0,0}
};
extern Class_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_E27x15;
extern VTBL_ENTRY _ZTI6E27x15[];
extern  VTBL_ENTRY _ZTV6E27x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E27x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x15y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,24), //bcp->offset
    22, //bcp->virtual_function_table_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
    16, //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_E27x15,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G27x15y7[];
extern void _ZN6E27x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv)();
extern void ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn8_N6E27x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv)();
extern void ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn16_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x15y7[] = {
  ABISELECT(68,40),
  ABISELECT(64,36),
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G27x15y7[0]),
  0,
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G27x15y7[0]),
  (VTBL_ENTRY)&_ZN6E27x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G27x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI8G27x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv),
};
extern VTBL_ENTRY _ZTV8G27x15y7[];
extern void _ZN6E27x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E27x15__8G27x15y7[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&_ZN6E27x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv)();
extern void ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn8_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C27__6E27x15__8G27x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv)();
extern void ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn16_N6E27x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E27x15__8G27x15y7[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E27x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__8G27x15y7[] = {
  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__8G27x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x15y7[] = {
  {&(_ZTV8G27x15y7[8]),  8,26},
  {&(_ZTV8G27x15y7[15]),  15,26},
  {&(_ZTV8G27x15y7[21]),  21,26},
  {&(_ZTV8G27x15y7[25]),  25,26},
  {&(_tg__ZTV6E27x15__8G27x15y7[6]),  6,7},
  {&(_tg__ZTV3C27__6E27x15__8G27x15y7[5]),  5,6},
  {&(_tg__ZTV2A1__6E27x15__8G27x15y7[3]),  3,4},
  {&(_tg__ZTV3C27__8G27x15y7[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__8G27x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G27x15y7[];
extern  VTBL_ENTRY _ZTV8G27x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G27x15y7[];
static VTBL_ENTRY alt_thunk_names727[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E27x153fooEv,_ZTv0_n12_N6E27x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn16_N6E27x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E27x153fooEv,_ZThn16_N6E27x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E27x153fooEv,_ZTv0_n20_N6E27x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn8_N6E27x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E27x153fooEv,_ZThn8_N6E27x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x15y7 = {  "G27x15y7", // class name
  bases_G27x15y7, 6,
  &(vtc_G27x15y7[0]), // expected_vtbl_contents
  &(vtt_G27x15y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G27x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G27x15y7),26, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G27x15y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names727,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E28x15  : virtual C28 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E28x153fooEv
  ~E28x15(); // tgen
  E28x15(); // tgen
};
//SIG(-1 E28x15) C1{ VBC2{ BC3{ Fi} VBC4{ v1 Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E28x15 ::foo(){vfunc_called(this, "_ZN6E28x153fooEv");}
E28x15 ::~E28x15(){ note_dtor("E28x15", this);} // tgen
E28x15 ::E28x15(){ note_ctor("E28x15", this);} // tgen

static void Test_E28x15()
{
  extern Class_Descriptor cd_E28x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E28x15, buf);
    E28x15 *dp, &lv = *(dp=new (buf) E28x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E28x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E28x15)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(24,12), "E28x15");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(32,20), "E28x15");
    check_base_class_offset(lv, (C28*), ABISELECT(16,8), "E28x15");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E28x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E28x15.fd");
    test_class_info(&lv, &cd_E28x15);
    dp->~E28x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE28x15(Test_E28x15, "E28x15", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E28x15C1Ev();
extern void _ZN6E28x15D1Ev();
Name_Map name_map_E28x15[] = {
  NSPAIR(_ZN6E28x15C1Ev),
  NSPAIR(_ZN6E28x15D1Ev),
  {0,0}
};
extern Class_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_E28x15[] = {
  // 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
    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,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 _ZTI6E28x15[];
extern void _ZN6E28x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv)();
extern void ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn8_N6E28x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv)();
extern void ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E28x15[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&_ZN6E28x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv),
};
extern VTBL_ENTRY _ZTV6E28x15[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__6E28x15[] = {
  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__6E28x15[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_E28x15[] = {
  {&(_ZTV6E28x15[5]),  5,15},
  {&(_ZTV6E28x15[10]),  10,15},
  {&(_ZTV6E28x15[14]),  14,15},
  {&(_tg__ZTV3C28__6E28x15[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__6E28x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E28x15[];
extern  VTBL_ENTRY _ZTV6E28x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x15[];
static VTBL_ENTRY alt_thunk_names728[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn8_N6E28x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E28x15 = {  "E28x15", // class name
  bases_E28x15, 4,
  &(vtc_E28x15[0]), // expected_vtbl_contents
  &(vtt_E28x15[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E28x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E28x15),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E28x15),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names728,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x15y0  : E28x15 , F1 {
  int ff;
  ~G28x15y0(); // tgen
  G28x15y0(); // tgen
};
//SIG(1 G28x15y0) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G28x15y0 ::~G28x15y0(){ note_dtor("G28x15y0", this);} // tgen
G28x15y0 ::G28x15y0(){ note_ctor("G28x15y0", this);} // tgen

static void Test_G28x15y0()
{
  extern Class_Descriptor cd_G28x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G28x15y0, buf);
    G28x15y0 *dp, &lv = *(dp=new (buf) G28x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G28x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x15y0)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,24), "G28x15y0");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,32), "G28x15y0");
    check_base_class_offset(lv, (C28*)(E28x15*), ABISELECT(32,20), "G28x15y0");
    check_base_class_offset(lv, (D0*)(E28x15*), ABISELECT(60,40), "G28x15y0");
    check_base_class_offset(lv, (E28x15*), 0, "G28x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G28x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G28x15y0.ff");
    test_class_info(&lv, &cd_G28x15y0);
    dp->~G28x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x15y0(Test_G28x15y0, "G28x15y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G28x15y0C1Ev();
extern void _ZN8G28x15y0D1Ev();
Name_Map name_map_G28x15y0[] = {
  NSPAIR(_ZN8G28x15y0C1Ev),
  NSPAIR(_ZN8G28x15y0D1Ev),
  {0,0}
};
extern Class_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_E28x15;
extern VTBL_ENTRY _ZTI6E28x15[];
extern  VTBL_ENTRY _ZTV6E28x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x15y0[] = {
  // 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)
    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
    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_E28x15,    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
    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 _ZTI8G28x15y0[];
extern void _ZN6E28x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv)();
extern void ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv)();
extern void ABISELECT(_ZThn48_N6E28x153fooEv,_ZThn32_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x15y0[0]),
  (VTBL_ENTRY)&_ZN6E28x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G28x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G28x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G28x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv),
};
extern VTBL_ENTRY _ZTV8G28x15y0[];
extern void _ZN6E28x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x15__8G28x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&_ZN6E28x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv)();
extern void ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C28__6E28x15__8G28x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv)();
extern void ABISELECT(_ZThn48_N6E28x153fooEv,_ZThn32_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x15__8G28x15y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__8G28x15y0[] = {
  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__8G28x15y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x15y0[] = {
  {&(_ZTV8G28x15y0[5]),  5,18},
  {&(_tg__ZTV6E28x15__8G28x15y0[5]),  5,6},
  {&(_tg__ZTV3C28__6E28x15__8G28x15y0[4]),  4,5},
  {&(_tg__ZTV2B1__6E28x15__8G28x15y0[3]),  3,4},
  {&(_ZTV8G28x15y0[13]),  13,18},
  {&(_ZTV8G28x15y0[17]),  17,18},
  {&(_tg__ZTV3C28__8G28x15y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__8G28x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x15y0[];
extern  VTBL_ENTRY _ZTV8G28x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x15y0[];
static VTBL_ENTRY alt_thunk_names729[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E28x153fooEv,_ZThn32_N6E28x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E28x153fooEv,_ZThn32_N6E28x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x15y0 = {  "G28x15y0", // class name
  bases_G28x15y0, 6,
  &(vtc_G28x15y0[0]), // expected_vtbl_contents
  &(vtt_G28x15y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G28x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x15y0),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x15y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names729,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x15y1  : virtual E28x15 , F1 {
  int ff;
  ~G28x15y1(); // tgen
  G28x15y1(); // tgen
};
//SIG(1 G28x15y1) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G28x15y1 ::~G28x15y1(){ note_dtor("G28x15y1", this);} // tgen
G28x15y1 ::G28x15y1(){ note_ctor("G28x15y1", this);} // tgen

static void Test_G28x15y1()
{
  extern Class_Descriptor cd_G28x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G28x15y1, buf);
    G28x15y1 *dp, &lv = *(dp=new (buf) G28x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G28x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x15y1)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,24), "G28x15y1");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,32), "G28x15y1");
    check_base_class_offset(lv, (C28*)(E28x15*), ABISELECT(32,20), "G28x15y1");
    check_base_class_offset(lv, (D0*)(E28x15*), ABISELECT(60,40), "G28x15y1");
    check_base_class_offset(lv, (E28x15*), ABISELECT(16,12), "G28x15y1");
    check_base_class_offset(lv, (F1*), 0, "G28x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x15y1.ff");
    test_class_info(&lv, &cd_G28x15y1);
    dp->~G28x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x15y1(Test_G28x15y1, "G28x15y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G28x15y1C1Ev();
extern void _ZN8G28x15y1D1Ev();
Name_Map name_map_G28x15y1[] = {
  NSPAIR(_ZN8G28x15y1C1Ev),
  NSPAIR(_ZN8G28x15y1D1Ev),
  {0,0}
};
extern Class_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_E28x15;
extern VTBL_ENTRY _ZTI6E28x15[];
extern  VTBL_ENTRY _ZTV6E28x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x15y1[] = {
  // 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
    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_C28,    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_E28x15,    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_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 _ZTI8G28x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E28x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv)();
extern void ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn8_N6E28x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv)();
extern void ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x15y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G28x15y1[0]),
  (VTBL_ENTRY)&_ZN6E28x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G28x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G28x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv),
};
extern VTBL_ENTRY _ZTV8G28x15y1[];
extern void _ZN6E28x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x15__8G28x15y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&_ZN6E28x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv)();
extern void ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn8_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C28__6E28x15__8G28x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv)();
extern void ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x15__8G28x15y1[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__8G28x15y1[] = {
  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__8G28x15y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x15y1[] = {
  {&(_ZTV8G28x15y1[6]),  6,23},
  {&(_ZTV8G28x15y1[13]),  13,23},
  {&(_ZTV8G28x15y1[18]),  18,23},
  {&(_ZTV8G28x15y1[22]),  22,23},
  {&(_tg__ZTV6E28x15__8G28x15y1[5]),  5,6},
  {&(_tg__ZTV3C28__6E28x15__8G28x15y1[4]),  4,5},
  {&(_tg__ZTV2B1__6E28x15__8G28x15y1[3]),  3,4},
  {&(_tg__ZTV3C28__8G28x15y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__8G28x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x15y1[];
extern  VTBL_ENTRY _ZTV8G28x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x15y1[];
static VTBL_ENTRY alt_thunk_names730[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn8_N6E28x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn8_N6E28x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x15y1 = {  "G28x15y1", // class name
  bases_G28x15y1, 6,
  &(vtc_G28x15y1[0]), // expected_vtbl_contents
  &(vtt_G28x15y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G28x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x15y1),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x15y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names730,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x15y2  : E28x15 , virtual F1 {
  int ff;
  ~G28x15y2(); // tgen
  G28x15y2(); // tgen
};
//SIG(1 G28x15y2) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G28x15y2 ::~G28x15y2(){ note_dtor("G28x15y2", this);} // tgen
G28x15y2 ::G28x15y2(){ note_ctor("G28x15y2", this);} // tgen

static void Test_G28x15y2()
{
  extern Class_Descriptor cd_G28x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G28x15y2, buf);
    G28x15y2 *dp, &lv = *(dp=new (buf) G28x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G28x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x15y2)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(24,16), "G28x15y2");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(32,24), "G28x15y2");
    check_base_class_offset(lv, (C28*)(E28x15*), ABISELECT(16,12), "G28x15y2");
    check_base_class_offset(lv, (D0*)(E28x15*), ABISELECT(44,32), "G28x15y2");
    check_base_class_offset(lv, (E28x15*), 0, "G28x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G28x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x15y2.ff");
    test_class_info(&lv, &cd_G28x15y2);
    dp->~G28x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x15y2(Test_G28x15y2, "G28x15y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G28x15y2C1Ev();
extern void _ZN8G28x15y2D1Ev();
Name_Map name_map_G28x15y2[] = {
  NSPAIR(_ZN8G28x15y2C1Ev),
  NSPAIR(_ZN8G28x15y2D1Ev),
  {0,0}
};
extern Class_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_E28x15;
extern VTBL_ENTRY _ZTI6E28x15[];
extern  VTBL_ENTRY _ZTV6E28x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x15y2[] = {
  // 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
    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(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_E28x15,    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
    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 _ZTI8G28x15y2[];
extern void _ZN6E28x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv)();
extern void ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn12_N6E28x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv)();
extern void ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn24_N6E28x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G28x15y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x15y2[0]),
  (VTBL_ENTRY)&_ZN6E28x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G28x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G28x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G28x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G28x15y2[];
extern void _ZN6E28x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x15__8G28x15y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&_ZN6E28x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv)();
extern void ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn12_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C28__6E28x15__8G28x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv)();
extern void ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn24_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x15__8G28x15y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__8G28x15y2[] = {
  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__8G28x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x15y2[] = {
  {&(_ZTV8G28x15y2[6]),  6,20},
  {&(_tg__ZTV6E28x15__8G28x15y2[5]),  5,6},
  {&(_tg__ZTV3C28__6E28x15__8G28x15y2[4]),  4,5},
  {&(_tg__ZTV2B1__6E28x15__8G28x15y2[3]),  3,4},
  {&(_ZTV8G28x15y2[11]),  11,20},
  {&(_ZTV8G28x15y2[15]),  15,20},
  {&(_ZTV8G28x15y2[19]),  19,20},
  {&(_tg__ZTV3C28__8G28x15y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__8G28x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x15y2[];
extern  VTBL_ENTRY _ZTV8G28x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x15y2[];
static VTBL_ENTRY alt_thunk_names731[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn24_N6E28x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn24_N6E28x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn12_N6E28x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn12_N6E28x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x15y2 = {  "G28x15y2", // class name
  bases_G28x15y2, 6,
  &(vtc_G28x15y2[0]), // expected_vtbl_contents
  &(vtt_G28x15y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G28x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x15y2),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x15y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names731,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x15y3  : virtual E28x15 , virtual F1 {
  int ff;
  ~G28x15y3(); // tgen
  G28x15y3(); // tgen
};
//SIG(1 G28x15y3) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G28x15y3 ::~G28x15y3(){ note_dtor("G28x15y3", this);} // tgen
G28x15y3 ::G28x15y3(){ note_ctor("G28x15y3", this);} // tgen

static void Test_G28x15y3()
{
  extern Class_Descriptor cd_G28x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G28x15y3, buf);
    G28x15y3 *dp, &lv = *(dp=new (buf) G28x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G28x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x15y3)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,20), "G28x15y3");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,28), "G28x15y3");
    check_base_class_offset(lv, (C28*)(E28x15*), ABISELECT(32,16), "G28x15y3");
    check_base_class_offset(lv, (D0*)(E28x15*), ABISELECT(60,36), "G28x15y3");
    check_base_class_offset(lv, (E28x15*), ABISELECT(16,8), "G28x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G28x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G28x15y3.ff");
    test_class_info(&lv, &cd_G28x15y3);
    dp->~G28x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x15y3(Test_G28x15y3, "G28x15y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G28x15y3C1Ev();
extern void _ZN8G28x15y3D1Ev();
Name_Map name_map_G28x15y3[] = {
  NSPAIR(_ZN8G28x15y3C1Ev),
  NSPAIR(_ZN8G28x15y3D1Ev),
  {0,0}
};
extern Class_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_E28x15;
extern VTBL_ENTRY _ZTI6E28x15[];
extern  VTBL_ENTRY _ZTV6E28x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x15y3[] = {
  // 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
    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_C28,    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_E28x15,    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
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI8G28x15y3[];
extern void _ZN6E28x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv)();
extern void ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn8_N6E28x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv)();
extern void ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G28x15y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x15y3[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G28x15y3[0]),
  (VTBL_ENTRY)&_ZN6E28x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G28x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G28x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G28x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G28x15y3[];
extern void _ZN6E28x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x15__8G28x15y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&_ZN6E28x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv)();
extern void ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn8_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C28__6E28x15__8G28x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv)();
extern void ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x15__8G28x15y3[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__8G28x15y3[] = {
  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__8G28x15y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x15y3[] = {
  {&(_ZTV8G28x15y3[7]),  7,27},
  {&(_ZTV8G28x15y3[13]),  13,27},
  {&(_ZTV8G28x15y3[18]),  18,27},
  {&(_ZTV8G28x15y3[22]),  22,27},
  {&(_ZTV8G28x15y3[26]),  26,27},
  {&(_tg__ZTV6E28x15__8G28x15y3[5]),  5,6},
  {&(_tg__ZTV3C28__6E28x15__8G28x15y3[4]),  4,5},
  {&(_tg__ZTV2B1__6E28x15__8G28x15y3[3]),  3,4},
  {&(_tg__ZTV3C28__8G28x15y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__8G28x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x15y3[];
extern  VTBL_ENTRY _ZTV8G28x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x15y3[];
static VTBL_ENTRY alt_thunk_names732[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn8_N6E28x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn8_N6E28x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x15y3 = {  "G28x15y3", // class name
  bases_G28x15y3, 6,
  &(vtc_G28x15y3[0]), // expected_vtbl_contents
  &(vtt_G28x15y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G28x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x15y3),27, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x15y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names732,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x15y4  : E28x15 , F0 {
  int ff;
  ~G28x15y4(); // tgen
  G28x15y4(); // tgen
};
//SIG(1 G28x15y4) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G28x15y4 ::~G28x15y4(){ note_dtor("G28x15y4", this);} // tgen
G28x15y4 ::G28x15y4(){ note_ctor("G28x15y4", this);} // tgen

static void Test_G28x15y4()
{
  extern Class_Descriptor cd_G28x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x15y4, buf);
    G28x15y4 *dp, &lv = *(dp=new (buf) G28x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x15y4)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(32,20), "G28x15y4");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(40,28), "G28x15y4");
    check_base_class_offset(lv, (C28*)(E28x15*), ABISELECT(24,16), "G28x15y4");
    check_base_class_offset(lv, (D0*)(E28x15*), ABISELECT(52,36), "G28x15y4");
    check_base_class_offset(lv, (E28x15*), 0, "G28x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G28x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G28x15y4.ff");
    test_class_info(&lv, &cd_G28x15y4);
    dp->~G28x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x15y4(Test_G28x15y4, "G28x15y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G28x15y4C1Ev();
extern void _ZN8G28x15y4D1Ev();
Name_Map name_map_G28x15y4[] = {
  NSPAIR(_ZN8G28x15y4C1Ev),
  NSPAIR(_ZN8G28x15y4D1Ev),
  {0,0}
};
extern Class_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_E28x15;
extern VTBL_ENTRY _ZTI6E28x15[];
extern  VTBL_ENTRY _ZTV6E28x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x15y4[] = {
  // 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
    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(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_E28x15,    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 _ZTI8G28x15y4[];
extern void _ZN6E28x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv)();
extern void ABISELECT(_ZThn24_N6E28x153fooEv,_ZThn16_N6E28x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv)();
extern void ABISELECT(_ZThn40_N6E28x153fooEv,_ZThn28_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x15y4[0]),
  (VTBL_ENTRY)&_ZN6E28x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G28x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G28x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv),
};
extern VTBL_ENTRY _ZTV8G28x15y4[];
extern void _ZN6E28x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x15__8G28x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&_ZN6E28x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv)();
extern void ABISELECT(_ZThn24_N6E28x153fooEv,_ZThn16_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C28__6E28x15__8G28x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv)();
extern void ABISELECT(_ZThn40_N6E28x153fooEv,_ZThn28_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x15__8G28x15y4[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__8G28x15y4[] = {
  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__8G28x15y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x15y4[] = {
  {&(_ZTV8G28x15y4[5]),  5,15},
  {&(_tg__ZTV6E28x15__8G28x15y4[5]),  5,6},
  {&(_tg__ZTV3C28__6E28x15__8G28x15y4[4]),  4,5},
  {&(_tg__ZTV2B1__6E28x15__8G28x15y4[3]),  3,4},
  {&(_ZTV8G28x15y4[10]),  10,15},
  {&(_ZTV8G28x15y4[14]),  14,15},
  {&(_tg__ZTV3C28__8G28x15y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__8G28x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x15y4[];
extern  VTBL_ENTRY _ZTV8G28x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x15y4[];
static VTBL_ENTRY alt_thunk_names733[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E28x153fooEv,_ZThn28_N6E28x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E28x153fooEv,_ZThn28_N6E28x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x153fooEv,_ZThn16_N6E28x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E28x153fooEv,_ZThn16_N6E28x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x15y4 = {  "G28x15y4", // class name
  bases_G28x15y4, 6,
  &(vtc_G28x15y4[0]), // expected_vtbl_contents
  &(vtt_G28x15y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G28x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x15y4),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x15y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names733,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x15y5  : virtual E28x15 , F0 {
  int ff;
  ~G28x15y5(); // tgen
  G28x15y5(); // tgen
};
//SIG(1 G28x15y5) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G28x15y5 ::~G28x15y5(){ note_dtor("G28x15y5", this);} // tgen
G28x15y5 ::G28x15y5(){ note_ctor("G28x15y5", this);} // tgen

static void Test_G28x15y5()
{
  extern Class_Descriptor cd_G28x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G28x15y5, buf);
    G28x15y5 *dp, &lv = *(dp=new (buf) G28x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G28x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x15y5)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,24), "G28x15y5");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,32), "G28x15y5");
    check_base_class_offset(lv, (C28*)(E28x15*), ABISELECT(32,20), "G28x15y5");
    check_base_class_offset(lv, (D0*)(E28x15*), ABISELECT(60,40), "G28x15y5");
    check_base_class_offset(lv, (E28x15*), ABISELECT(16,12), "G28x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G28x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x15y5.ff");
    test_class_info(&lv, &cd_G28x15y5);
    dp->~G28x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x15y5(Test_G28x15y5, "G28x15y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G28x15y5C1Ev();
extern void _ZN8G28x15y5D1Ev();
Name_Map name_map_G28x15y5[] = {
  NSPAIR(_ZN8G28x15y5C1Ev),
  NSPAIR(_ZN8G28x15y5D1Ev),
  {0,0}
};
extern Class_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_E28x15;
extern VTBL_ENTRY _ZTI6E28x15[];
extern  VTBL_ENTRY _ZTV6E28x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x15y5[] = {
  // 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
    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_C28,    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_E28x15,    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
    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 _ZTI8G28x15y5[];
extern void _ZN6E28x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv)();
extern void ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn8_N6E28x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv)();
extern void ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x15y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x15y5[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G28x15y5[0]),
  (VTBL_ENTRY)&_ZN6E28x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G28x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G28x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv),
};
extern VTBL_ENTRY _ZTV8G28x15y5[];
extern void _ZN6E28x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x15__8G28x15y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&_ZN6E28x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv)();
extern void ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn8_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C28__6E28x15__8G28x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv)();
extern void ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x15__8G28x15y5[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__8G28x15y5[] = {
  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__8G28x15y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x15y5[] = {
  {&(_ZTV8G28x15y5[6]),  6,22},
  {&(_ZTV8G28x15y5[12]),  12,22},
  {&(_ZTV8G28x15y5[17]),  17,22},
  {&(_ZTV8G28x15y5[21]),  21,22},
  {&(_tg__ZTV6E28x15__8G28x15y5[5]),  5,6},
  {&(_tg__ZTV3C28__6E28x15__8G28x15y5[4]),  4,5},
  {&(_tg__ZTV2B1__6E28x15__8G28x15y5[3]),  3,4},
  {&(_tg__ZTV3C28__8G28x15y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__8G28x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x15y5[];
extern  VTBL_ENTRY _ZTV8G28x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x15y5[];
static VTBL_ENTRY alt_thunk_names734[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn8_N6E28x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn8_N6E28x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x15y5 = {  "G28x15y5", // class name
  bases_G28x15y5, 6,
  &(vtc_G28x15y5[0]), // expected_vtbl_contents
  &(vtt_G28x15y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G28x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x15y5),22, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x15y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names734,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x15y6  : E28x15 , virtual F0 {
  int ff;
  ~G28x15y6(); // tgen
  G28x15y6(); // tgen
};
//SIG(1 G28x15y6) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G28x15y6 ::~G28x15y6(){ note_dtor("G28x15y6", this);} // tgen
G28x15y6 ::G28x15y6(){ note_ctor("G28x15y6", this);} // tgen

static void Test_G28x15y6()
{
  extern Class_Descriptor cd_G28x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x15y6, buf);
    G28x15y6 *dp, &lv = *(dp=new (buf) G28x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x15y6)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(24,16), "G28x15y6");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(32,24), "G28x15y6");
    check_base_class_offset(lv, (C28*)(E28x15*), ABISELECT(16,12), "G28x15y6");
    check_base_class_offset(lv, (D0*)(E28x15*), ABISELECT(44,32), "G28x15y6");
    check_base_class_offset(lv, (E28x15*), 0, "G28x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G28x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x15y6.ff");
    test_class_info(&lv, &cd_G28x15y6);
    dp->~G28x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x15y6(Test_G28x15y6, "G28x15y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G28x15y6C1Ev();
extern void _ZN8G28x15y6D1Ev();
Name_Map name_map_G28x15y6[] = {
  NSPAIR(_ZN8G28x15y6C1Ev),
  NSPAIR(_ZN8G28x15y6D1Ev),
  {0,0}
};
extern Class_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_E28x15;
extern VTBL_ENTRY _ZTI6E28x15[];
extern  VTBL_ENTRY _ZTV6E28x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x15y6[] = {
  // 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
    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(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_E28x15,    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 _ZTI8G28x15y6[];
extern void _ZN6E28x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv)();
extern void ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn12_N6E28x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv)();
extern void ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn24_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x15y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x15y6[0]),
  (VTBL_ENTRY)&_ZN6E28x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G28x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G28x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv),
};
extern VTBL_ENTRY _ZTV8G28x15y6[];
extern void _ZN6E28x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x15__8G28x15y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&_ZN6E28x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv)();
extern void ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn12_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C28__6E28x15__8G28x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv)();
extern void ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn24_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x15__8G28x15y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__8G28x15y6[] = {
  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__8G28x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x15y6[] = {
  {&(_ZTV8G28x15y6[6]),  6,16},
  {&(_tg__ZTV6E28x15__8G28x15y6[5]),  5,6},
  {&(_tg__ZTV3C28__6E28x15__8G28x15y6[4]),  4,5},
  {&(_tg__ZTV2B1__6E28x15__8G28x15y6[3]),  3,4},
  {&(_ZTV8G28x15y6[11]),  11,16},
  {&(_ZTV8G28x15y6[15]),  15,16},
  {&(_tg__ZTV3C28__8G28x15y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__8G28x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x15y6[];
extern  VTBL_ENTRY _ZTV8G28x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x15y6[];
static VTBL_ENTRY alt_thunk_names735[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn24_N6E28x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn24_N6E28x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn12_N6E28x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn12_N6E28x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x15y6 = {  "G28x15y6", // class name
  bases_G28x15y6, 6,
  &(vtc_G28x15y6[0]), // expected_vtbl_contents
  &(vtt_G28x15y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G28x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x15y6),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x15y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names735,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x15y7  : virtual E28x15 , virtual F0 {
  int ff;
  ~G28x15y7(); // tgen
  G28x15y7(); // tgen
};
//SIG(1 G28x15y7) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G28x15y7 ::~G28x15y7(){ note_dtor("G28x15y7", this);} // tgen
G28x15y7 ::G28x15y7(){ note_ctor("G28x15y7", this);} // tgen

static void Test_G28x15y7()
{
  extern Class_Descriptor cd_G28x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G28x15y7, buf);
    G28x15y7 *dp, &lv = *(dp=new (buf) G28x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G28x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x15y7)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,20), "G28x15y7");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,28), "G28x15y7");
    check_base_class_offset(lv, (C28*)(E28x15*), ABISELECT(32,16), "G28x15y7");
    check_base_class_offset(lv, (D0*)(E28x15*), ABISELECT(60,36), "G28x15y7");
    check_base_class_offset(lv, (E28x15*), ABISELECT(16,8), "G28x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G28x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G28x15y7.ff");
    test_class_info(&lv, &cd_G28x15y7);
    dp->~G28x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x15y7(Test_G28x15y7, "G28x15y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G28x15y7C1Ev();
extern void _ZN8G28x15y7D1Ev();
Name_Map name_map_G28x15y7[] = {
  NSPAIR(_ZN8G28x15y7C1Ev),
  NSPAIR(_ZN8G28x15y7D1Ev),
  {0,0}
};
extern Class_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_E28x15;
extern VTBL_ENTRY _ZTI6E28x15[];
extern  VTBL_ENTRY _ZTV6E28x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E28x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x15y7[] = {
  // 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
    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_C28,    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_E28x15,    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_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 _ZTI8G28x15y7[];
extern void _ZN6E28x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv)();
extern void ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn8_N6E28x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv)();
extern void ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x15y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G28x15y7[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G28x15y7[0]),
  (VTBL_ENTRY)&_ZN6E28x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G28x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G28x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv),
};
extern VTBL_ENTRY _ZTV8G28x15y7[];
extern void _ZN6E28x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E28x15__8G28x15y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&_ZN6E28x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv)();
extern void ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn8_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C28__6E28x15__8G28x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv)();
extern void ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E28x15__8G28x15y7[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E28x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__8G28x15y7[] = {
  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__8G28x15y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x15y7[] = {
  {&(_ZTV8G28x15y7[7]),  7,23},
  {&(_ZTV8G28x15y7[13]),  13,23},
  {&(_ZTV8G28x15y7[18]),  18,23},
  {&(_ZTV8G28x15y7[22]),  22,23},
  {&(_tg__ZTV6E28x15__8G28x15y7[5]),  5,6},
  {&(_tg__ZTV3C28__6E28x15__8G28x15y7[4]),  4,5},
  {&(_tg__ZTV2B1__6E28x15__8G28x15y7[3]),  3,4},
  {&(_tg__ZTV3C28__8G28x15y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__8G28x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G28x15y7[];
extern  VTBL_ENTRY _ZTV8G28x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G28x15y7[];
static VTBL_ENTRY alt_thunk_names736[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E28x153fooEv,_ZTv0_n12_N6E28x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E28x153fooEv,_ZThn20_N6E28x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E28x153fooEv,_ZTv0_n16_N6E28x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn8_N6E28x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E28x153fooEv,_ZThn8_N6E28x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x15y7 = {  "G28x15y7", // class name
  bases_G28x15y7, 6,
  &(vtc_G28x15y7[0]), // expected_vtbl_contents
  &(vtt_G28x15y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G28x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G28x15y7),23, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G28x15y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names736,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E29x15  : virtual C29 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E29x153fooEv
  ~E29x15(); // tgen
  E29x15(); // tgen
};
//SIG(-1 E29x15) C1{ VBC2{ BC3{ v1 Fi} VBC4{ v1 Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E29x15 ::foo(){vfunc_called(this, "_ZN6E29x153fooEv");}
E29x15 ::~E29x15(){ note_dtor("E29x15", this);} // tgen
E29x15 ::E29x15(){ note_ctor("E29x15", this);} // tgen

static void Test_E29x15()
{
  extern Class_Descriptor cd_E29x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E29x15, buf);
    E29x15 *dp, &lv = *(dp=new (buf) E29x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E29x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E29x15)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(16,8), "E29x15");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(32,20), "E29x15");
    check_base_class_offset(lv, (C29*), ABISELECT(16,8), "E29x15");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E29x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E29x15.fd");
    test_class_info(&lv, &cd_E29x15);
    dp->~E29x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE29x15(Test_E29x15, "E29x15", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E29x15C1Ev();
extern void _ZN6E29x15D1Ev();
Name_Map name_map_E29x15[] = {
  NSPAIR(_ZN6E29x15C1Ev),
  NSPAIR(_ZN6E29x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x15[] = {
  // 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
    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,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_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 _ZTI6E29x15[];
extern void _ZN6E29x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv)();
extern void ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn8_N6E29x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv)();
extern void ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E29x15[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&_ZN6E29x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv),
};
extern VTBL_ENTRY _ZTV6E29x15[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__6E29x15[] = {
  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__6E29x15[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_E29x15[] = {
  {&(_ZTV6E29x15[5]),  5,15},
  {&(_ZTV6E29x15[10]),  10,15},
  {&(_ZTV6E29x15[14]),  14,15},
  {&(_tg__ZTV3C29__6E29x15[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__6E29x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E29x15[];
extern  VTBL_ENTRY _ZTV6E29x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x15[];
static VTBL_ENTRY alt_thunk_names737[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn8_N6E29x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E29x15 = {  "E29x15", // class name
  bases_E29x15, 4,
  &(vtc_E29x15[0]), // expected_vtbl_contents
  &(vtt_E29x15[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E29x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E29x15),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E29x15),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names737,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x15y0  : E29x15 , F1 {
  int ff;
  ~G29x15y0(); // tgen
  G29x15y0(); // tgen
};
//SIG(1 G29x15y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G29x15y0 ::~G29x15y0(){ note_dtor("G29x15y0", this);} // tgen
G29x15y0 ::G29x15y0(){ note_ctor("G29x15y0", this);} // tgen

static void Test_G29x15y0()
{
  extern Class_Descriptor cd_G29x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G29x15y0, buf);
    G29x15y0 *dp, &lv = *(dp=new (buf) G29x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G29x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x15y0)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,20), "G29x15y0");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,32), "G29x15y0");
    check_base_class_offset(lv, (C29*)(E29x15*), ABISELECT(32,20), "G29x15y0");
    check_base_class_offset(lv, (D0*)(E29x15*), ABISELECT(60,40), "G29x15y0");
    check_base_class_offset(lv, (E29x15*), 0, "G29x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G29x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G29x15y0.ff");
    test_class_info(&lv, &cd_G29x15y0);
    dp->~G29x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x15y0(Test_G29x15y0, "G29x15y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G29x15y0C1Ev();
extern void _ZN8G29x15y0D1Ev();
Name_Map name_map_G29x15y0[] = {
  NSPAIR(_ZN8G29x15y0C1Ev),
  NSPAIR(_ZN8G29x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x15;
extern VTBL_ENTRY _ZTI6E29x15[];
extern  VTBL_ENTRY _ZTV6E29x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x15y0[] = {
  // 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
    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_C29,    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
    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_E29x15,    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
    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 _ZTI8G29x15y0[];
extern void _ZN6E29x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv)();
extern void ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv)();
extern void ABISELECT(_ZThn48_N6E29x153fooEv,_ZThn32_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x15y0[0]),
  (VTBL_ENTRY)&_ZN6E29x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G29x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G29x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G29x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv),
};
extern VTBL_ENTRY _ZTV8G29x15y0[];
extern void _ZN6E29x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x15__8G29x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&_ZN6E29x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv)();
extern void ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C29__6E29x15__8G29x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv)();
extern void ABISELECT(_ZThn48_N6E29x153fooEv,_ZThn32_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x15__8G29x15y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__8G29x15y0[] = {
  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__8G29x15y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x15y0[] = {
  {&(_ZTV8G29x15y0[5]),  5,18},
  {&(_tg__ZTV6E29x15__8G29x15y0[5]),  5,6},
  {&(_tg__ZTV3C29__6E29x15__8G29x15y0[4]),  4,5},
  {&(_tg__ZTV2B1__6E29x15__8G29x15y0[3]),  3,4},
  {&(_ZTV8G29x15y0[13]),  13,18},
  {&(_ZTV8G29x15y0[17]),  17,18},
  {&(_tg__ZTV3C29__8G29x15y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__8G29x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x15y0[];
extern  VTBL_ENTRY _ZTV8G29x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x15y0[];
static VTBL_ENTRY alt_thunk_names738[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E29x153fooEv,_ZThn32_N6E29x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E29x153fooEv,_ZThn32_N6E29x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x15y0 = {  "G29x15y0", // class name
  bases_G29x15y0, 6,
  &(vtc_G29x15y0[0]), // expected_vtbl_contents
  &(vtt_G29x15y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G29x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x15y0),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x15y0),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names738,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x15y1  : virtual E29x15 , F1 {
  int ff;
  ~G29x15y1(); // tgen
  G29x15y1(); // tgen
};
//SIG(1 G29x15y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G29x15y1 ::~G29x15y1(){ note_dtor("G29x15y1", this);} // tgen
G29x15y1 ::G29x15y1(){ note_ctor("G29x15y1", this);} // tgen

static void Test_G29x15y1()
{
  extern Class_Descriptor cd_G29x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G29x15y1, buf);
    G29x15y1 *dp, &lv = *(dp=new (buf) G29x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G29x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x15y1)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,20), "G29x15y1");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,32), "G29x15y1");
    check_base_class_offset(lv, (C29*)(E29x15*), ABISELECT(32,20), "G29x15y1");
    check_base_class_offset(lv, (D0*)(E29x15*), ABISELECT(60,40), "G29x15y1");
    check_base_class_offset(lv, (E29x15*), ABISELECT(16,12), "G29x15y1");
    check_base_class_offset(lv, (F1*), 0, "G29x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x15y1.ff");
    test_class_info(&lv, &cd_G29x15y1);
    dp->~G29x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x15y1(Test_G29x15y1, "G29x15y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G29x15y1C1Ev();
extern void _ZN8G29x15y1D1Ev();
Name_Map name_map_G29x15y1[] = {
  NSPAIR(_ZN8G29x15y1C1Ev),
  NSPAIR(_ZN8G29x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x15;
extern VTBL_ENTRY _ZTI6E29x15[];
extern  VTBL_ENTRY _ZTV6E29x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x15y1[] = {
  // 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
    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_C29,    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
    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_E29x15,    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 _ZTI8G29x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E29x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv)();
extern void ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn8_N6E29x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv)();
extern void ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x15y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G29x15y1[0]),
  (VTBL_ENTRY)&_ZN6E29x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G29x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G29x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv),
};
extern VTBL_ENTRY _ZTV8G29x15y1[];
extern void _ZN6E29x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x15__8G29x15y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&_ZN6E29x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv)();
extern void ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn8_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C29__6E29x15__8G29x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv)();
extern void ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x15__8G29x15y1[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__8G29x15y1[] = {
  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__8G29x15y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x15y1[] = {
  {&(_ZTV8G29x15y1[6]),  6,23},
  {&(_ZTV8G29x15y1[13]),  13,23},
  {&(_ZTV8G29x15y1[18]),  18,23},
  {&(_ZTV8G29x15y1[22]),  22,23},
  {&(_tg__ZTV6E29x15__8G29x15y1[5]),  5,6},
  {&(_tg__ZTV3C29__6E29x15__8G29x15y1[4]),  4,5},
  {&(_tg__ZTV2B1__6E29x15__8G29x15y1[3]),  3,4},
  {&(_tg__ZTV3C29__8G29x15y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__8G29x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x15y1[];
extern  VTBL_ENTRY _ZTV8G29x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x15y1[];
static VTBL_ENTRY alt_thunk_names739[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn8_N6E29x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn8_N6E29x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x15y1 = {  "G29x15y1", // class name
  bases_G29x15y1, 6,
  &(vtc_G29x15y1[0]), // expected_vtbl_contents
  &(vtt_G29x15y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G29x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x15y1),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x15y1),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names739,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x15y2  : E29x15 , virtual F1 {
  int ff;
  ~G29x15y2(); // tgen
  G29x15y2(); // tgen
};
//SIG(1 G29x15y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G29x15y2 ::~G29x15y2(){ note_dtor("G29x15y2", this);} // tgen
G29x15y2 ::G29x15y2(){ note_ctor("G29x15y2", this);} // tgen

static void Test_G29x15y2()
{
  extern Class_Descriptor cd_G29x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G29x15y2, buf);
    G29x15y2 *dp, &lv = *(dp=new (buf) G29x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G29x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x15y2)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(16,12), "G29x15y2");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(32,24), "G29x15y2");
    check_base_class_offset(lv, (C29*)(E29x15*), ABISELECT(16,12), "G29x15y2");
    check_base_class_offset(lv, (D0*)(E29x15*), ABISELECT(44,32), "G29x15y2");
    check_base_class_offset(lv, (E29x15*), 0, "G29x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G29x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x15y2.ff");
    test_class_info(&lv, &cd_G29x15y2);
    dp->~G29x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x15y2(Test_G29x15y2, "G29x15y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G29x15y2C1Ev();
extern void _ZN8G29x15y2D1Ev();
Name_Map name_map_G29x15y2[] = {
  NSPAIR(_ZN8G29x15y2C1Ev),
  NSPAIR(_ZN8G29x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x15;
extern VTBL_ENTRY _ZTI6E29x15[];
extern  VTBL_ENTRY _ZTV6E29x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x15y2[] = {
  // 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
    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(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
    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_E29x15,    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
    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI8G29x15y2[];
extern void _ZN6E29x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv)();
extern void ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn12_N6E29x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv)();
extern void ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn24_N6E29x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G29x15y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x15y2[0]),
  (VTBL_ENTRY)&_ZN6E29x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G29x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G29x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G29x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G29x15y2[];
extern void _ZN6E29x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x15__8G29x15y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&_ZN6E29x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv)();
extern void ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn12_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C29__6E29x15__8G29x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv)();
extern void ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn24_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x15__8G29x15y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__8G29x15y2[] = {
  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__8G29x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x15y2[] = {
  {&(_ZTV8G29x15y2[6]),  6,20},
  {&(_tg__ZTV6E29x15__8G29x15y2[5]),  5,6},
  {&(_tg__ZTV3C29__6E29x15__8G29x15y2[4]),  4,5},
  {&(_tg__ZTV2B1__6E29x15__8G29x15y2[3]),  3,4},
  {&(_ZTV8G29x15y2[11]),  11,20},
  {&(_ZTV8G29x15y2[15]),  15,20},
  {&(_ZTV8G29x15y2[19]),  19,20},
  {&(_tg__ZTV3C29__8G29x15y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__8G29x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x15y2[];
extern  VTBL_ENTRY _ZTV8G29x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x15y2[];
static VTBL_ENTRY alt_thunk_names740[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn24_N6E29x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn24_N6E29x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn12_N6E29x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn12_N6E29x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x15y2 = {  "G29x15y2", // class name
  bases_G29x15y2, 6,
  &(vtc_G29x15y2[0]), // expected_vtbl_contents
  &(vtt_G29x15y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G29x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x15y2),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x15y2),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names740,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x15y3  : virtual E29x15 , virtual F1 {
  int ff;
  ~G29x15y3(); // tgen
  G29x15y3(); // tgen
};
//SIG(1 G29x15y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G29x15y3 ::~G29x15y3(){ note_dtor("G29x15y3", this);} // tgen
G29x15y3 ::G29x15y3(){ note_ctor("G29x15y3", this);} // tgen

static void Test_G29x15y3()
{
  extern Class_Descriptor cd_G29x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G29x15y3, buf);
    G29x15y3 *dp, &lv = *(dp=new (buf) G29x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G29x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x15y3)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,16), "G29x15y3");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,28), "G29x15y3");
    check_base_class_offset(lv, (C29*)(E29x15*), ABISELECT(32,16), "G29x15y3");
    check_base_class_offset(lv, (D0*)(E29x15*), ABISELECT(60,36), "G29x15y3");
    check_base_class_offset(lv, (E29x15*), ABISELECT(16,8), "G29x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G29x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G29x15y3.ff");
    test_class_info(&lv, &cd_G29x15y3);
    dp->~G29x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x15y3(Test_G29x15y3, "G29x15y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G29x15y3C1Ev();
extern void _ZN8G29x15y3D1Ev();
Name_Map name_map_G29x15y3[] = {
  NSPAIR(_ZN8G29x15y3C1Ev),
  NSPAIR(_ZN8G29x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x15;
extern VTBL_ENTRY _ZTI6E29x15[];
extern  VTBL_ENTRY _ZTV6E29x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x15y3[] = {
  // 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
    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_C29,    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
    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_E29x15,    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
    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
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI8G29x15y3[];
extern void _ZN6E29x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv)();
extern void ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn8_N6E29x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv)();
extern void ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G29x15y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x15y3[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G29x15y3[0]),
  (VTBL_ENTRY)&_ZN6E29x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G29x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G29x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G29x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G29x15y3[];
extern void _ZN6E29x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x15__8G29x15y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&_ZN6E29x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv)();
extern void ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn8_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C29__6E29x15__8G29x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv)();
extern void ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x15__8G29x15y3[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__8G29x15y3[] = {
  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__8G29x15y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x15y3[] = {
  {&(_ZTV8G29x15y3[7]),  7,27},
  {&(_ZTV8G29x15y3[13]),  13,27},
  {&(_ZTV8G29x15y3[18]),  18,27},
  {&(_ZTV8G29x15y3[22]),  22,27},
  {&(_ZTV8G29x15y3[26]),  26,27},
  {&(_tg__ZTV6E29x15__8G29x15y3[5]),  5,6},
  {&(_tg__ZTV3C29__6E29x15__8G29x15y3[4]),  4,5},
  {&(_tg__ZTV2B1__6E29x15__8G29x15y3[3]),  3,4},
  {&(_tg__ZTV3C29__8G29x15y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__8G29x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x15y3[];
extern  VTBL_ENTRY _ZTV8G29x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x15y3[];
static VTBL_ENTRY alt_thunk_names741[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn8_N6E29x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn8_N6E29x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x15y3 = {  "G29x15y3", // class name
  bases_G29x15y3, 6,
  &(vtc_G29x15y3[0]), // expected_vtbl_contents
  &(vtt_G29x15y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G29x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x15y3),27, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x15y3),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names741,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x15y4  : E29x15 , F0 {
  int ff;
  ~G29x15y4(); // tgen
  G29x15y4(); // tgen
};
//SIG(1 G29x15y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G29x15y4 ::~G29x15y4(){ note_dtor("G29x15y4", this);} // tgen
G29x15y4 ::G29x15y4(){ note_ctor("G29x15y4", this);} // tgen

static void Test_G29x15y4()
{
  extern Class_Descriptor cd_G29x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x15y4, buf);
    G29x15y4 *dp, &lv = *(dp=new (buf) G29x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x15y4)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(24,16), "G29x15y4");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(40,28), "G29x15y4");
    check_base_class_offset(lv, (C29*)(E29x15*), ABISELECT(24,16), "G29x15y4");
    check_base_class_offset(lv, (D0*)(E29x15*), ABISELECT(52,36), "G29x15y4");
    check_base_class_offset(lv, (E29x15*), 0, "G29x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G29x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G29x15y4.ff");
    test_class_info(&lv, &cd_G29x15y4);
    dp->~G29x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x15y4(Test_G29x15y4, "G29x15y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G29x15y4C1Ev();
extern void _ZN8G29x15y4D1Ev();
Name_Map name_map_G29x15y4[] = {
  NSPAIR(_ZN8G29x15y4C1Ev),
  NSPAIR(_ZN8G29x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x15;
extern VTBL_ENTRY _ZTI6E29x15[];
extern  VTBL_ENTRY _ZTV6E29x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x15y4[] = {
  // 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
    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(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
    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_E29x15,    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 _ZTI8G29x15y4[];
extern void _ZN6E29x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv)();
extern void ABISELECT(_ZThn24_N6E29x153fooEv,_ZThn16_N6E29x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv)();
extern void ABISELECT(_ZThn40_N6E29x153fooEv,_ZThn28_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x15y4[0]),
  (VTBL_ENTRY)&_ZN6E29x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G29x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G29x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv),
};
extern VTBL_ENTRY _ZTV8G29x15y4[];
extern void _ZN6E29x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x15__8G29x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&_ZN6E29x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv)();
extern void ABISELECT(_ZThn24_N6E29x153fooEv,_ZThn16_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C29__6E29x15__8G29x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv)();
extern void ABISELECT(_ZThn40_N6E29x153fooEv,_ZThn28_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x15__8G29x15y4[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__8G29x15y4[] = {
  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__8G29x15y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x15y4[] = {
  {&(_ZTV8G29x15y4[5]),  5,15},
  {&(_tg__ZTV6E29x15__8G29x15y4[5]),  5,6},
  {&(_tg__ZTV3C29__6E29x15__8G29x15y4[4]),  4,5},
  {&(_tg__ZTV2B1__6E29x15__8G29x15y4[3]),  3,4},
  {&(_ZTV8G29x15y4[10]),  10,15},
  {&(_ZTV8G29x15y4[14]),  14,15},
  {&(_tg__ZTV3C29__8G29x15y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__8G29x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x15y4[];
extern  VTBL_ENTRY _ZTV8G29x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x15y4[];
static VTBL_ENTRY alt_thunk_names742[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E29x153fooEv,_ZThn28_N6E29x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E29x153fooEv,_ZThn28_N6E29x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x153fooEv,_ZThn16_N6E29x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E29x153fooEv,_ZThn16_N6E29x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x15y4 = {  "G29x15y4", // class name
  bases_G29x15y4, 6,
  &(vtc_G29x15y4[0]), // expected_vtbl_contents
  &(vtt_G29x15y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G29x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x15y4),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x15y4),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names742,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x15y5  : virtual E29x15 , F0 {
  int ff;
  ~G29x15y5(); // tgen
  G29x15y5(); // tgen
};
//SIG(1 G29x15y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G29x15y5 ::~G29x15y5(){ note_dtor("G29x15y5", this);} // tgen
G29x15y5 ::G29x15y5(){ note_ctor("G29x15y5", this);} // tgen

static void Test_G29x15y5()
{
  extern Class_Descriptor cd_G29x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G29x15y5, buf);
    G29x15y5 *dp, &lv = *(dp=new (buf) G29x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G29x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x15y5)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,20), "G29x15y5");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,32), "G29x15y5");
    check_base_class_offset(lv, (C29*)(E29x15*), ABISELECT(32,20), "G29x15y5");
    check_base_class_offset(lv, (D0*)(E29x15*), ABISELECT(60,40), "G29x15y5");
    check_base_class_offset(lv, (E29x15*), ABISELECT(16,12), "G29x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G29x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x15y5.ff");
    test_class_info(&lv, &cd_G29x15y5);
    dp->~G29x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x15y5(Test_G29x15y5, "G29x15y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G29x15y5C1Ev();
extern void _ZN8G29x15y5D1Ev();
Name_Map name_map_G29x15y5[] = {
  NSPAIR(_ZN8G29x15y5C1Ev),
  NSPAIR(_ZN8G29x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x15;
extern VTBL_ENTRY _ZTI6E29x15[];
extern  VTBL_ENTRY _ZTV6E29x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x15y5[] = {
  // 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
    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_C29,    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
    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_E29x15,    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 _ZTI8G29x15y5[];
extern void _ZN6E29x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv)();
extern void ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn8_N6E29x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv)();
extern void ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x15y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x15y5[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G29x15y5[0]),
  (VTBL_ENTRY)&_ZN6E29x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G29x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G29x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv),
};
extern VTBL_ENTRY _ZTV8G29x15y5[];
extern void _ZN6E29x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x15__8G29x15y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&_ZN6E29x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv)();
extern void ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn8_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C29__6E29x15__8G29x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv)();
extern void ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x15__8G29x15y5[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__8G29x15y5[] = {
  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__8G29x15y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x15y5[] = {
  {&(_ZTV8G29x15y5[6]),  6,22},
  {&(_ZTV8G29x15y5[12]),  12,22},
  {&(_ZTV8G29x15y5[17]),  17,22},
  {&(_ZTV8G29x15y5[21]),  21,22},
  {&(_tg__ZTV6E29x15__8G29x15y5[5]),  5,6},
  {&(_tg__ZTV3C29__6E29x15__8G29x15y5[4]),  4,5},
  {&(_tg__ZTV2B1__6E29x15__8G29x15y5[3]),  3,4},
  {&(_tg__ZTV3C29__8G29x15y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__8G29x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x15y5[];
extern  VTBL_ENTRY _ZTV8G29x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x15y5[];
static VTBL_ENTRY alt_thunk_names743[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn8_N6E29x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn8_N6E29x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x15y5 = {  "G29x15y5", // class name
  bases_G29x15y5, 6,
  &(vtc_G29x15y5[0]), // expected_vtbl_contents
  &(vtt_G29x15y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G29x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x15y5),22, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x15y5),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names743,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x15y6  : E29x15 , virtual F0 {
  int ff;
  ~G29x15y6(); // tgen
  G29x15y6(); // tgen
};
//SIG(1 G29x15y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G29x15y6 ::~G29x15y6(){ note_dtor("G29x15y6", this);} // tgen
G29x15y6 ::G29x15y6(){ note_ctor("G29x15y6", this);} // tgen

static void Test_G29x15y6()
{
  extern Class_Descriptor cd_G29x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x15y6, buf);
    G29x15y6 *dp, &lv = *(dp=new (buf) G29x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x15y6)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(16,12), "G29x15y6");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(32,24), "G29x15y6");
    check_base_class_offset(lv, (C29*)(E29x15*), ABISELECT(16,12), "G29x15y6");
    check_base_class_offset(lv, (D0*)(E29x15*), ABISELECT(44,32), "G29x15y6");
    check_base_class_offset(lv, (E29x15*), 0, "G29x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G29x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x15y6.ff");
    test_class_info(&lv, &cd_G29x15y6);
    dp->~G29x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x15y6(Test_G29x15y6, "G29x15y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G29x15y6C1Ev();
extern void _ZN8G29x15y6D1Ev();
Name_Map name_map_G29x15y6[] = {
  NSPAIR(_ZN8G29x15y6C1Ev),
  NSPAIR(_ZN8G29x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x15;
extern VTBL_ENTRY _ZTI6E29x15[];
extern  VTBL_ENTRY _ZTV6E29x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x15y6[] = {
  // 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
    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(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
    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_E29x15,    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 _ZTI8G29x15y6[];
extern void _ZN6E29x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv)();
extern void ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn12_N6E29x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv)();
extern void ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn24_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x15y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x15y6[0]),
  (VTBL_ENTRY)&_ZN6E29x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G29x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G29x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv),
};
extern VTBL_ENTRY _ZTV8G29x15y6[];
extern void _ZN6E29x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x15__8G29x15y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&_ZN6E29x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv)();
extern void ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn12_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C29__6E29x15__8G29x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv)();
extern void ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn24_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x15__8G29x15y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__8G29x15y6[] = {
  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__8G29x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x15y6[] = {
  {&(_ZTV8G29x15y6[6]),  6,16},
  {&(_tg__ZTV6E29x15__8G29x15y6[5]),  5,6},
  {&(_tg__ZTV3C29__6E29x15__8G29x15y6[4]),  4,5},
  {&(_tg__ZTV2B1__6E29x15__8G29x15y6[3]),  3,4},
  {&(_ZTV8G29x15y6[11]),  11,16},
  {&(_ZTV8G29x15y6[15]),  15,16},
  {&(_tg__ZTV3C29__8G29x15y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__8G29x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x15y6[];
extern  VTBL_ENTRY _ZTV8G29x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x15y6[];
static VTBL_ENTRY alt_thunk_names744[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn24_N6E29x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn24_N6E29x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn12_N6E29x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn12_N6E29x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x15y6 = {  "G29x15y6", // class name
  bases_G29x15y6, 6,
  &(vtc_G29x15y6[0]), // expected_vtbl_contents
  &(vtt_G29x15y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G29x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x15y6),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x15y6),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names744,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x15y7  : virtual E29x15 , virtual F0 {
  int ff;
  ~G29x15y7(); // tgen
  G29x15y7(); // tgen
};
//SIG(1 G29x15y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G29x15y7 ::~G29x15y7(){ note_dtor("G29x15y7", this);} // tgen
G29x15y7 ::G29x15y7(){ note_ctor("G29x15y7", this);} // tgen

static void Test_G29x15y7()
{
  extern Class_Descriptor cd_G29x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G29x15y7, buf);
    G29x15y7 *dp, &lv = *(dp=new (buf) G29x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G29x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x15y7)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,16), "G29x15y7");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,28), "G29x15y7");
    check_base_class_offset(lv, (C29*)(E29x15*), ABISELECT(32,16), "G29x15y7");
    check_base_class_offset(lv, (D0*)(E29x15*), ABISELECT(60,36), "G29x15y7");
    check_base_class_offset(lv, (E29x15*), ABISELECT(16,8), "G29x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G29x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G29x15y7.ff");
    test_class_info(&lv, &cd_G29x15y7);
    dp->~G29x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x15y7(Test_G29x15y7, "G29x15y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G29x15y7C1Ev();
extern void _ZN8G29x15y7D1Ev();
Name_Map name_map_G29x15y7[] = {
  NSPAIR(_ZN8G29x15y7C1Ev),
  NSPAIR(_ZN8G29x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E29x15;
extern VTBL_ENTRY _ZTI6E29x15[];
extern  VTBL_ENTRY _ZTV6E29x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E29x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x15y7[] = {
  // 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
    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_C29,    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
    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_E29x15,    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 _ZTI8G29x15y7[];
extern void _ZN6E29x153fooEv();
extern void ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv)();
extern void ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn8_N6E29x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv)();
extern void ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x15y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G29x15y7[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G29x15y7[0]),
  (VTBL_ENTRY)&_ZN6E29x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G29x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G29x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv),
};
extern VTBL_ENTRY _ZTV8G29x15y7[];
extern void _ZN6E29x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E29x15__8G29x15y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&_ZN6E29x153fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv)();
extern void ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn8_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C29__6E29x15__8G29x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv)();
extern void ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E29x15__8G29x15y7[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E29x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__8G29x15y7[] = {
  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__8G29x15y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x15y7[] = {
  {&(_ZTV8G29x15y7[7]),  7,23},
  {&(_ZTV8G29x15y7[13]),  13,23},
  {&(_ZTV8G29x15y7[18]),  18,23},
  {&(_ZTV8G29x15y7[22]),  22,23},
  {&(_tg__ZTV6E29x15__8G29x15y7[5]),  5,6},
  {&(_tg__ZTV3C29__6E29x15__8G29x15y7[4]),  4,5},
  {&(_tg__ZTV2B1__6E29x15__8G29x15y7[3]),  3,4},
  {&(_tg__ZTV3C29__8G29x15y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__8G29x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G29x15y7[];
extern  VTBL_ENTRY _ZTV8G29x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G29x15y7[];
static VTBL_ENTRY alt_thunk_names745[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E29x153fooEv,_ZTv0_n12_N6E29x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E29x153fooEv,_ZThn20_N6E29x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6E29x153fooEv,_ZTv0_n16_N6E29x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn8_N6E29x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E29x153fooEv,_ZThn8_N6E29x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x15y7 = {  "G29x15y7", // class name
  bases_G29x15y7, 6,
  &(vtc_G29x15y7[0]), // expected_vtbl_contents
  &(vtt_G29x15y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G29x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G29x15y7),23, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G29x15y7),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names745,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E30x15  : virtual C30 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E30x153fooEv
  ~E30x15(); // tgen
  E30x15(); // tgen
};
//SIG(-1 E30x15) C1{ VBC2{ VBC3{ Fi} VBC4{ v1 Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E30x15 ::foo(){vfunc_called(this, "_ZN6E30x153fooEv");}
E30x15 ::~E30x15(){ note_dtor("E30x15", this);} // tgen
E30x15 ::E30x15(){ note_ctor("E30x15", this);} // tgen

static void Test_E30x15()
{
  extern Class_Descriptor cd_E30x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E30x15, buf);
    E30x15 *dp, &lv = *(dp=new (buf) E30x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E30x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E30x15)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(28,16), "E30x15");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(32,20), "E30x15");
    check_base_class_offset(lv, (C30*), ABISELECT(16,8), "E30x15");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E30x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E30x15.fd");
    test_class_info(&lv, &cd_E30x15);
    dp->~E30x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE30x15(Test_E30x15, "E30x15", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN6E30x15C1Ev();
extern void _ZN6E30x15D1Ev();
Name_Map name_map_E30x15[] = {
  NSPAIR(_ZN6E30x15C1Ev),
  NSPAIR(_ZN6E30x15D1Ev),
  {0,0}
};
extern Class_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_E30x15[] = {
  // 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
    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,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_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 _ZTI6E30x15[];
extern void _ZN6E30x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv)();
extern void ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn8_N6E30x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv)();
extern void ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E30x15[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&_ZN6E30x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv),
};
extern VTBL_ENTRY _ZTV6E30x15[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__6E30x15[] = {
  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__6E30x15[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_E30x15[] = {
  {&(_ZTV6E30x15[6]),  6,17},
  {&(_ZTV6E30x15[12]),  12,17},
  {&(_ZTV6E30x15[16]),  16,17},
  {&(_tg__ZTV3C30__6E30x15[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__6E30x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E30x15[];
extern  VTBL_ENTRY _ZTV6E30x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x15[];
static VTBL_ENTRY alt_thunk_names746[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn8_N6E30x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E30x15 = {  "E30x15", // class name
  bases_E30x15, 4,
  &(vtc_E30x15[0]), // expected_vtbl_contents
  &(vtt_E30x15[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI6E30x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E30x15),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E30x15),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names746,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x15y0  : E30x15 , F1 {
  int ff;
  ~G30x15y0(); // tgen
  G30x15y0(); // tgen
};
//SIG(1 G30x15y0) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G30x15y0 ::~G30x15y0(){ note_dtor("G30x15y0", this);} // tgen
G30x15y0 ::G30x15y0(){ note_ctor("G30x15y0", this);} // tgen

static void Test_G30x15y0()
{
  extern Class_Descriptor cd_G30x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G30x15y0, buf);
    G30x15y0 *dp, &lv = *(dp=new (buf) G30x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G30x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x15y0)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,28), "G30x15y0");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,32), "G30x15y0");
    check_base_class_offset(lv, (C30*)(E30x15*), ABISELECT(32,20), "G30x15y0");
    check_base_class_offset(lv, (D0*)(E30x15*), ABISELECT(60,40), "G30x15y0");
    check_base_class_offset(lv, (E30x15*), 0, "G30x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G30x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G30x15y0.ff");
    test_class_info(&lv, &cd_G30x15y0);
    dp->~G30x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x15y0(Test_G30x15y0, "G30x15y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G30x15y0C1Ev();
extern void _ZN8G30x15y0D1Ev();
Name_Map name_map_G30x15y0[] = {
  NSPAIR(_ZN8G30x15y0C1Ev),
  NSPAIR(_ZN8G30x15y0D1Ev),
  {0,0}
};
extern Class_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_E30x15;
extern VTBL_ENTRY _ZTI6E30x15[];
extern  VTBL_ENTRY _ZTV6E30x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x15y0[] = {
  // 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)
    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
    10, //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_E30x15,    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
    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
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI8G30x15y0[];
extern void _ZN6E30x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv)();
extern void ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv)();
extern void ABISELECT(_ZThn48_N6E30x153fooEv,_ZThn32_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x15y0[0]),
  (VTBL_ENTRY)&_ZN6E30x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G30x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G30x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G30x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv),
};
extern VTBL_ENTRY _ZTV8G30x15y0[];
extern void _ZN6E30x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x15__8G30x15y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&_ZN6E30x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv)();
extern void ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C30__6E30x15__8G30x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv)();
extern void ABISELECT(_ZThn48_N6E30x153fooEv,_ZThn32_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x15__8G30x15y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__8G30x15y0[] = {
  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__8G30x15y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x15y0[] = {
  {&(_ZTV8G30x15y0[6]),  6,20},
  {&(_tg__ZTV6E30x15__8G30x15y0[6]),  6,7},
  {&(_tg__ZTV3C30__6E30x15__8G30x15y0[5]),  5,6},
  {&(_tg__ZTV2B1__6E30x15__8G30x15y0[3]),  3,4},
  {&(_ZTV8G30x15y0[15]),  15,20},
  {&(_ZTV8G30x15y0[19]),  19,20},
  {&(_tg__ZTV3C30__8G30x15y0[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__8G30x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x15y0[];
extern  VTBL_ENTRY _ZTV8G30x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x15y0[];
static VTBL_ENTRY alt_thunk_names747[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E30x153fooEv,_ZThn32_N6E30x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E30x153fooEv,_ZThn32_N6E30x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x15y0 = {  "G30x15y0", // class name
  bases_G30x15y0, 6,
  &(vtc_G30x15y0[0]), // expected_vtbl_contents
  &(vtt_G30x15y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G30x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x15y0),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x15y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names747,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x15y1  : virtual E30x15 , F1 {
  int ff;
  ~G30x15y1(); // tgen
  G30x15y1(); // tgen
};
//SIG(1 G30x15y1) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G30x15y1 ::~G30x15y1(){ note_dtor("G30x15y1", this);} // tgen
G30x15y1 ::G30x15y1(){ note_ctor("G30x15y1", this);} // tgen

static void Test_G30x15y1()
{
  extern Class_Descriptor cd_G30x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G30x15y1, buf);
    G30x15y1 *dp, &lv = *(dp=new (buf) G30x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G30x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x15y1)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,28), "G30x15y1");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,32), "G30x15y1");
    check_base_class_offset(lv, (C30*)(E30x15*), ABISELECT(32,20), "G30x15y1");
    check_base_class_offset(lv, (D0*)(E30x15*), ABISELECT(60,40), "G30x15y1");
    check_base_class_offset(lv, (E30x15*), ABISELECT(16,12), "G30x15y1");
    check_base_class_offset(lv, (F1*), 0, "G30x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x15y1.ff");
    test_class_info(&lv, &cd_G30x15y1);
    dp->~G30x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x15y1(Test_G30x15y1, "G30x15y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G30x15y1C1Ev();
extern void _ZN8G30x15y1D1Ev();
Name_Map name_map_G30x15y1[] = {
  NSPAIR(_ZN8G30x15y1C1Ev),
  NSPAIR(_ZN8G30x15y1D1Ev),
  {0,0}
};
extern Class_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_E30x15;
extern VTBL_ENTRY _ZTI6E30x15[];
extern  VTBL_ENTRY _ZTV6E30x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x15y1[] = {
  // 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
    22, //bcp->virtual_function_table_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
    16, //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_E30x15,    ABISELECT(16,12), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G30x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E30x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv)();
extern void ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn8_N6E30x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv)();
extern void ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x15y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G30x15y1[0]),
  (VTBL_ENTRY)&_ZN6E30x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G30x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G30x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv),
};
extern VTBL_ENTRY _ZTV8G30x15y1[];
extern void _ZN6E30x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x15__8G30x15y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&_ZN6E30x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv)();
extern void ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn8_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C30__6E30x15__8G30x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv)();
extern void ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x15__8G30x15y1[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__8G30x15y1[] = {
  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__8G30x15y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x15y1[] = {
  {&(_ZTV8G30x15y1[7]),  7,26},
  {&(_ZTV8G30x15y1[15]),  15,26},
  {&(_ZTV8G30x15y1[21]),  21,26},
  {&(_ZTV8G30x15y1[25]),  25,26},
  {&(_tg__ZTV6E30x15__8G30x15y1[6]),  6,7},
  {&(_tg__ZTV3C30__6E30x15__8G30x15y1[5]),  5,6},
  {&(_tg__ZTV2B1__6E30x15__8G30x15y1[3]),  3,4},
  {&(_tg__ZTV3C30__8G30x15y1[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__8G30x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x15y1[];
extern  VTBL_ENTRY _ZTV8G30x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x15y1[];
static VTBL_ENTRY alt_thunk_names748[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn8_N6E30x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn8_N6E30x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x15y1 = {  "G30x15y1", // class name
  bases_G30x15y1, 6,
  &(vtc_G30x15y1[0]), // expected_vtbl_contents
  &(vtt_G30x15y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G30x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x15y1),26, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x15y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names748,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x15y2  : E30x15 , virtual F1 {
  int ff;
  ~G30x15y2(); // tgen
  G30x15y2(); // tgen
};
//SIG(1 G30x15y2) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G30x15y2 ::~G30x15y2(){ note_dtor("G30x15y2", this);} // tgen
G30x15y2 ::G30x15y2(){ note_ctor("G30x15y2", this);} // tgen

static void Test_G30x15y2()
{
  extern Class_Descriptor cd_G30x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G30x15y2, buf);
    G30x15y2 *dp, &lv = *(dp=new (buf) G30x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G30x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x15y2)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(28,20), "G30x15y2");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(32,24), "G30x15y2");
    check_base_class_offset(lv, (C30*)(E30x15*), ABISELECT(16,12), "G30x15y2");
    check_base_class_offset(lv, (D0*)(E30x15*), ABISELECT(44,32), "G30x15y2");
    check_base_class_offset(lv, (E30x15*), 0, "G30x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G30x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x15y2.ff");
    test_class_info(&lv, &cd_G30x15y2);
    dp->~G30x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x15y2(Test_G30x15y2, "G30x15y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G30x15y2C1Ev();
extern void _ZN8G30x15y2D1Ev();
Name_Map name_map_G30x15y2[] = {
  NSPAIR(_ZN8G30x15y2C1Ev),
  NSPAIR(_ZN8G30x15y2D1Ev),
  {0,0}
};
extern Class_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_E30x15;
extern VTBL_ENTRY _ZTI6E30x15[];
extern  VTBL_ENTRY _ZTV6E30x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x15y2[] = {
  // 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
    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(16,12), //bcp->offset
    8, //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_E30x15,    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
    18, //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 _ZTI8G30x15y2[];
extern void _ZN6E30x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv)();
extern void ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn12_N6E30x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv)();
extern void ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn24_N6E30x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G30x15y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x15y2[0]),
  (VTBL_ENTRY)&_ZN6E30x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G30x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G30x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI8G30x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G30x15y2[];
extern void _ZN6E30x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x15__8G30x15y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&_ZN6E30x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv)();
extern void ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn12_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C30__6E30x15__8G30x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv)();
extern void ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn24_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x15__8G30x15y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__8G30x15y2[] = {
  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__8G30x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x15y2[] = {
  {&(_ZTV8G30x15y2[7]),  7,22},
  {&(_tg__ZTV6E30x15__8G30x15y2[6]),  6,7},
  {&(_tg__ZTV3C30__6E30x15__8G30x15y2[5]),  5,6},
  {&(_tg__ZTV2B1__6E30x15__8G30x15y2[3]),  3,4},
  {&(_ZTV8G30x15y2[13]),  13,22},
  {&(_ZTV8G30x15y2[17]),  17,22},
  {&(_ZTV8G30x15y2[21]),  21,22},
  {&(_tg__ZTV3C30__8G30x15y2[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__8G30x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x15y2[];
extern  VTBL_ENTRY _ZTV8G30x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x15y2[];
static VTBL_ENTRY alt_thunk_names749[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn24_N6E30x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn24_N6E30x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn12_N6E30x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn12_N6E30x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x15y2 = {  "G30x15y2", // class name
  bases_G30x15y2, 6,
  &(vtc_G30x15y2[0]), // expected_vtbl_contents
  &(vtt_G30x15y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G30x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x15y2),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x15y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names749,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x15y3  : virtual E30x15 , virtual F1 {
  int ff;
  ~G30x15y3(); // tgen
  G30x15y3(); // tgen
};
//SIG(1 G30x15y3) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G30x15y3 ::~G30x15y3(){ note_dtor("G30x15y3", this);} // tgen
G30x15y3 ::G30x15y3(){ note_ctor("G30x15y3", this);} // tgen

static void Test_G30x15y3()
{
  extern Class_Descriptor cd_G30x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G30x15y3, buf);
    G30x15y3 *dp, &lv = *(dp=new (buf) G30x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G30x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x15y3)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,24), "G30x15y3");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,28), "G30x15y3");
    check_base_class_offset(lv, (C30*)(E30x15*), ABISELECT(32,16), "G30x15y3");
    check_base_class_offset(lv, (D0*)(E30x15*), ABISELECT(60,36), "G30x15y3");
    check_base_class_offset(lv, (E30x15*), ABISELECT(16,8), "G30x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G30x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G30x15y3.ff");
    test_class_info(&lv, &cd_G30x15y3);
    dp->~G30x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x15y3(Test_G30x15y3, "G30x15y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G30x15y3C1Ev();
extern void _ZN8G30x15y3D1Ev();
Name_Map name_map_G30x15y3[] = {
  NSPAIR(_ZN8G30x15y3C1Ev),
  NSPAIR(_ZN8G30x15y3D1Ev),
  {0,0}
};
extern Class_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_E30x15;
extern VTBL_ENTRY _ZTI6E30x15[];
extern  VTBL_ENTRY _ZTV6E30x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x15y3[] = {
  // 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
    22, //bcp->virtual_function_table_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
    16, //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_E30x15,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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
    26, //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 _ZTI8G30x15y3[];
extern void _ZN6E30x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv)();
extern void ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn8_N6E30x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv)();
extern void ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G30x15y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x15y3[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G30x15y3[0]),
  (VTBL_ENTRY)&_ZN6E30x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G30x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G30x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G30x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G30x15y3[];
extern void _ZN6E30x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x15__8G30x15y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&_ZN6E30x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv)();
extern void ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn8_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C30__6E30x15__8G30x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv)();
extern void ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x15__8G30x15y3[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__8G30x15y3[] = {
  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__8G30x15y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x15y3[] = {
  {&(_ZTV8G30x15y3[8]),  8,30},
  {&(_ZTV8G30x15y3[15]),  15,30},
  {&(_ZTV8G30x15y3[21]),  21,30},
  {&(_ZTV8G30x15y3[25]),  25,30},
  {&(_ZTV8G30x15y3[29]),  29,30},
  {&(_tg__ZTV6E30x15__8G30x15y3[6]),  6,7},
  {&(_tg__ZTV3C30__6E30x15__8G30x15y3[5]),  5,6},
  {&(_tg__ZTV2B1__6E30x15__8G30x15y3[3]),  3,4},
  {&(_tg__ZTV3C30__8G30x15y3[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__8G30x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x15y3[];
extern  VTBL_ENTRY _ZTV8G30x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x15y3[];
static VTBL_ENTRY alt_thunk_names750[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn8_N6E30x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn8_N6E30x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x15y3 = {  "G30x15y3", // class name
  bases_G30x15y3, 6,
  &(vtc_G30x15y3[0]), // expected_vtbl_contents
  &(vtt_G30x15y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G30x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x15y3),30, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x15y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names750,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x15y4  : E30x15 , F0 {
  int ff;
  ~G30x15y4(); // tgen
  G30x15y4(); // tgen
};
//SIG(1 G30x15y4) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G30x15y4 ::~G30x15y4(){ note_dtor("G30x15y4", this);} // tgen
G30x15y4 ::G30x15y4(){ note_ctor("G30x15y4", this);} // tgen

static void Test_G30x15y4()
{
  extern Class_Descriptor cd_G30x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x15y4, buf);
    G30x15y4 *dp, &lv = *(dp=new (buf) G30x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x15y4)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(36,24), "G30x15y4");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(40,28), "G30x15y4");
    check_base_class_offset(lv, (C30*)(E30x15*), ABISELECT(24,16), "G30x15y4");
    check_base_class_offset(lv, (D0*)(E30x15*), ABISELECT(52,36), "G30x15y4");
    check_base_class_offset(lv, (E30x15*), 0, "G30x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G30x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G30x15y4.ff");
    test_class_info(&lv, &cd_G30x15y4);
    dp->~G30x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x15y4(Test_G30x15y4, "G30x15y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G30x15y4C1Ev();
extern void _ZN8G30x15y4D1Ev();
Name_Map name_map_G30x15y4[] = {
  NSPAIR(_ZN8G30x15y4C1Ev),
  NSPAIR(_ZN8G30x15y4D1Ev),
  {0,0}
};
extern Class_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_E30x15;
extern VTBL_ENTRY _ZTI6E30x15[];
extern  VTBL_ENTRY _ZTV6E30x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x15y4[] = {
  // 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
    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(24,16), //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(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_E30x15,    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 _ZTI8G30x15y4[];
extern void _ZN6E30x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv)();
extern void ABISELECT(_ZThn24_N6E30x153fooEv,_ZThn16_N6E30x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv)();
extern void ABISELECT(_ZThn40_N6E30x153fooEv,_ZThn28_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x15y4[0]),
  (VTBL_ENTRY)&_ZN6E30x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G30x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI8G30x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv),
};
extern VTBL_ENTRY _ZTV8G30x15y4[];
extern void _ZN6E30x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x15__8G30x15y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&_ZN6E30x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv)();
extern void ABISELECT(_ZThn24_N6E30x153fooEv,_ZThn16_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C30__6E30x15__8G30x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv)();
extern void ABISELECT(_ZThn40_N6E30x153fooEv,_ZThn28_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x15__8G30x15y4[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__8G30x15y4[] = {
  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__8G30x15y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x15y4[] = {
  {&(_ZTV8G30x15y4[6]),  6,17},
  {&(_tg__ZTV6E30x15__8G30x15y4[6]),  6,7},
  {&(_tg__ZTV3C30__6E30x15__8G30x15y4[5]),  5,6},
  {&(_tg__ZTV2B1__6E30x15__8G30x15y4[3]),  3,4},
  {&(_ZTV8G30x15y4[12]),  12,17},
  {&(_ZTV8G30x15y4[16]),  16,17},
  {&(_tg__ZTV3C30__8G30x15y4[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__8G30x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x15y4[];
extern  VTBL_ENTRY _ZTV8G30x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x15y4[];
static VTBL_ENTRY alt_thunk_names751[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E30x153fooEv,_ZThn28_N6E30x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E30x153fooEv,_ZThn28_N6E30x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x153fooEv,_ZThn16_N6E30x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E30x153fooEv,_ZThn16_N6E30x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x15y4 = {  "G30x15y4", // class name
  bases_G30x15y4, 6,
  &(vtc_G30x15y4[0]), // expected_vtbl_contents
  &(vtt_G30x15y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G30x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x15y4),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x15y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names751,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x15y5  : virtual E30x15 , F0 {
  int ff;
  ~G30x15y5(); // tgen
  G30x15y5(); // tgen
};
//SIG(1 G30x15y5) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G30x15y5 ::~G30x15y5(){ note_dtor("G30x15y5", this);} // tgen
G30x15y5 ::G30x15y5(){ note_ctor("G30x15y5", this);} // tgen

static void Test_G30x15y5()
{
  extern Class_Descriptor cd_G30x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G30x15y5, buf);
    G30x15y5 *dp, &lv = *(dp=new (buf) G30x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G30x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x15y5)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,28), "G30x15y5");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,32), "G30x15y5");
    check_base_class_offset(lv, (C30*)(E30x15*), ABISELECT(32,20), "G30x15y5");
    check_base_class_offset(lv, (D0*)(E30x15*), ABISELECT(60,40), "G30x15y5");
    check_base_class_offset(lv, (E30x15*), ABISELECT(16,12), "G30x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G30x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x15y5.ff");
    test_class_info(&lv, &cd_G30x15y5);
    dp->~G30x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x15y5(Test_G30x15y5, "G30x15y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN8G30x15y5C1Ev();
extern void _ZN8G30x15y5D1Ev();
Name_Map name_map_G30x15y5[] = {
  NSPAIR(_ZN8G30x15y5C1Ev),
  NSPAIR(_ZN8G30x15y5D1Ev),
  {0,0}
};
extern Class_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_E30x15;
extern VTBL_ENTRY _ZTI6E30x15[];
extern  VTBL_ENTRY _ZTV6E30x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x15y5[] = {
  // 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
    21, //bcp->virtual_function_table_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
    15, //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_E30x15,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G30x15y5[];
extern void _ZN6E30x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv)();
extern void ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn8_N6E30x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv)();
extern void ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x15y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x15y5[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G30x15y5[0]),
  (VTBL_ENTRY)&_ZN6E30x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G30x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI8G30x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv),
};
extern VTBL_ENTRY _ZTV8G30x15y5[];
extern void _ZN6E30x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x15__8G30x15y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&_ZN6E30x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv)();
extern void ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn8_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C30__6E30x15__8G30x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv)();
extern void ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x15__8G30x15y5[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__8G30x15y5[] = {
  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__8G30x15y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x15y5[] = {
  {&(_ZTV8G30x15y5[7]),  7,25},
  {&(_ZTV8G30x15y5[14]),  14,25},
  {&(_ZTV8G30x15y5[20]),  20,25},
  {&(_ZTV8G30x15y5[24]),  24,25},
  {&(_tg__ZTV6E30x15__8G30x15y5[6]),  6,7},
  {&(_tg__ZTV3C30__6E30x15__8G30x15y5[5]),  5,6},
  {&(_tg__ZTV2B1__6E30x15__8G30x15y5[3]),  3,4},
  {&(_tg__ZTV3C30__8G30x15y5[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__8G30x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x15y5[];
extern  VTBL_ENTRY _ZTV8G30x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x15y5[];
static VTBL_ENTRY alt_thunk_names752[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn8_N6E30x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn8_N6E30x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x15y5 = {  "G30x15y5", // class name
  bases_G30x15y5, 6,
  &(vtc_G30x15y5[0]), // expected_vtbl_contents
  &(vtt_G30x15y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI8G30x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x15y5),25, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x15y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names752,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x15y6  : E30x15 , virtual F0 {
  int ff;
  ~G30x15y6(); // tgen
  G30x15y6(); // tgen
};
//SIG(1 G30x15y6) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G30x15y6 ::~G30x15y6(){ note_dtor("G30x15y6", this);} // tgen
G30x15y6 ::G30x15y6(){ note_ctor("G30x15y6", this);} // tgen

static void Test_G30x15y6()
{
  extern Class_Descriptor cd_G30x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x15y6, buf);
    G30x15y6 *dp, &lv = *(dp=new (buf) G30x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x15y6)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(28,20), "G30x15y6");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(32,24), "G30x15y6");
    check_base_class_offset(lv, (C30*)(E30x15*), ABISELECT(16,12), "G30x15y6");
    check_base_class_offset(lv, (D0*)(E30x15*), ABISELECT(44,32), "G30x15y6");
    check_base_class_offset(lv, (E30x15*), 0, "G30x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G30x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x15y6.ff");
    test_class_info(&lv, &cd_G30x15y6);
    dp->~G30x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x15y6(Test_G30x15y6, "G30x15y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN8G30x15y6C1Ev();
extern void _ZN8G30x15y6D1Ev();
Name_Map name_map_G30x15y6[] = {
  NSPAIR(_ZN8G30x15y6C1Ev),
  NSPAIR(_ZN8G30x15y6D1Ev),
  {0,0}
};
extern Class_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_E30x15;
extern VTBL_ENTRY _ZTI6E30x15[];
extern  VTBL_ENTRY _ZTV6E30x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x15y6[] = {
  // 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
    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(16,12), //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(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_E30x15,    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 _ZTI8G30x15y6[];
extern void _ZN6E30x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv)();
extern void ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn12_N6E30x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv)();
extern void ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn24_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x15y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x15y6[0]),
  (VTBL_ENTRY)&_ZN6E30x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G30x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv),
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI8G30x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv),
};
extern VTBL_ENTRY _ZTV8G30x15y6[];
extern void _ZN6E30x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x15__8G30x15y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&_ZN6E30x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv)();
extern void ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn12_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C30__6E30x15__8G30x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv)();
extern void ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn24_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x15__8G30x15y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__8G30x15y6[] = {
  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__8G30x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x15y6[] = {
  {&(_ZTV8G30x15y6[7]),  7,18},
  {&(_tg__ZTV6E30x15__8G30x15y6[6]),  6,7},
  {&(_tg__ZTV3C30__6E30x15__8G30x15y6[5]),  5,6},
  {&(_tg__ZTV2B1__6E30x15__8G30x15y6[3]),  3,4},
  {&(_ZTV8G30x15y6[13]),  13,18},
  {&(_ZTV8G30x15y6[17]),  17,18},
  {&(_tg__ZTV3C30__8G30x15y6[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__8G30x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x15y6[];
extern  VTBL_ENTRY _ZTV8G30x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x15y6[];
static VTBL_ENTRY alt_thunk_names753[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn24_N6E30x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn24_N6E30x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn12_N6E30x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn12_N6E30x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x15y6 = {  "G30x15y6", // class name
  bases_G30x15y6, 6,
  &(vtc_G30x15y6[0]), // expected_vtbl_contents
  &(vtt_G30x15y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI8G30x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x15y6),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x15y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names753,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x15y7  : virtual E30x15 , virtual F0 {
  int ff;
  ~G30x15y7(); // tgen
  G30x15y7(); // tgen
};
//SIG(1 G30x15y7) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G30x15y7 ::~G30x15y7(){ note_dtor("G30x15y7", this);} // tgen
G30x15y7 ::G30x15y7(){ note_ctor("G30x15y7", this);} // tgen

static void Test_G30x15y7()
{
  extern Class_Descriptor cd_G30x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G30x15y7, buf);
    G30x15y7 *dp, &lv = *(dp=new (buf) G30x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G30x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x15y7)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,24), "G30x15y7");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,28), "G30x15y7");
    check_base_class_offset(lv, (C30*)(E30x15*), ABISELECT(32,16), "G30x15y7");
    check_base_class_offset(lv, (D0*)(E30x15*), ABISELECT(60,36), "G30x15y7");
    check_base_class_offset(lv, (E30x15*), ABISELECT(16,8), "G30x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G30x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G30x15y7.ff");
    test_class_info(&lv, &cd_G30x15y7);
    dp->~G30x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x15y7(Test_G30x15y7, "G30x15y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G30x15y7C1Ev();
extern void _ZN8G30x15y7D1Ev();
Name_Map name_map_G30x15y7[] = {
  NSPAIR(_ZN8G30x15y7C1Ev),
  NSPAIR(_ZN8G30x15y7D1Ev),
  {0,0}
};
extern Class_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_E30x15;
extern VTBL_ENTRY _ZTI6E30x15[];
extern  VTBL_ENTRY _ZTV6E30x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E30x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x15y7[] = {
  // 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
    22, //bcp->virtual_function_table_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
    16, //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_E30x15,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G30x15y7[];
extern void _ZN6E30x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv)();
extern void ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn8_N6E30x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv)();
extern void ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x15y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G30x15y7[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G30x15y7[0]),
  (VTBL_ENTRY)&_ZN6E30x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G30x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G30x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv),
};
extern VTBL_ENTRY _ZTV8G30x15y7[];
extern void _ZN6E30x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E30x15__8G30x15y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&_ZN6E30x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv)();
extern void ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn8_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C30__6E30x15__8G30x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv)();
extern void ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E30x15__8G30x15y7[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E30x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__8G30x15y7[] = {
  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__8G30x15y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x15y7[] = {
  {&(_ZTV8G30x15y7[8]),  8,26},
  {&(_ZTV8G30x15y7[15]),  15,26},
  {&(_ZTV8G30x15y7[21]),  21,26},
  {&(_ZTV8G30x15y7[25]),  25,26},
  {&(_tg__ZTV6E30x15__8G30x15y7[6]),  6,7},
  {&(_tg__ZTV3C30__6E30x15__8G30x15y7[5]),  5,6},
  {&(_tg__ZTV2B1__6E30x15__8G30x15y7[3]),  3,4},
  {&(_tg__ZTV3C30__8G30x15y7[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__8G30x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G30x15y7[];
extern  VTBL_ENTRY _ZTV8G30x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G30x15y7[];
static VTBL_ENTRY alt_thunk_names754[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E30x153fooEv,_ZTv0_n12_N6E30x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E30x153fooEv,_ZThn20_N6E30x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E30x153fooEv,_ZTv0_n20_N6E30x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn8_N6E30x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E30x153fooEv,_ZThn8_N6E30x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x15y7 = {  "G30x15y7", // class name
  bases_G30x15y7, 6,
  &(vtc_G30x15y7[0]), // expected_vtbl_contents
  &(vtt_G30x15y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G30x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G30x15y7),26, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G30x15y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names754,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E31x15  : virtual C31 , virtual D0 {
  int fd;
  virtual void  foo(); // _ZN6E31x153fooEv
  ~E31x15(); // tgen
  E31x15(); // tgen
};
//SIG(-1 E31x15) C1{ VBC2{ VBC3{ v1 Fi} VBC4{ v1 Fi} v1 Fi} VBC5{ Fi} v1 Fi}


void  E31x15 ::foo(){vfunc_called(this, "_ZN6E31x153fooEv");}
E31x15 ::~E31x15(){ note_dtor("E31x15", this);} // tgen
E31x15 ::E31x15(){ note_ctor("E31x15", this);} // tgen

static void Test_E31x15()
{
  extern Class_Descriptor cd_E31x15;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_E31x15, buf);
    E31x15 *dp, &lv = *(dp=new (buf) E31x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(E31x15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E31x15)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(32,16), "E31x15");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(48,24), "E31x15");
    check_base_class_offset(lv, (C31*), ABISELECT(16,8), "E31x15");
    check_base_class_offset(lv, (D0*), ABISELECT(60,32), "E31x15");
    check_field_offset(lv, fd, ABISELECT(8,4), "E31x15.fd");
    test_class_info(&lv, &cd_E31x15);
    dp->~E31x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE31x15(Test_E31x15, "E31x15", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN6E31x15C1Ev();
extern void _ZN6E31x15D1Ev();
Name_Map name_map_E31x15[] = {
  NSPAIR(_ZN6E31x15C1Ev),
  NSPAIR(_ZN6E31x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x15[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //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,24), //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,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_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 _ZTI6E31x15[];
extern void _ZN6E31x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv)();
extern void ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn8_N6E31x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn16_N6E31x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn24_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E31x15[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&_ZN6E31x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern VTBL_ENTRY _ZTV6E31x15[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__6E31x15[] = {
  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__6E31x15[] = {
  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__6E31x15[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_E31x15[] = {
  {&(_ZTV6E31x15[6]),  6,21},
  {&(_ZTV6E31x15[12]),  12,21},
  {&(_ZTV6E31x15[16]),  16,21},
  {&(_ZTV6E31x15[20]),  20,21},
  {&(_tg__ZTV3C31__6E31x15[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__6E31x15[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__6E31x15[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6E31x15[];
extern  VTBL_ENTRY _ZTV6E31x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x15[];
static VTBL_ENTRY alt_thunk_names755[] = {
  (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,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn24_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn16_N6E31x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn8_N6E31x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E31x15 = {  "E31x15", // class name
  bases_E31x15, 4,
  &(vtc_E31x15[0]), // expected_vtbl_contents
  &(vtt_E31x15[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI6E31x15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6E31x15),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6E31x15),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names755,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x15y0  : E31x15 , F1 {
  int ff;
  ~G31x15y0(); // tgen
  G31x15y0(); // tgen
};
//SIG(1 G31x15y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G31x15y0 ::~G31x15y0(){ note_dtor("G31x15y0", this);} // tgen
G31x15y0 ::G31x15y0(){ note_ctor("G31x15y0", this);} // tgen

static void Test_G31x15y0()
{
  extern Class_Descriptor cd_G31x15y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G31x15y0, buf);
    G31x15y0 *dp, &lv = *(dp=new (buf) G31x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G31x15y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x15y0)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,28), "G31x15y0");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,36), "G31x15y0");
    check_base_class_offset(lv, (C31*)(E31x15*), ABISELECT(32,20), "G31x15y0");
    check_base_class_offset(lv, (D0*)(E31x15*), ABISELECT(76,44), "G31x15y0");
    check_base_class_offset(lv, (E31x15*), 0, "G31x15y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G31x15y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G31x15y0.ff");
    test_class_info(&lv, &cd_G31x15y0);
    dp->~G31x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x15y0(Test_G31x15y0, "G31x15y0", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G31x15y0C1Ev();
extern void _ZN8G31x15y0D1Ev();
Name_Map name_map_G31x15y0[] = {
  NSPAIR(_ZN8G31x15y0C1Ev),
  NSPAIR(_ZN8G31x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x15;
extern VTBL_ENTRY _ZTI6E31x15[];
extern  VTBL_ENTRY _ZTV6E31x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x15y0[] = {
  // 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)
    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
    20, //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
    10, //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_E31x15,    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
    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 _ZTI8G31x15y0[];
extern void _ZN6E31x153fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv)();
extern void ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn20_N6E31x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn28_N6E31x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn64_N6E31x153fooEv,_ZThn36_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x15y0[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x15y0[0]),
  (VTBL_ENTRY)&_ZN6E31x153fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G31x15y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-20),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G31x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv),
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G31x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
  ABISELECT(-64,-36),
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI8G31x15y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern VTBL_ENTRY _ZTV8G31x15y0[];
extern void _ZN6E31x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x15__8G31x15y0[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&_ZN6E31x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv)();
extern void ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn20_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C31__6E31x15__8G31x15y0[] = {
  ABISELECT(-32,-20),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn28_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x15__8G31x15y0[] = {
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn64_N6E31x153fooEv,_ZThn36_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x15__8G31x15y0[] = {
  ABISELECT(-64,-36),
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__8G31x15y0[] = {
  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__8G31x15y0[] = {
  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__8G31x15y0[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x15y0[] = {
  {&(_ZTV8G31x15y0[6]),  6,24},
  {&(_tg__ZTV6E31x15__8G31x15y0[6]),  6,7},
  {&(_tg__ZTV3C31__6E31x15__8G31x15y0[5]),  5,6},
  {&(_tg__ZTV2A1__6E31x15__8G31x15y0[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x15__8G31x15y0[3]),  3,4},
  {&(_ZTV8G31x15y0[15]),  15,24},
  {&(_ZTV8G31x15y0[19]),  19,24},
  {&(_ZTV8G31x15y0[23]),  23,24},
  {&(_tg__ZTV3C31__8G31x15y0[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__8G31x15y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__8G31x15y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x15y0[];
extern  VTBL_ENTRY _ZTV8G31x15y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x15y0[];
static VTBL_ENTRY alt_thunk_names756[] = {
  (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,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn64_N6E31x153fooEv,_ZThn36_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn28_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn64_N6E31x153fooEv,_ZThn36_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn28_N6E31x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn20_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn20_N6E31x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x15y0 = {  "G31x15y0", // class name
  bases_G31x15y0, 6,
  &(vtc_G31x15y0[0]), // expected_vtbl_contents
  &(vtt_G31x15y0[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G31x15y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x15y0),24, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x15y0),11, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names756,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x15y1  : virtual E31x15 , F1 {
  int ff;
  ~G31x15y1(); // tgen
  G31x15y1(); // tgen
};
//SIG(1 G31x15y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ v2 Fi} Fi}


G31x15y1 ::~G31x15y1(){ note_dtor("G31x15y1", this);} // tgen
G31x15y1 ::G31x15y1(){ note_ctor("G31x15y1", this);} // tgen

static void Test_G31x15y1()
{
  extern Class_Descriptor cd_G31x15y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G31x15y1, buf);
    G31x15y1 *dp, &lv = *(dp=new (buf) G31x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G31x15y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x15y1)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,28), "G31x15y1");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,36), "G31x15y1");
    check_base_class_offset(lv, (C31*)(E31x15*), ABISELECT(32,20), "G31x15y1");
    check_base_class_offset(lv, (D0*)(E31x15*), ABISELECT(76,44), "G31x15y1");
    check_base_class_offset(lv, (E31x15*), ABISELECT(16,12), "G31x15y1");
    check_base_class_offset(lv, (F1*), 0, "G31x15y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x15y1.ff");
    test_class_info(&lv, &cd_G31x15y1);
    dp->~G31x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x15y1(Test_G31x15y1, "G31x15y1", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G31x15y1C1Ev();
extern void _ZN8G31x15y1D1Ev();
Name_Map name_map_G31x15y1[] = {
  NSPAIR(_ZN8G31x15y1C1Ev),
  NSPAIR(_ZN8G31x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x15;
extern VTBL_ENTRY _ZTI6E31x15[];
extern  VTBL_ENTRY _ZTV6E31x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x15y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    22, //bcp->virtual_function_table_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
    26, //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
    16, //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_E31x15,    ABISELECT(16,12), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G31x15y1[];
extern void _ZN2F13fooEv();
extern void _ZN6E31x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv)();
extern void ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn8_N6E31x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn16_N6E31x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn24_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x15y1[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x15y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G31x15y1[0]),
  (VTBL_ENTRY)&_ZN6E31x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G31x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G31x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI8G31x15y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern VTBL_ENTRY _ZTV8G31x15y1[];
extern void _ZN6E31x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x15__8G31x15y1[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&_ZN6E31x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv)();
extern void ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn8_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C31__6E31x15__8G31x15y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn16_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x15__8G31x15y1[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn24_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x15__8G31x15y1[] = {
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__8G31x15y1[] = {
  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__8G31x15y1[] = {
  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__8G31x15y1[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x15y1[] = {
  {&(_ZTV8G31x15y1[7]),  7,30},
  {&(_ZTV8G31x15y1[15]),  15,30},
  {&(_ZTV8G31x15y1[21]),  21,30},
  {&(_ZTV8G31x15y1[25]),  25,30},
  {&(_ZTV8G31x15y1[29]),  29,30},
  {&(_tg__ZTV6E31x15__8G31x15y1[6]),  6,7},
  {&(_tg__ZTV3C31__6E31x15__8G31x15y1[5]),  5,6},
  {&(_tg__ZTV2A1__6E31x15__8G31x15y1[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x15__8G31x15y1[3]),  3,4},
  {&(_tg__ZTV3C31__8G31x15y1[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__8G31x15y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__8G31x15y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x15y1[];
extern  VTBL_ENTRY _ZTV8G31x15y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x15y1[];
static VTBL_ENTRY alt_thunk_names757[] = {
  (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,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn24_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn16_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn24_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn16_N6E31x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn8_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn8_N6E31x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x15y1 = {  "G31x15y1", // class name
  bases_G31x15y1, 6,
  &(vtc_G31x15y1[0]), // expected_vtbl_contents
  &(vtt_G31x15y1[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G31x15y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x15y1),30, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x15y1),12, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names757,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x15y2  : E31x15 , virtual F1 {
  int ff;
  ~G31x15y2(); // tgen
  G31x15y2(); // tgen
};
//SIG(1 G31x15y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G31x15y2 ::~G31x15y2(){ note_dtor("G31x15y2", this);} // tgen
G31x15y2 ::G31x15y2(){ note_ctor("G31x15y2", this);} // tgen

static void Test_G31x15y2()
{
  extern Class_Descriptor cd_G31x15y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G31x15y2, buf);
    G31x15y2 *dp, &lv = *(dp=new (buf) G31x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G31x15y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x15y2)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(32,20), "G31x15y2");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(48,28), "G31x15y2");
    check_base_class_offset(lv, (C31*)(E31x15*), ABISELECT(16,12), "G31x15y2");
    check_base_class_offset(lv, (D0*)(E31x15*), ABISELECT(60,36), "G31x15y2");
    check_base_class_offset(lv, (E31x15*), 0, "G31x15y2");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G31x15y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x15y2.ff");
    test_class_info(&lv, &cd_G31x15y2);
    dp->~G31x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x15y2(Test_G31x15y2, "G31x15y2", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G31x15y2C1Ev();
extern void _ZN8G31x15y2D1Ev();
Name_Map name_map_G31x15y2[] = {
  NSPAIR(_ZN8G31x15y2C1Ev),
  NSPAIR(_ZN8G31x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x15;
extern VTBL_ENTRY _ZTI6E31x15[];
extern  VTBL_ENTRY _ZTV6E31x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x15y2[] = {
  // 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)
    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
    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(16,12), //bcp->offset
    8, //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_E31x15,    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
    22, //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 _ZTI8G31x15y2[];
extern void _ZN6E31x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv)();
extern void ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn12_N6E31x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn20_N6E31x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn28_N6E31x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G31x15y2[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x15y2[0]),
  (VTBL_ENTRY)&_ZN6E31x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G31x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G31x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G31x15y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI8G31x15y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G31x15y2[];
extern void _ZN6E31x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x15__8G31x15y2[] = {
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&_ZN6E31x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv)();
extern void ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn12_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C31__6E31x15__8G31x15y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn20_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x15__8G31x15y2[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn28_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x15__8G31x15y2[] = {
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__8G31x15y2[] = {
  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__8G31x15y2[] = {
  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__8G31x15y2[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x15y2[] = {
  {&(_ZTV8G31x15y2[7]),  7,26},
  {&(_tg__ZTV6E31x15__8G31x15y2[6]),  6,7},
  {&(_tg__ZTV3C31__6E31x15__8G31x15y2[5]),  5,6},
  {&(_tg__ZTV2A1__6E31x15__8G31x15y2[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x15__8G31x15y2[3]),  3,4},
  {&(_ZTV8G31x15y2[13]),  13,26},
  {&(_ZTV8G31x15y2[17]),  17,26},
  {&(_ZTV8G31x15y2[21]),  21,26},
  {&(_ZTV8G31x15y2[25]),  25,26},
  {&(_tg__ZTV3C31__8G31x15y2[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__8G31x15y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__8G31x15y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x15y2[];
extern  VTBL_ENTRY _ZTV8G31x15y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x15y2[];
static VTBL_ENTRY alt_thunk_names758[] = {
  (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,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn28_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn20_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn28_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn20_N6E31x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn12_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn12_N6E31x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x15y2 = {  "G31x15y2", // class name
  bases_G31x15y2, 6,
  &(vtc_G31x15y2[0]), // expected_vtbl_contents
  &(vtt_G31x15y2[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G31x15y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x15y2),26, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x15y2),12, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names758,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x15y3  : virtual E31x15 , virtual F1 {
  int ff;
  ~G31x15y3(); // tgen
  G31x15y3(); // tgen
};
//SIG(1 G31x15y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ v2 Fi} Fi}


G31x15y3 ::~G31x15y3(){ note_dtor("G31x15y3", this);} // tgen
G31x15y3 ::G31x15y3(){ note_ctor("G31x15y3", this);} // tgen

static void Test_G31x15y3()
{
  extern Class_Descriptor cd_G31x15y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(13,14)];
    init_test(&cd_G31x15y3, buf);
    G31x15y3 *dp, &lv = *(dp=new (buf) G31x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(96,52), "sizeof(G31x15y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x15y3)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,24), "G31x15y3");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,32), "G31x15y3");
    check_base_class_offset(lv, (C31*)(E31x15*), ABISELECT(32,16), "G31x15y3");
    check_base_class_offset(lv, (D0*)(E31x15*), ABISELECT(76,40), "G31x15y3");
    check_base_class_offset(lv, (E31x15*), ABISELECT(16,8), "G31x15y3");
    check_base_class_offset(lv, (F1*), ABISELECT(80,44), "G31x15y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G31x15y3.ff");
    test_class_info(&lv, &cd_G31x15y3);
    dp->~G31x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x15y3(Test_G31x15y3, "G31x15y3", ABISELECT(96,52));

#else // __cplusplus

extern void _ZN8G31x15y3C1Ev();
extern void _ZN8G31x15y3D1Ev();
Name_Map name_map_G31x15y3[] = {
  NSPAIR(_ZN8G31x15y3C1Ev),
  NSPAIR(_ZN8G31x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x15;
extern VTBL_ENTRY _ZTI6E31x15[];
extern  VTBL_ENTRY _ZTV6E31x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x15[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x15y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,24), //bcp->offset
    22, //bcp->virtual_function_table_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
    26, //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
    16, //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_E31x15,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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
    30, //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 _ZTI8G31x15y3[];
extern void _ZN6E31x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv)();
extern void ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn8_N6E31x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn16_N6E31x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn24_N6E31x153fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G31x15y3[] = {
  ABISELECT(80,44),
  ABISELECT(76,40),
  ABISELECT(64,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x15y3[0]),
  0,
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G31x15y3[0]),
  (VTBL_ENTRY)&_ZN6E31x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G31x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI8G31x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-64,-32),
  (VTBL_ENTRY)&(_ZTI8G31x15y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
  0,
  ABISELECT(-80,-44),
  (VTBL_ENTRY)&(_ZTI8G31x15y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV8G31x15y3[];
extern void _ZN6E31x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x15__8G31x15y3[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&_ZN6E31x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv)();
extern void ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn8_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C31__6E31x15__8G31x15y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn16_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x15__8G31x15y3[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn24_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x15__8G31x15y3[] = {
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__8G31x15y3[] = {
  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__8G31x15y3[] = {
  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__8G31x15y3[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x15y3[] = {
  {&(_ZTV8G31x15y3[8]),  8,34},
  {&(_ZTV8G31x15y3[15]),  15,34},
  {&(_ZTV8G31x15y3[21]),  21,34},
  {&(_ZTV8G31x15y3[25]),  25,34},
  {&(_ZTV8G31x15y3[29]),  29,34},
  {&(_ZTV8G31x15y3[33]),  33,34},
  {&(_tg__ZTV6E31x15__8G31x15y3[6]),  6,7},
  {&(_tg__ZTV3C31__6E31x15__8G31x15y3[5]),  5,6},
  {&(_tg__ZTV2A1__6E31x15__8G31x15y3[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x15__8G31x15y3[3]),  3,4},
  {&(_tg__ZTV3C31__8G31x15y3[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__8G31x15y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__8G31x15y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x15y3[];
extern  VTBL_ENTRY _ZTV8G31x15y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x15y3[];
static VTBL_ENTRY alt_thunk_names759[] = {
  (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,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn24_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn16_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn24_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn16_N6E31x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn8_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn8_N6E31x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x15y3 = {  "G31x15y3", // class name
  bases_G31x15y3, 6,
  &(vtc_G31x15y3[0]), // expected_vtbl_contents
  &(vtt_G31x15y3[0]), // expected_vtt_contents
  ABISELECT(96,52), // object size
  NSPAIRA(_ZTI8G31x15y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x15y3),34, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x15y3),13, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names759,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x15y4  : E31x15 , F0 {
  int ff;
  ~G31x15y4(); // tgen
  G31x15y4(); // tgen
};
//SIG(1 G31x15y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G31x15y4 ::~G31x15y4(){ note_dtor("G31x15y4", this);} // tgen
G31x15y4 ::G31x15y4(){ note_ctor("G31x15y4", this);} // tgen

static void Test_G31x15y4()
{
  extern Class_Descriptor cd_G31x15y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x15y4, buf);
    G31x15y4 *dp, &lv = *(dp=new (buf) G31x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x15y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x15y4)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(40,24), "G31x15y4");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(56,32), "G31x15y4");
    check_base_class_offset(lv, (C31*)(E31x15*), ABISELECT(24,16), "G31x15y4");
    check_base_class_offset(lv, (D0*)(E31x15*), ABISELECT(68,40), "G31x15y4");
    check_base_class_offset(lv, (E31x15*), 0, "G31x15y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G31x15y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G31x15y4.ff");
    test_class_info(&lv, &cd_G31x15y4);
    dp->~G31x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x15y4(Test_G31x15y4, "G31x15y4", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G31x15y4C1Ev();
extern void _ZN8G31x15y4D1Ev();
Name_Map name_map_G31x15y4[] = {
  NSPAIR(_ZN8G31x15y4C1Ev),
  NSPAIR(_ZN8G31x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x15;
extern VTBL_ENTRY _ZTI6E31x15[];
extern  VTBL_ENTRY _ZTV6E31x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x15y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //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(56,32), //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(24,16), //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(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_E31x15,    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 _ZTI8G31x15y4[];
extern void _ZN6E31x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv)();
extern void ABISELECT(_ZThn24_N6E31x153fooEv,_ZThn16_N6E31x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn40_N6E31x153fooEv,_ZThn24_N6E31x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn56_N6E31x153fooEv,_ZThn32_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x15y4[] = {
  ABISELECT(68,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x15y4[0]),
  (VTBL_ENTRY)&_ZN6E31x153fooEv,
  ABISELECT(-24,-16),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI8G31x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI8G31x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
  ABISELECT(-56,-32),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI8G31x15y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern VTBL_ENTRY _ZTV8G31x15y4[];
extern void _ZN6E31x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x15__8G31x15y4[] = {
  ABISELECT(68,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&_ZN6E31x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv)();
extern void ABISELECT(_ZThn24_N6E31x153fooEv,_ZThn16_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C31__6E31x15__8G31x15y4[] = {
  ABISELECT(-24,-16),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn40_N6E31x153fooEv,_ZThn24_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x15__8G31x15y4[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn56_N6E31x153fooEv,_ZThn32_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x15__8G31x15y4[] = {
  ABISELECT(-56,-32),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__8G31x15y4[] = {
  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__8G31x15y4[] = {
  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__8G31x15y4[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x15y4[] = {
  {&(_ZTV8G31x15y4[6]),  6,21},
  {&(_tg__ZTV6E31x15__8G31x15y4[6]),  6,7},
  {&(_tg__ZTV3C31__6E31x15__8G31x15y4[5]),  5,6},
  {&(_tg__ZTV2A1__6E31x15__8G31x15y4[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x15__8G31x15y4[3]),  3,4},
  {&(_ZTV8G31x15y4[12]),  12,21},
  {&(_ZTV8G31x15y4[16]),  16,21},
  {&(_ZTV8G31x15y4[20]),  20,21},
  {&(_tg__ZTV3C31__8G31x15y4[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__8G31x15y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__8G31x15y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x15y4[];
extern  VTBL_ENTRY _ZTV8G31x15y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x15y4[];
static VTBL_ENTRY alt_thunk_names760[] = {
  (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,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E31x153fooEv,_ZThn32_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x153fooEv,_ZThn24_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn56_N6E31x153fooEv,_ZThn32_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N6E31x153fooEv,_ZThn24_N6E31x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x153fooEv,_ZThn16_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6E31x153fooEv,_ZThn16_N6E31x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x15y4 = {  "G31x15y4", // class name
  bases_G31x15y4, 6,
  &(vtc_G31x15y4[0]), // expected_vtbl_contents
  &(vtt_G31x15y4[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G31x15y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x15y4),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x15y4),11, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names760,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x15y5  : virtual E31x15 , F0 {
  int ff;
  ~G31x15y5(); // tgen
  G31x15y5(); // tgen
};
//SIG(1 G31x15y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} BC7{ Fi} Fi}


G31x15y5 ::~G31x15y5(){ note_dtor("G31x15y5", this);} // tgen
G31x15y5 ::G31x15y5(){ note_ctor("G31x15y5", this);} // tgen

static void Test_G31x15y5()
{
  extern Class_Descriptor cd_G31x15y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G31x15y5, buf);
    G31x15y5 *dp, &lv = *(dp=new (buf) G31x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G31x15y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x15y5)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,28), "G31x15y5");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,36), "G31x15y5");
    check_base_class_offset(lv, (C31*)(E31x15*), ABISELECT(32,20), "G31x15y5");
    check_base_class_offset(lv, (D0*)(E31x15*), ABISELECT(76,44), "G31x15y5");
    check_base_class_offset(lv, (E31x15*), ABISELECT(16,12), "G31x15y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G31x15y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x15y5.ff");
    test_class_info(&lv, &cd_G31x15y5);
    dp->~G31x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x15y5(Test_G31x15y5, "G31x15y5", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN8G31x15y5C1Ev();
extern void _ZN8G31x15y5D1Ev();
Name_Map name_map_G31x15y5[] = {
  NSPAIR(_ZN8G31x15y5C1Ev),
  NSPAIR(_ZN8G31x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x15;
extern VTBL_ENTRY _ZTI6E31x15[];
extern  VTBL_ENTRY _ZTV6E31x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x15y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    21, //bcp->virtual_function_table_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
    25, //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
    15, //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_E31x15,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G31x15y5[];
extern void _ZN6E31x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv)();
extern void ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn8_N6E31x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn16_N6E31x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn24_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x15y5[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x15y5[0]),
  0,
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G31x15y5[0]),
  (VTBL_ENTRY)&_ZN6E31x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G31x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G31x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI8G31x15y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern VTBL_ENTRY _ZTV8G31x15y5[];
extern void _ZN6E31x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x15__8G31x15y5[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&_ZN6E31x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv)();
extern void ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn8_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C31__6E31x15__8G31x15y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn16_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x15__8G31x15y5[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn24_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x15__8G31x15y5[] = {
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__8G31x15y5[] = {
  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__8G31x15y5[] = {
  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__8G31x15y5[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x15y5[] = {
  {&(_ZTV8G31x15y5[7]),  7,29},
  {&(_ZTV8G31x15y5[14]),  14,29},
  {&(_ZTV8G31x15y5[20]),  20,29},
  {&(_ZTV8G31x15y5[24]),  24,29},
  {&(_ZTV8G31x15y5[28]),  28,29},
  {&(_tg__ZTV6E31x15__8G31x15y5[6]),  6,7},
  {&(_tg__ZTV3C31__6E31x15__8G31x15y5[5]),  5,6},
  {&(_tg__ZTV2A1__6E31x15__8G31x15y5[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x15__8G31x15y5[3]),  3,4},
  {&(_tg__ZTV3C31__8G31x15y5[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__8G31x15y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__8G31x15y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x15y5[];
extern  VTBL_ENTRY _ZTV8G31x15y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x15y5[];
static VTBL_ENTRY alt_thunk_names761[] = {
  (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,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn24_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn16_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn24_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn16_N6E31x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn8_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn8_N6E31x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x15y5 = {  "G31x15y5", // class name
  bases_G31x15y5, 6,
  &(vtc_G31x15y5[0]), // expected_vtbl_contents
  &(vtt_G31x15y5[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI8G31x15y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x15y5),29, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x15y5),12, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names761,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x15y6  : E31x15 , virtual F0 {
  int ff;
  ~G31x15y6(); // tgen
  G31x15y6(); // tgen
};
//SIG(1 G31x15y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G31x15y6 ::~G31x15y6(){ note_dtor("G31x15y6", this);} // tgen
G31x15y6 ::G31x15y6(){ note_ctor("G31x15y6", this);} // tgen

static void Test_G31x15y6()
{
  extern Class_Descriptor cd_G31x15y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x15y6, buf);
    G31x15y6 *dp, &lv = *(dp=new (buf) G31x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x15y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x15y6)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(32,20), "G31x15y6");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(48,28), "G31x15y6");
    check_base_class_offset(lv, (C31*)(E31x15*), ABISELECT(16,12), "G31x15y6");
    check_base_class_offset(lv, (D0*)(E31x15*), ABISELECT(60,36), "G31x15y6");
    check_base_class_offset(lv, (E31x15*), 0, "G31x15y6");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G31x15y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x15y6.ff");
    test_class_info(&lv, &cd_G31x15y6);
    dp->~G31x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x15y6(Test_G31x15y6, "G31x15y6", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN8G31x15y6C1Ev();
extern void _ZN8G31x15y6D1Ev();
Name_Map name_map_G31x15y6[] = {
  NSPAIR(_ZN8G31x15y6C1Ev),
  NSPAIR(_ZN8G31x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x15;
extern VTBL_ENTRY _ZTI6E31x15[];
extern  VTBL_ENTRY _ZTV6E31x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x15y6[] = {
  // 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)
    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
    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(16,12), //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(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_E31x15,    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 _ZTI8G31x15y6[];
extern void _ZN6E31x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv)();
extern void ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn12_N6E31x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn20_N6E31x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn28_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x15y6[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x15y6[0]),
  (VTBL_ENTRY)&_ZN6E31x153fooEv,
  ABISELECT(-16,-12),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI8G31x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI8G31x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI8G31x15y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern VTBL_ENTRY _ZTV8G31x15y6[];
extern void _ZN6E31x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x15__8G31x15y6[] = {
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&_ZN6E31x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv)();
extern void ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn12_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C31__6E31x15__8G31x15y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn20_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x15__8G31x15y6[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn28_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x15__8G31x15y6[] = {
  ABISELECT(-48,-28),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__8G31x15y6[] = {
  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__8G31x15y6[] = {
  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__8G31x15y6[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x15y6[] = {
  {&(_ZTV8G31x15y6[7]),  7,22},
  {&(_tg__ZTV6E31x15__8G31x15y6[6]),  6,7},
  {&(_tg__ZTV3C31__6E31x15__8G31x15y6[5]),  5,6},
  {&(_tg__ZTV2A1__6E31x15__8G31x15y6[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x15__8G31x15y6[3]),  3,4},
  {&(_ZTV8G31x15y6[13]),  13,22},
  {&(_ZTV8G31x15y6[17]),  17,22},
  {&(_ZTV8G31x15y6[21]),  21,22},
  {&(_tg__ZTV3C31__8G31x15y6[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__8G31x15y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__8G31x15y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x15y6[];
extern  VTBL_ENTRY _ZTV8G31x15y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x15y6[];
static VTBL_ENTRY alt_thunk_names762[] = {
  (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,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn28_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn20_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn28_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn20_N6E31x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn12_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn12_N6E31x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x15y6 = {  "G31x15y6", // class name
  bases_G31x15y6, 6,
  &(vtc_G31x15y6[0]), // expected_vtbl_contents
  &(vtt_G31x15y6[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI8G31x15y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x15y6),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x15y6),11, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names762,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x15y7  : virtual E31x15 , virtual F0 {
  int ff;
  ~G31x15y7(); // tgen
  G31x15y7(); // tgen
};
//SIG(1 G31x15y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} v1 Fi} VBC7{ Fi} Fi}


G31x15y7 ::~G31x15y7(){ note_dtor("G31x15y7", this);} // tgen
G31x15y7 ::G31x15y7(){ note_ctor("G31x15y7", this);} // tgen

static void Test_G31x15y7()
{
  extern Class_Descriptor cd_G31x15y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G31x15y7, buf);
    G31x15y7 *dp, &lv = *(dp=new (buf) G31x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G31x15y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x15y7)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,24), "G31x15y7");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,32), "G31x15y7");
    check_base_class_offset(lv, (C31*)(E31x15*), ABISELECT(32,16), "G31x15y7");
    check_base_class_offset(lv, (D0*)(E31x15*), ABISELECT(76,40), "G31x15y7");
    check_base_class_offset(lv, (E31x15*), ABISELECT(16,8), "G31x15y7");
    check_base_class_offset(lv, (F0*), ABISELECT(80,44), "G31x15y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G31x15y7.ff");
    test_class_info(&lv, &cd_G31x15y7);
    dp->~G31x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x15y7(Test_G31x15y7, "G31x15y7", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN8G31x15y7C1Ev();
extern void _ZN8G31x15y7D1Ev();
Name_Map name_map_G31x15y7[] = {
  NSPAIR(_ZN8G31x15y7C1Ev),
  NSPAIR(_ZN8G31x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern 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_E31x15;
extern VTBL_ENTRY _ZTI6E31x15[];
extern  VTBL_ENTRY _ZTV6E31x15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6E31x15[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x15y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,24), //bcp->offset
    22, //bcp->virtual_function_table_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
    26, //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
    16, //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_E31x15,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    7, //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 _ZTI8G31x15y7[];
extern void _ZN6E31x153fooEv();
extern void ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv)();
extern void ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn8_N6E31x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn16_N6E31x153fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn24_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x15y7[] = {
  ABISELECT(80,44),
  ABISELECT(76,40),
  ABISELECT(64,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI8G31x15y7[0]),
  0,
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI8G31x15y7[0]),
  (VTBL_ENTRY)&_ZN6E31x153fooEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI8G31x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI8G31x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-64,-32),
  (VTBL_ENTRY)&(_ZTI8G31x15y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern VTBL_ENTRY _ZTV8G31x15y7[];
extern void _ZN6E31x153fooEv();
static  VTBL_ENTRY _tg__ZTV6E31x15__8G31x15y7[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&_ZN6E31x153fooEv,
};
extern void ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv)();
extern void ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn8_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV3C31__6E31x15__8G31x15y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn16_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__6E31x15__8G31x15y7[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv)();
extern void ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn24_N6E31x153fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__6E31x15__8G31x15y7[] = {
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI6E31x15[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__8G31x15y7[] = {
  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__8G31x15y7[] = {
  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__8G31x15y7[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x15y7[] = {
  {&(_ZTV8G31x15y7[8]),  8,30},
  {&(_ZTV8G31x15y7[15]),  15,30},
  {&(_ZTV8G31x15y7[21]),  21,30},
  {&(_ZTV8G31x15y7[25]),  25,30},
  {&(_ZTV8G31x15y7[29]),  29,30},
  {&(_tg__ZTV6E31x15__8G31x15y7[6]),  6,7},
  {&(_tg__ZTV3C31__6E31x15__8G31x15y7[5]),  5,6},
  {&(_tg__ZTV2A1__6E31x15__8G31x15y7[3]),  3,4},
  {&(_tg__ZTV2B1__6E31x15__8G31x15y7[3]),  3,4},
  {&(_tg__ZTV3C31__8G31x15y7[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__8G31x15y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__8G31x15y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI8G31x15y7[];
extern  VTBL_ENTRY _ZTV8G31x15y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT8G31x15y7[];
static VTBL_ENTRY alt_thunk_names763[] = {
  (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,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6E31x153fooEv,_ZTv0_n12_N6E31x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn24_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn16_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N6E31x153fooEv,_ZThn24_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6E31x153fooEv,_ZThn16_N6E31x153fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6E31x153fooEv,_ZTv0_n20_N6E31x153fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn8_N6E31x153fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6E31x153fooEv,_ZThn8_N6E31x153fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x15y7 = {  "G31x15y7", // class name
  bases_G31x15y7, 6,
  &(vtc_G31x15y7[0]), // expected_vtbl_contents
  &(vtt_G31x15y7[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI8G31x15y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV8G31x15y7),30, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT8G31x15y7),12, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names763,
};
#endif // __cplusplus

//============================================================================

